support mock data (#67)
* feat:support generate mock sql * feat: update frontend resources * feat: update readme * fix: check failed
This commit is contained in:
parent
30765be4d4
commit
e4428a3890
|
@ -16,7 +16,7 @@
|
|||
## 特性
|
||||
|
||||
1. 兼容市面多数数据库:支持所有拥有 JDBC 驱动的数据库,mysql、postgresql 开箱即用
|
||||
2. 丰富的文档管理功能:支持文档自动同步,版本历史回溯,版本差异对比,文档讨论,UML 生成, 文档导出等,应有尽有
|
||||
2. 丰富的文档管理功能:支持文档自动同步,版本历史回溯,版本差异对比,文档讨论,UML 生成, 文档导出,数据 SQL 生成等,应有尽有
|
||||
3. 面向团队的专业能力:扁平化的角色管理,支持 Github \ Github Enterprise \ Gitlab 的 OAuth2 登录,日志审计
|
||||
|
||||
更多内容请到 https://doc.databasir.com 查看
|
||||
|
|
|
@ -2,10 +2,7 @@ package com.databasir.api;
|
|||
|
||||
import com.databasir.common.JsonData;
|
||||
import com.databasir.core.diff.data.RootDiff;
|
||||
import com.databasir.core.domain.document.data.DatabaseDocumentResponse;
|
||||
import com.databasir.core.domain.document.data.DatabaseDocumentSimpleResponse;
|
||||
import com.databasir.core.domain.document.data.DatabaseDocumentVersionResponse;
|
||||
import com.databasir.core.domain.document.data.TableDocumentResponse;
|
||||
import com.databasir.core.domain.document.data.*;
|
||||
import com.databasir.core.domain.document.generator.DocumentFileType;
|
||||
import com.databasir.core.domain.document.service.DocumentService;
|
||||
import com.databasir.core.domain.log.annotation.Operation;
|
||||
|
@ -94,4 +91,9 @@ public class DocumentController {
|
|||
return JsonData.ok(documentService.getTableDetails(projectId, documentId, tableIds));
|
||||
}
|
||||
|
||||
@GetMapping(Routes.Document.LIST_TABLES)
|
||||
public JsonData<List<TableResponse>> listTables(@PathVariable Integer projectId,
|
||||
@RequestParam(required = false) Long version) {
|
||||
return JsonData.ok(documentService.getTableAndColumns(projectId, version));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,49 @@
|
|||
package com.databasir.api;
|
||||
|
||||
import com.databasir.common.JsonData;
|
||||
import com.databasir.core.domain.mock.MockDataService;
|
||||
import com.databasir.core.domain.mock.data.ColumnMockRuleSaveRequest;
|
||||
import com.databasir.core.domain.mock.data.MockDataGenerateCondition;
|
||||
import com.databasir.core.domain.mock.data.MockDataRuleListCondition;
|
||||
import com.databasir.core.domain.mock.data.MockDataRuleResponse;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.security.access.prepost.PreAuthorize;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.validation.Valid;
|
||||
import java.util.List;
|
||||
|
||||
@RestController
|
||||
@RequiredArgsConstructor
|
||||
@Validated
|
||||
public class MockDataController {
|
||||
|
||||
private final MockDataService mockDataService;
|
||||
|
||||
@GetMapping(Routes.MockData.GET_SQL_MOCK_DATA)
|
||||
public JsonData<String> getMockSql(@PathVariable("groupId") Integer groupId,
|
||||
@PathVariable("projectId") Integer projectId,
|
||||
@Valid MockDataGenerateCondition condition) {
|
||||
String sql = mockDataService.generateMockInsertSql(projectId, condition);
|
||||
return JsonData.ok(sql);
|
||||
}
|
||||
|
||||
@GetMapping(Routes.MockData.GET_MOCK_RULE)
|
||||
public JsonData<List<MockDataRuleResponse>> getMockRules(@PathVariable("groupId") Integer groupId,
|
||||
@PathVariable("projectId") Integer projectId,
|
||||
@Valid MockDataRuleListCondition condition) {
|
||||
List<MockDataRuleResponse> rules = mockDataService.listRules(projectId, condition);
|
||||
return JsonData.ok(rules);
|
||||
}
|
||||
|
||||
@PostMapping(Routes.MockData.SAVE_MOCK_RULE)
|
||||
@PreAuthorize("hasAnyAuthority('SYS_OWNER', 'GROUP_OWNER?groupId='+#groupId, 'GROUP_MEMBER?groupId='+#groupId)")
|
||||
public JsonData<Void> saveMockRules(@PathVariable Integer groupId,
|
||||
@PathVariable Integer projectId,
|
||||
@PathVariable Integer tableId,
|
||||
@RequestBody @Valid List<ColumnMockRuleSaveRequest> rules) {
|
||||
mockDataService.saveMockRules(projectId, tableId, rules);
|
||||
return JsonData.ok();
|
||||
}
|
||||
}
|
|
@ -85,6 +85,8 @@ public interface Routes {
|
|||
String DIFF = BASE + "/projects/{projectId}/diff_documents";
|
||||
|
||||
String EXPORT = BASE + "/projects/{projectId}/document_files";
|
||||
|
||||
String LIST_TABLES = BASE + "/projects/{projectId}/tables";
|
||||
}
|
||||
|
||||
interface DocumentDiscussion {
|
||||
|
@ -160,4 +162,14 @@ public interface Routes {
|
|||
|
||||
String CREATE = BASE + "/database_types";
|
||||
}
|
||||
|
||||
interface MockData {
|
||||
|
||||
String SAVE_MOCK_RULE = BASE + "/groups/{groupId}/projects/{projectId}/tables/{tableId}/mock_rules";
|
||||
|
||||
String GET_MOCK_RULE = BASE + "/groups/{groupId}/projects/{projectId}/mock_rules";
|
||||
|
||||
String GET_SQL_MOCK_DATA = BASE + "/groups/{groupId}/projects/{projectId}/mock_data/sql";
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,20 @@
|
|||
@-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}.copy-button{color:#fff}.copy-button,.copy-button:hover{position:absolute;right:12px;top:12px}.copy-button:hover{color:#67c23a}pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px;min-height:100px}/*!
|
||||
Theme: Agate
|
||||
Author: (c) Taufik Nurrohman <hi@taufik-nurrohman.com>
|
||||
Maintainer: @taufik-nurrohman
|
||||
Updated: 2021-04-24
|
||||
|
||||
#333
|
||||
#62c8f3
|
||||
#7bd694
|
||||
#888
|
||||
#a2fca2
|
||||
#ade5fc
|
||||
#b8d8a2
|
||||
#c6b4f0
|
||||
#d36363
|
||||
#fc9b9b
|
||||
#fcc28c
|
||||
#ffa
|
||||
#fff
|
||||
*/.hljs{background:#333;color:#fff}.hljs-doctag,.hljs-meta-keyword,.hljs-name,.hljs-strong{font-weight:700}.hljs-code,.hljs-emphasis{font-style:italic}.hljs-section,.hljs-tag{color:#62c8f3}.hljs-selector-class,.hljs-selector-id,.hljs-template-variable,.hljs-variable{color:#ade5fc}.hljs-meta-string,.hljs-string{color:#a2fca2}.hljs-attr,.hljs-quote,.hljs-selector-attr{color:#7bd694}.hljs-tag .hljs-attr{color:inherit}.hljs-attribute,.hljs-title,.hljs-type{color:#ffa}.hljs-number,.hljs-symbol{color:#d36363}.hljs-bullet,.hljs-template-tag{color:#b8d8a2}.hljs-built_in,.hljs-keyword,.hljs-literal,.hljs-selector-tag{color:#fcc28c}.hljs-code,.hljs-comment,.hljs-formula{color:#888}.hljs-link,.hljs-regexp,.hljs-selector-pseudo{color:#c6b4f0}.hljs-meta{color:#fc9b9b}.hljs-deletion{background:#fc9b9b;color:#333}.hljs-addition{background:#a2fca2;color:#333}.hljs-subst{color:#fff}.hljs a{color:inherit}.hljs a:focus,.hljs a:hover{color:inherit;text-decoration:underline}.hljs mark{background:#555;color:inherit}.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}
|
|
@ -1 +0,0 @@
|
|||
@-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}
|
|
@ -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.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>
|
||||
<!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.34b8254e.js"></script><script defer="defer" type="module" src="/js/app.969627b4.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.ca7b1117.js" nomodule></script><script defer="defer" src="/js/app-legacy.26c8cf98.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>
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -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}}]);
|
||||
//# sourceMappingURL=243-legacy.8e2218d7.js.map
|
||||
//# sourceMappingURL=243-legacy.92016c20.js.map
|
File diff suppressed because one or more lines are too long
|
@ -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}}]);
|
||||
//# sourceMappingURL=243.d82073b3.js.map
|
||||
//# sourceMappingURL=243.e2c9f564.js.map
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -1,2 +1,2 @@
|
|||
"use strict";(self["webpackChunkdatabasir"]=self["webpackChunkdatabasir"]||[]).push([[865],{8865:function(t,n,e){e.r(n),e.d(n,{default:function(){return f}});var i=e(6252),a=e(9963),r=(0,i.Uk)("立即跳转");function o(t,n,e,o,u,l){var s=(0,i.up)("el-button"),c=(0,i.up)("el-result"),d=(0,i.up)("el-main"),f=(0,i.up)("el-container"),g=(0,i.Q2)("loading");return(0,i.wg)(),(0,i.j4)(f,null,{default:(0,i.w5)((function(){return[(0,i.wy)(((0,i.wg)(),(0,i.j4)(d,{class:"login-main"},{default:(0,i.w5)((function(){return[(0,i.wy)((0,i.Wm)(c,{icon:u.icon,title:u.title,"sub-title":u.subTitle},{extra:(0,i.w5)((function(){return[(0,i.Wm)(s,{type:"primary",onClick:n[0]||(n[0]=function(t){return l.toIndexPage()})},{default:(0,i.w5)((function(){return[r]})),_:1})]})),_:1},8,["icon","title","sub-title"]),[[a.F8,!u.loading]])]})),_:1})),[[g,u.loading]])]})),_:1})}var u=e(152),l=e(1836),s={data:function(){return{registrationId:null,icon:"",title:"",subTitle:"",loading:!0}},created:function(){this.registrationId=this.$route.params.id,this.login()},methods:{login:function(){var t=this,n=window.location.href,e=this.$route.query;e.redirect_uri=n,(0,u.rd)(this.registrationId,e).then((function(n){n.errCode?(t.title=n.errMessage,t.icon="error"):(l.E.saveUserLoginData(n.data),t.$store.commit("userUpdate",{nickname:n.data.nickname,username:n.data.username,email:n.data.email,avatar:n.data.avatar}),t.icon="success",t.$router.push({path:"/groups"})),t.loading=!1})).catch((function(n){console.log("login failed: "+n),t.icon="error",t.title="登陆失败,请重试",t.loading=!1}))},toIndexPage:function(){this.$router.push({path:"/"})}}},c=e(3744);const d=(0,c.Z)(s,[["render",o]]);var f=d}}]);
|
||||
//# sourceMappingURL=865-legacy.95ef57b0.js.map
|
||||
//# sourceMappingURL=865-legacy.55e3080f.js.map
|
|
@ -1 +1 @@
|
|||
{"version":3,"file":"js/865-legacy.95ef57b0.js","mappings":"iMAUiE,Q,qKAT7DA,EAAAA,EAAAA,IAaeC,EAAA,M,kBAZX,iBAWU,uBAXVD,EAAAA,EAAAA,IAWUE,EAAA,CAXmBC,MAAM,cAAY,C,kBAC3C,iBASY,WATZC,EAAAA,EAAAA,IASYC,EAAA,CARPC,KAAMC,EAAAA,KACNC,MAAOD,EAAAA,MACP,YAAWA,EAAAA,UAHhB,CAMeE,OAAK,SAChB,iBAAiE,EAAjEL,EAAAA,EAAAA,IAAiEM,EAAA,CAAtDC,KAAK,UAAWC,QAAK,+BAAEC,EAAAA,iBAAlC,C,kBAAiD,iBAAI,O,eAPzD,wCAIaN,EAAAA,e,OALjB,IAAoBA,EAAAA,e,6BA2B5B,GACIO,KADW,WAEP,MAAO,CACHC,eAAgB,KAChBT,KAAM,GACNE,MAAO,GACPQ,SAAU,GACVC,SAAS,IAIjBC,QAXW,WAYPC,KAAKJ,eAAiBI,KAAKC,OAAOC,OAAOC,GACzCH,KAAKI,SAGTC,QAAS,CACJD,MADI,WACI,WACCE,EAAcC,OAAOC,SAASC,KAC9BP,EAASF,KAAKC,OAAOS,MAC3BR,EAAOS,aAAeL,GACtBM,EAAAA,EAAAA,IAAYZ,KAAKJ,eAAgBM,GAAQW,MAAK,SAAAC,GACrCA,EAAKC,SAWN,EAAK1B,MAAQyB,EAAKE,WAClB,EAAK7B,KAAO,UAXZ8B,EAAAA,EAAAA,kBAAuBH,EAAKnB,MAC5B,EAAKuB,OAAOC,OAAO,aAAc,CAC7BC,SAAUN,EAAKnB,KAAKyB,SACpBC,SAAUP,EAAKnB,KAAK0B,SACpBC,MAAOR,EAAKnB,KAAK2B,MACjBC,OAAQT,EAAKnB,KAAK4B,SAEtB,EAAKpC,KAAK,UACV,EAAKqC,QAAQC,KAAK,CAACC,KAAM,aAK7B,EAAK5B,SAAU,KAChB6B,OAAM,SAAAC,GACLC,QAAQC,IAAI,iBAAiBF,GAC7B,EAAKzC,KAAO,QACZ,EAAKE,MAAQ,WACb,EAAKS,SAAU,MAIvBiC,YA7BK,WA8BD/B,KAAKwB,QAAQC,KAAK,CAACC,KAAM,S,UCpErC,MAAMM,GAA2B,OAAgB,EAAQ,CAAC,CAAC,SAASC,KAEpE","sources":["webpack://databasir/./src/views/OAuth2Login.vue","webpack://databasir/./src/views/OAuth2Login.vue?b6ea"],"sourcesContent":["<template>\r\n <el-container>\r\n <el-main v-loading=\"loading\" class=\"login-main\">\r\n <el-result\r\n :icon=\"icon\"\r\n :title=\"title\"\r\n :sub-title=\"subTitle\"\r\n v-show=\"!loading\"\r\n >\r\n <template #extra>\r\n <el-button type=\"primary\" @click=\"toIndexPage()\">立即跳转</el-button>\r\n </template>\r\n </el-result>\r\n </el-main>\r\n </el-container>\r\n</template>\r\n\r\n<style>\r\n.login-main {\r\n margin: 0 auto;\r\n margin-top: 200px;\r\n}\r\n\r\n</style>\r\n<script>\r\nimport { oauth2Login } from \"../api/Login\"\r\nimport { user } from \"../utils/auth\"\r\n\r\n\r\nexport default {\r\n data() {\r\n return {\r\n registrationId: null,\r\n icon: '',\r\n title: '',\r\n subTitle: '',\r\n loading: true,\r\n }\r\n },\r\n\r\n created() {\r\n this.registrationId = this.$route.params.id\r\n this.login()\r\n },\r\n\r\n methods: {\r\n login() {\r\n const redirectUri = window.location.href\r\n const params = this.$route.query\r\n params.redirect_uri = redirectUri\r\n oauth2Login(this.registrationId, params).then(resp => {\r\n if (!resp.errCode) {\r\n user.saveUserLoginData(resp.data)\r\n this.$store.commit('userUpdate', {\r\n nickname: resp.data.nickname,\r\n username: resp.data.username,\r\n email: resp.data.email,\r\n avatar: resp.data.avatar\r\n })\r\n this.icon='success'\r\n this.$router.push({path: '/groups'})\r\n } else {\r\n this.title = resp.errMessage\r\n this.icon = 'error'\r\n }\r\n this.loading = false\r\n }).catch(err => {\r\n console.log('login failed: '+err)\r\n this.icon = 'error'\r\n this.title = '登陆失败,请重试'\r\n this.loading = false\r\n })\r\n },\r\n\r\n toIndexPage() {\r\n this.$router.push({path: '/'})\r\n }\r\n }\r\n}\r\n</script>","import { render } from \"./OAuth2Login.vue?vue&type=template&id=65bc9922\"\nimport script from \"./OAuth2Login.vue?vue&type=script&lang=js\"\nexport * from \"./OAuth2Login.vue?vue&type=script&lang=js\"\n\nimport \"./OAuth2Login.vue?vue&type=style&index=0&id=65bc9922&lang=css\"\n\nimport exportComponent from \"E:\\\\git_workspace\\\\databasir-frontend\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__"],"names":["_createBlock","_component_el_container","_component_el_main","class","_createVNode","_component_el_result","icon","$data","title","extra","_component_el_button","type","onClick","$options","data","registrationId","subTitle","loading","created","this","$route","params","id","login","methods","redirectUri","window","location","href","query","redirect_uri","oauth2Login","then","resp","errCode","errMessage","user","$store","commit","nickname","username","email","avatar","$router","push","path","catch","err","console","log","toIndexPage","__exports__","render"],"sourceRoot":""}
|
||||
{"version":3,"file":"js/865-legacy.55e3080f.js","mappings":"iMAUiE,Q,qKAT7DA,EAAAA,EAAAA,IAaeC,EAAA,M,kBAZX,iBAWU,uBAXVD,EAAAA,EAAAA,IAWUE,EAAA,CAXmBC,MAAM,cAAY,C,kBAC3C,iBASY,WATZC,EAAAA,EAAAA,IASYC,EAAA,CARPC,KAAMC,EAAAA,KACNC,MAAOD,EAAAA,MACP,YAAWA,EAAAA,UAHhB,CAMeE,OAAK,SAChB,iBAAiE,EAAjEL,EAAAA,EAAAA,IAAiEM,EAAA,CAAtDC,KAAK,UAAWC,QAAK,+BAAEC,EAAAA,iBAAlC,C,kBAAiD,iBAAI,O,eAPzD,wCAIaN,EAAAA,e,OALjB,IAAoBA,EAAAA,e,6BA2B5B,GACIO,KADW,WAEP,MAAO,CACHC,eAAgB,KAChBT,KAAM,GACNE,MAAO,GACPQ,SAAU,GACVC,SAAS,IAIjBC,QAXW,WAYPC,KAAKJ,eAAiBI,KAAKC,OAAOC,OAAOC,GACzCH,KAAKI,SAGTC,QAAS,CACJD,MADI,WACI,WACCE,EAAcC,OAAOC,SAASC,KAC9BP,EAASF,KAAKC,OAAOS,MAC3BR,EAAOS,aAAeL,GACtBM,EAAAA,EAAAA,IAAYZ,KAAKJ,eAAgBM,GAAQW,MAAK,SAAAC,GACrCA,EAAKC,SAWN,EAAK1B,MAAQyB,EAAKE,WAClB,EAAK7B,KAAO,UAXZ8B,EAAAA,EAAAA,kBAAuBH,EAAKnB,MAC5B,EAAKuB,OAAOC,OAAO,aAAc,CAC7BC,SAAUN,EAAKnB,KAAKyB,SACpBC,SAAUP,EAAKnB,KAAK0B,SACpBC,MAAOR,EAAKnB,KAAK2B,MACjBC,OAAQT,EAAKnB,KAAK4B,SAEtB,EAAKpC,KAAK,UACV,EAAKqC,QAAQC,KAAK,CAACC,KAAM,aAK7B,EAAK5B,SAAU,KAChB6B,OAAM,SAAAC,GACLC,QAAQC,IAAI,iBAAiBF,GAC7B,EAAKzC,KAAO,QACZ,EAAKE,MAAQ,WACb,EAAKS,SAAU,MAIvBiC,YA7BK,WA8BD/B,KAAKwB,QAAQC,KAAK,CAACC,KAAM,S,UCpErC,MAAMM,GAA2B,OAAgB,EAAQ,CAAC,CAAC,SAASC,KAEpE","sources":["webpack://databasir/./src/views/OAuth2Login.vue","webpack://databasir/./src/views/OAuth2Login.vue?b6ea"],"sourcesContent":["<template>\r\n <el-container>\r\n <el-main v-loading=\"loading\" class=\"login-main\">\r\n <el-result\r\n :icon=\"icon\"\r\n :title=\"title\"\r\n :sub-title=\"subTitle\"\r\n v-show=\"!loading\"\r\n >\r\n <template #extra>\r\n <el-button type=\"primary\" @click=\"toIndexPage()\">立即跳转</el-button>\r\n </template>\r\n </el-result>\r\n </el-main>\r\n </el-container>\r\n</template>\r\n\r\n<style>\r\n.login-main {\r\n margin: 0 auto;\r\n margin-top: 200px;\r\n}\r\n\r\n</style>\r\n<script>\r\nimport { oauth2Login } from \"../api/Login\"\r\nimport { user } from \"../utils/auth\"\r\n\r\n\r\nexport default {\r\n data() {\r\n return {\r\n registrationId: null,\r\n icon: '',\r\n title: '',\r\n subTitle: '',\r\n loading: true,\r\n }\r\n },\r\n\r\n created() {\r\n this.registrationId = this.$route.params.id\r\n this.login()\r\n },\r\n\r\n methods: {\r\n login() {\r\n const redirectUri = window.location.href\r\n const params = this.$route.query\r\n params.redirect_uri = redirectUri\r\n oauth2Login(this.registrationId, params).then(resp => {\r\n if (!resp.errCode) {\r\n user.saveUserLoginData(resp.data)\r\n this.$store.commit('userUpdate', {\r\n nickname: resp.data.nickname,\r\n username: resp.data.username,\r\n email: resp.data.email,\r\n avatar: resp.data.avatar\r\n })\r\n this.icon='success'\r\n this.$router.push({path: '/groups'})\r\n } else {\r\n this.title = resp.errMessage\r\n this.icon = 'error'\r\n }\r\n this.loading = false\r\n }).catch(err => {\r\n console.log('login failed: '+err)\r\n this.icon = 'error'\r\n this.title = '登陆失败,请重试'\r\n this.loading = false\r\n })\r\n },\r\n\r\n toIndexPage() {\r\n this.$router.push({path: '/'})\r\n }\r\n }\r\n}\r\n</script>","import { render } from \"./OAuth2Login.vue?vue&type=template&id=65bc9922\"\nimport script from \"./OAuth2Login.vue?vue&type=script&lang=js\"\nexport * from \"./OAuth2Login.vue?vue&type=script&lang=js\"\n\nimport \"./OAuth2Login.vue?vue&type=style&index=0&id=65bc9922&lang=css\"\n\nimport exportComponent from \"E:\\\\git_workspace\\\\databasir-frontend\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__"],"names":["_createBlock","_component_el_container","_component_el_main","class","_createVNode","_component_el_result","icon","$data","title","extra","_component_el_button","type","onClick","$options","data","registrationId","subTitle","loading","created","this","$route","params","id","login","methods","redirectUri","window","location","href","query","redirect_uri","oauth2Login","then","resp","errCode","errMessage","user","$store","commit","nickname","username","email","avatar","$router","push","path","catch","err","console","log","toIndexPage","__exports__","render"],"sourceRoot":""}
|
|
@ -1,2 +1,2 @@
|
|||
"use strict";(self["webpackChunkdatabasir"]=self["webpackChunkdatabasir"]||[]).push([[865],{8865:function(t,e,i){i.r(e),i.d(e,{default:function(){return h}});var a=i(6252),r=i(9963);const n=(0,a.Uk)("立即跳转");function s(t,e,i,s,o,l){const u=(0,a.up)("el-button"),d=(0,a.up)("el-result"),c=(0,a.up)("el-main"),h=(0,a.up)("el-container"),g=(0,a.Q2)("loading");return(0,a.wg)(),(0,a.j4)(h,null,{default:(0,a.w5)((()=>[(0,a.wy)(((0,a.wg)(),(0,a.j4)(c,{class:"login-main"},{default:(0,a.w5)((()=>[(0,a.wy)((0,a.Wm)(d,{icon:o.icon,title:o.title,"sub-title":o.subTitle},{extra:(0,a.w5)((()=>[(0,a.Wm)(u,{type:"primary",onClick:e[0]||(e[0]=t=>l.toIndexPage())},{default:(0,a.w5)((()=>[n])),_:1})])),_:1},8,["icon","title","sub-title"]),[[r.F8,!o.loading]])])),_:1})),[[g,o.loading]])])),_:1})}var o=i(152),l=i(1836),u={data(){return{registrationId:null,icon:"",title:"",subTitle:"",loading:!0}},created(){this.registrationId=this.$route.params.id,this.login()},methods:{login(){const t=window.location.href,e=this.$route.query;e.redirect_uri=t,(0,o.rd)(this.registrationId,e).then((t=>{t.errCode?(this.title=t.errMessage,this.icon="error"):(l.E.saveUserLoginData(t.data),this.$store.commit("userUpdate",{nickname:t.data.nickname,username:t.data.username,email:t.data.email,avatar:t.data.avatar}),this.icon="success",this.$router.push({path:"/groups"})),this.loading=!1})).catch((t=>{console.log("login failed: "+t),this.icon="error",this.title="登陆失败,请重试",this.loading=!1}))},toIndexPage(){this.$router.push({path:"/"})}}},d=i(3744);const c=(0,d.Z)(u,[["render",s]]);var h=c}}]);
|
||||
//# sourceMappingURL=865.8a397b0a.js.map
|
||||
//# sourceMappingURL=865.4a2f905b.js.map
|
|
@ -1 +1 @@
|
|||
{"version":3,"file":"js/865.8a397b0a.js","mappings":"uMAUiE,Q,uKAT7DA,EAAAA,EAAAA,IAaeC,EAAA,M,kBAZX,IAWU,uBAXVD,EAAAA,EAAAA,IAWUE,EAAA,CAXmBC,MAAM,cAAY,C,kBAC3C,IASY,WATZC,EAAAA,EAAAA,IASYC,EAAA,CARPC,KAAMC,EAAAA,KACNC,MAAOD,EAAAA,MACP,YAAWA,EAAAA,UAHhB,CAMeE,OAAK,SAChB,IAAiE,EAAjEL,EAAAA,EAAAA,IAAiEM,EAAA,CAAtDC,KAAK,UAAWC,QAAK,eAAEC,EAAAA,gBAAlC,C,kBAAiD,IAAI,M,cAPzD,wCAIaN,EAAAA,c,OALjB,IAAoBA,EAAAA,c,6BA2B5B,GACIO,OACI,MAAO,CACHC,eAAgB,KAChBT,KAAM,GACNE,MAAO,GACPQ,SAAU,GACVC,SAAS,IAIjBC,UACIC,KAAKJ,eAAiBI,KAAKC,OAAOC,OAAOC,GACzCH,KAAKI,SAGTC,QAAS,CACJD,QACG,MAAME,EAAcC,OAAOC,SAASC,KAC9BP,EAASF,KAAKC,OAAOS,MAC3BR,EAAOS,aAAeL,GACtBM,EAAAA,EAAAA,IAAYZ,KAAKJ,eAAgBM,GAAQW,MAAKC,IACrCA,EAAKC,SAWNf,KAAKX,MAAQyB,EAAKE,WAClBhB,KAAKb,KAAO,UAXZ8B,EAAAA,EAAAA,kBAAuBH,EAAKnB,MAC5BK,KAAKkB,OAAOC,OAAO,aAAc,CAC7BC,SAAUN,EAAKnB,KAAKyB,SACpBC,SAAUP,EAAKnB,KAAK0B,SACpBC,MAAOR,EAAKnB,KAAK2B,MACjBC,OAAQT,EAAKnB,KAAK4B,SAEtBvB,KAAKb,KAAK,UACVa,KAAKwB,QAAQC,KAAK,CAACC,KAAM,aAK7B1B,KAAKF,SAAU,KAChB6B,OAAMC,IACLC,QAAQC,IAAI,iBAAiBF,GAC7B5B,KAAKb,KAAO,QACZa,KAAKX,MAAQ,WACbW,KAAKF,SAAU,MAIvBiC,cACI/B,KAAKwB,QAAQC,KAAK,CAACC,KAAM,S,UCpErC,MAAMM,GAA2B,OAAgB,EAAQ,CAAC,CAAC,SAASC,KAEpE","sources":["webpack://databasir/./src/views/OAuth2Login.vue","webpack://databasir/./src/views/OAuth2Login.vue?b6ea"],"sourcesContent":["<template>\r\n <el-container>\r\n <el-main v-loading=\"loading\" class=\"login-main\">\r\n <el-result\r\n :icon=\"icon\"\r\n :title=\"title\"\r\n :sub-title=\"subTitle\"\r\n v-show=\"!loading\"\r\n >\r\n <template #extra>\r\n <el-button type=\"primary\" @click=\"toIndexPage()\">立即跳转</el-button>\r\n </template>\r\n </el-result>\r\n </el-main>\r\n </el-container>\r\n</template>\r\n\r\n<style>\r\n.login-main {\r\n margin: 0 auto;\r\n margin-top: 200px;\r\n}\r\n\r\n</style>\r\n<script>\r\nimport { oauth2Login } from \"../api/Login\"\r\nimport { user } from \"../utils/auth\"\r\n\r\n\r\nexport default {\r\n data() {\r\n return {\r\n registrationId: null,\r\n icon: '',\r\n title: '',\r\n subTitle: '',\r\n loading: true,\r\n }\r\n },\r\n\r\n created() {\r\n this.registrationId = this.$route.params.id\r\n this.login()\r\n },\r\n\r\n methods: {\r\n login() {\r\n const redirectUri = window.location.href\r\n const params = this.$route.query\r\n params.redirect_uri = redirectUri\r\n oauth2Login(this.registrationId, params).then(resp => {\r\n if (!resp.errCode) {\r\n user.saveUserLoginData(resp.data)\r\n this.$store.commit('userUpdate', {\r\n nickname: resp.data.nickname,\r\n username: resp.data.username,\r\n email: resp.data.email,\r\n avatar: resp.data.avatar\r\n })\r\n this.icon='success'\r\n this.$router.push({path: '/groups'})\r\n } else {\r\n this.title = resp.errMessage\r\n this.icon = 'error'\r\n }\r\n this.loading = false\r\n }).catch(err => {\r\n console.log('login failed: '+err)\r\n this.icon = 'error'\r\n this.title = '登陆失败,请重试'\r\n this.loading = false\r\n })\r\n },\r\n\r\n toIndexPage() {\r\n this.$router.push({path: '/'})\r\n }\r\n }\r\n}\r\n</script>","import { render } from \"./OAuth2Login.vue?vue&type=template&id=65bc9922\"\nimport script from \"./OAuth2Login.vue?vue&type=script&lang=js\"\nexport * from \"./OAuth2Login.vue?vue&type=script&lang=js\"\n\nimport \"./OAuth2Login.vue?vue&type=style&index=0&id=65bc9922&lang=css\"\n\nimport exportComponent from \"E:\\\\git_workspace\\\\databasir-frontend\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__"],"names":["_createBlock","_component_el_container","_component_el_main","class","_createVNode","_component_el_result","icon","$data","title","extra","_component_el_button","type","onClick","$options","data","registrationId","subTitle","loading","created","this","$route","params","id","login","methods","redirectUri","window","location","href","query","redirect_uri","oauth2Login","then","resp","errCode","errMessage","user","$store","commit","nickname","username","email","avatar","$router","push","path","catch","err","console","log","toIndexPage","__exports__","render"],"sourceRoot":""}
|
||||
{"version":3,"file":"js/865.4a2f905b.js","mappings":"uMAUiE,Q,uKAT7DA,EAAAA,EAAAA,IAaeC,EAAA,M,kBAZX,IAWU,uBAXVD,EAAAA,EAAAA,IAWUE,EAAA,CAXmBC,MAAM,cAAY,C,kBAC3C,IASY,WATZC,EAAAA,EAAAA,IASYC,EAAA,CARPC,KAAMC,EAAAA,KACNC,MAAOD,EAAAA,MACP,YAAWA,EAAAA,UAHhB,CAMeE,OAAK,SAChB,IAAiE,EAAjEL,EAAAA,EAAAA,IAAiEM,EAAA,CAAtDC,KAAK,UAAWC,QAAK,eAAEC,EAAAA,gBAAlC,C,kBAAiD,IAAI,M,cAPzD,wCAIaN,EAAAA,c,OALjB,IAAoBA,EAAAA,c,6BA2B5B,GACIO,OACI,MAAO,CACHC,eAAgB,KAChBT,KAAM,GACNE,MAAO,GACPQ,SAAU,GACVC,SAAS,IAIjBC,UACIC,KAAKJ,eAAiBI,KAAKC,OAAOC,OAAOC,GACzCH,KAAKI,SAGTC,QAAS,CACJD,QACG,MAAME,EAAcC,OAAOC,SAASC,KAC9BP,EAASF,KAAKC,OAAOS,MAC3BR,EAAOS,aAAeL,GACtBM,EAAAA,EAAAA,IAAYZ,KAAKJ,eAAgBM,GAAQW,MAAKC,IACrCA,EAAKC,SAWNf,KAAKX,MAAQyB,EAAKE,WAClBhB,KAAKb,KAAO,UAXZ8B,EAAAA,EAAAA,kBAAuBH,EAAKnB,MAC5BK,KAAKkB,OAAOC,OAAO,aAAc,CAC7BC,SAAUN,EAAKnB,KAAKyB,SACpBC,SAAUP,EAAKnB,KAAK0B,SACpBC,MAAOR,EAAKnB,KAAK2B,MACjBC,OAAQT,EAAKnB,KAAK4B,SAEtBvB,KAAKb,KAAK,UACVa,KAAKwB,QAAQC,KAAK,CAACC,KAAM,aAK7B1B,KAAKF,SAAU,KAChB6B,OAAMC,IACLC,QAAQC,IAAI,iBAAiBF,GAC7B5B,KAAKb,KAAO,QACZa,KAAKX,MAAQ,WACbW,KAAKF,SAAU,MAIvBiC,cACI/B,KAAKwB,QAAQC,KAAK,CAACC,KAAM,S,UCpErC,MAAMM,GAA2B,OAAgB,EAAQ,CAAC,CAAC,SAASC,KAEpE","sources":["webpack://databasir/./src/views/OAuth2Login.vue","webpack://databasir/./src/views/OAuth2Login.vue?b6ea"],"sourcesContent":["<template>\r\n <el-container>\r\n <el-main v-loading=\"loading\" class=\"login-main\">\r\n <el-result\r\n :icon=\"icon\"\r\n :title=\"title\"\r\n :sub-title=\"subTitle\"\r\n v-show=\"!loading\"\r\n >\r\n <template #extra>\r\n <el-button type=\"primary\" @click=\"toIndexPage()\">立即跳转</el-button>\r\n </template>\r\n </el-result>\r\n </el-main>\r\n </el-container>\r\n</template>\r\n\r\n<style>\r\n.login-main {\r\n margin: 0 auto;\r\n margin-top: 200px;\r\n}\r\n\r\n</style>\r\n<script>\r\nimport { oauth2Login } from \"../api/Login\"\r\nimport { user } from \"../utils/auth\"\r\n\r\n\r\nexport default {\r\n data() {\r\n return {\r\n registrationId: null,\r\n icon: '',\r\n title: '',\r\n subTitle: '',\r\n loading: true,\r\n }\r\n },\r\n\r\n created() {\r\n this.registrationId = this.$route.params.id\r\n this.login()\r\n },\r\n\r\n methods: {\r\n login() {\r\n const redirectUri = window.location.href\r\n const params = this.$route.query\r\n params.redirect_uri = redirectUri\r\n oauth2Login(this.registrationId, params).then(resp => {\r\n if (!resp.errCode) {\r\n user.saveUserLoginData(resp.data)\r\n this.$store.commit('userUpdate', {\r\n nickname: resp.data.nickname,\r\n username: resp.data.username,\r\n email: resp.data.email,\r\n avatar: resp.data.avatar\r\n })\r\n this.icon='success'\r\n this.$router.push({path: '/groups'})\r\n } else {\r\n this.title = resp.errMessage\r\n this.icon = 'error'\r\n }\r\n this.loading = false\r\n }).catch(err => {\r\n console.log('login failed: '+err)\r\n this.icon = 'error'\r\n this.title = '登陆失败,请重试'\r\n this.loading = false\r\n })\r\n },\r\n\r\n toIndexPage() {\r\n this.$router.push({path: '/'})\r\n }\r\n }\r\n}\r\n</script>","import { render } from \"./OAuth2Login.vue?vue&type=template&id=65bc9922\"\nimport script from \"./OAuth2Login.vue?vue&type=script&lang=js\"\nexport * from \"./OAuth2Login.vue?vue&type=script&lang=js\"\n\nimport \"./OAuth2Login.vue?vue&type=style&index=0&id=65bc9922&lang=css\"\n\nimport exportComponent from \"E:\\\\git_workspace\\\\databasir-frontend\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__"],"names":["_createBlock","_component_el_container","_component_el_main","class","_createVNode","_component_el_result","icon","$data","title","extra","_component_el_button","type","onClick","$options","data","registrationId","subTitle","loading","created","this","$route","params","id","login","methods","redirectUri","window","location","href","query","redirect_uri","oauth2Login","then","resp","errCode","errMessage","user","$store","commit","nickname","username","email","avatar","$router","push","path","catch","err","console","log","toIndexPage","__exports__","render"],"sourceRoot":""}
|
|
@ -1,2 +1,2 @@
|
|||
"use strict";(self["webpackChunkdatabasir"]=self["webpackChunkdatabasir"]||[]).push([[99],{5430:function(e,t,a){a.d(t,{v:function(){return r}});var n=a(3872),o="/api/v1.0/operation_logs",r=function(e){return n.Z.get(o,{params:e})}},2099:function(e,t,a){a.r(t),a.d(t,{default:function(){return h}});a(8309);var n=a(6252),o=a(3577),r={key:0},u=(0,n.Uk)("成功"),l={key:1},i=(0,n.Uk)("失败"),p={key:0},c={key:1},g={key:1},s={key:1},d={key:1};function f(e,t,a,f,w,m){var P=(0,n.up)("el-table-column"),j=(0,n.up)("el-option"),h=(0,n.up)("el-select"),v=(0,n.up)("el-tag"),y=(0,n.up)("el-link"),b=(0,n.up)("el-table"),k=(0,n.up)("el-main"),L=(0,n.up)("el-pagination"),O=(0,n.up)("el-footer"),D=(0,n.up)("el-container");return(0,n.wg)(),(0,n.j4)(D,null,{default:(0,n.w5)((function(){return[(0,n.Wm)(k,null,{default:(0,n.w5)((function(){return[(0,n.Wm)(b,{data:w.projectOperationLogPageData.data},{default:(0,n.w5)((function(){return[(0,n.Wm)(P,{prop:"id",label:""}),(0,n.Wm)(P,{prop:"operationModule",label:"系统模块"}),(0,n.Wm)(P,{prop:"operatorNickname",label:"操作人"}),(0,n.Wm)(P,{prop:"operationName",label:"操作"}),(0,n.Wm)(P,{label:"状态"},{header:(0,n.w5)((function(){return[(0,n.Wm)(h,{modelValue:w.projectOperationLogPageQuery.isSuccess,"onUpdate:modelValue":t[0]||(t[0]=function(e){return w.projectOperationLogPageQuery.isSuccess=e}),placeholder:"状态",onChange:m.onQuery,clearable:"",size:"small","tag-type":"success"},{default:(0,n.w5)((function(){return[((0,n.wg)(),(0,n.iD)(n.HY,null,(0,n.Ko)([!0,!1],(function(e){return(0,n.Wm)(j,{key:e,label:e?"成功":"失败",value:e},null,8,["label","value"])})),64))]})),_:1},8,["modelValue","onChange"])]})),default:(0,n.w5)((function(e){return[e.row.isSuccess?((0,n.wg)(),(0,n.iD)("span",r,[(0,n.Wm)(v,{type:"success"},{default:(0,n.w5)((function(){return[u]})),_:1})])):((0,n.wg)(),(0,n.iD)("span",l,[(0,n.Wm)(v,{type:"danger"},{default:(0,n.w5)((function(){return[i]})),_:1})]))]})),_:1}),(0,n.Wm)(P,{label:"错误信息"},{default:(0,n.w5)((function(e){return[e.row.isSuccess?((0,n.wg)(),(0,n.iD)("span",p)):((0,n.wg)(),(0,n.iD)("span",c,(0,o.zw)(e.row.operationResponse.errMessage),1))]})),_:1}),(0,n.Wm)(P,{label:"涉及分组"},{default:(0,n.w5)((function(e){return[e.row.involvedGroup?((0,n.wg)(),(0,n.j4)(y,{key:0},{default:(0,n.w5)((function(){return[(0,n.Uk)((0,o.zw)(e.row.involvedGroup.name),1)]})),_:2},1024)):((0,n.wg)(),(0,n.iD)("span",g," - "))]})),_:1}),(0,n.Wm)(P,{label:"涉及项目"},{default:(0,n.w5)((function(e){return[e.row.involvedProject?((0,n.wg)(),(0,n.j4)(y,{key:0},{default:(0,n.w5)((function(){return[(0,n.Uk)((0,o.zw)(e.row.involvedProject.name),1)]})),_:2},1024)):((0,n.wg)(),(0,n.iD)("span",s," - "))]})),_:1}),(0,n.Wm)(P,{label:"涉及用户"},{default:(0,n.w5)((function(e){return[e.row.involvedUser?((0,n.wg)(),(0,n.j4)(y,{key:0},{default:(0,n.w5)((function(){return[(0,n.Uk)((0,o.zw)(e.row.involvedUser.nickname),1)]})),_:2},1024)):((0,n.wg)(),(0,n.iD)("span",d," - "))]})),_:1}),(0,n.Wm)(P,{prop:"createAt",label:"记录时间"})]})),_:1},8,["data"])]})),_:1}),(0,n.Wm)(O,null,{default:(0,n.w5)((function(){return[(0,n.Wm)(L,{layout:"prev, pager, next","hide-on-single-page":!1,currentPage:w.projectOperationLogPageData.number,"page-size":w.projectOperationLogPageData.size,"page-count":w.projectOperationLogPageData.totalPages,onCurrentChange:m.onProjectOperationLogCurrentPageChange},null,8,["currentPage","page-size","page-count","onCurrentChange"])]})),_:1})]})),_:1})}var w=a(5430),m={data:function(){return{projectOperationLogPageData:{data:[],number:1,size:10,totalElements:0,totalPages:1},projectOperationLogPageQuery:{page:0,size:10,isSuccess:null,involveProjectId:null,module:null}}},created:function(){this.fetchProjectOperationLogs()},methods:{fetchProjectOperationLogs:function(e){var t=this;this.projectOperationLogPageQuery.page=e?e-1:null,(0,w.v)(this.projectOperationLogPageQuery).then((function(e){e.errCode||(t.projectOperationLogPageData.data=e.data.content,t.projectOperationLogPageData.number=e.data.number+1,t.projectOperationLogPageData.size=e.data.size,t.projectOperationLogPageData.totalPages=e.data.totalPages,t.projectOperationLogPageData.totalElements=e.data.totalElements)}))},onProjectOperationLogCurrentPageChange:function(e){e&&e-1!=this.projectOperationLogPageQuery.page&&(this.projectOperationLogPageQuery.page=e-1,this.fetchProjectOperationLogs(e))},onQuery:function(){this.fetchProjectOperationLogs()}}},P=a(3744);const j=(0,P.Z)(m,[["render",f]]);var h=j}}]);
|
||||
//# sourceMappingURL=99-legacy.0cf27260.js.map
|
||||
//# sourceMappingURL=99-legacy.fcfcb9cd.js.map
|
File diff suppressed because one or more lines are too long
|
@ -1,2 +1,2 @@
|
|||
"use strict";(self["webpackChunkdatabasir"]=self["webpackChunkdatabasir"]||[]).push([[99],{5430:function(e,a,t){t.d(a,{v:function(){return n}});var o=t(3872);const r="/api/v1.0/operation_logs",n=e=>o.Z.get(r,{params:e})},2099:function(e,a,t){t.r(a),t.d(a,{default:function(){return f}});var o=t(6252),r=t(3577);const n={key:0},l=(0,o.Uk)("成功"),p={key:1},u=(0,o.Uk)("失败"),i={key:0},g={key:1},s={key:1},c={key:1},d={key:1};function w(e,a,t,w,m,P){const h=(0,o.up)("el-table-column"),j=(0,o.up)("el-option"),f=(0,o.up)("el-select"),v=(0,o.up)("el-tag"),y=(0,o.up)("el-link"),b=(0,o.up)("el-table"),k=(0,o.up)("el-main"),L=(0,o.up)("el-pagination"),O=(0,o.up)("el-footer"),D=(0,o.up)("el-container");return(0,o.wg)(),(0,o.j4)(D,null,{default:(0,o.w5)((()=>[(0,o.Wm)(k,null,{default:(0,o.w5)((()=>[(0,o.Wm)(b,{data:m.projectOperationLogPageData.data},{default:(0,o.w5)((()=>[(0,o.Wm)(h,{prop:"id",label:""}),(0,o.Wm)(h,{prop:"operationModule",label:"系统模块"}),(0,o.Wm)(h,{prop:"operatorNickname",label:"操作人"}),(0,o.Wm)(h,{prop:"operationName",label:"操作"}),(0,o.Wm)(h,{label:"状态"},{header:(0,o.w5)((()=>[(0,o.Wm)(f,{modelValue:m.projectOperationLogPageQuery.isSuccess,"onUpdate:modelValue":a[0]||(a[0]=e=>m.projectOperationLogPageQuery.isSuccess=e),placeholder:"状态",onChange:P.onQuery,clearable:"",size:"small","tag-type":"success"},{default:(0,o.w5)((()=>[((0,o.wg)(),(0,o.iD)(o.HY,null,(0,o.Ko)([!0,!1],(e=>(0,o.Wm)(j,{key:e,label:e?"成功":"失败",value:e},null,8,["label","value"]))),64))])),_:1},8,["modelValue","onChange"])])),default:(0,o.w5)((e=>[e.row.isSuccess?((0,o.wg)(),(0,o.iD)("span",n,[(0,o.Wm)(v,{type:"success"},{default:(0,o.w5)((()=>[l])),_:1})])):((0,o.wg)(),(0,o.iD)("span",p,[(0,o.Wm)(v,{type:"danger"},{default:(0,o.w5)((()=>[u])),_:1})]))])),_:1}),(0,o.Wm)(h,{label:"错误信息"},{default:(0,o.w5)((e=>[e.row.isSuccess?((0,o.wg)(),(0,o.iD)("span",i)):((0,o.wg)(),(0,o.iD)("span",g,(0,r.zw)(e.row.operationResponse.errMessage),1))])),_:1}),(0,o.Wm)(h,{label:"涉及分组"},{default:(0,o.w5)((e=>[e.row.involvedGroup?((0,o.wg)(),(0,o.j4)(y,{key:0},{default:(0,o.w5)((()=>[(0,o.Uk)((0,r.zw)(e.row.involvedGroup.name),1)])),_:2},1024)):((0,o.wg)(),(0,o.iD)("span",s," - "))])),_:1}),(0,o.Wm)(h,{label:"涉及项目"},{default:(0,o.w5)((e=>[e.row.involvedProject?((0,o.wg)(),(0,o.j4)(y,{key:0},{default:(0,o.w5)((()=>[(0,o.Uk)((0,r.zw)(e.row.involvedProject.name),1)])),_:2},1024)):((0,o.wg)(),(0,o.iD)("span",c," - "))])),_:1}),(0,o.Wm)(h,{label:"涉及用户"},{default:(0,o.w5)((e=>[e.row.involvedUser?((0,o.wg)(),(0,o.j4)(y,{key:0},{default:(0,o.w5)((()=>[(0,o.Uk)((0,r.zw)(e.row.involvedUser.nickname),1)])),_:2},1024)):((0,o.wg)(),(0,o.iD)("span",d," - "))])),_:1}),(0,o.Wm)(h,{prop:"createAt",label:"记录时间"})])),_:1},8,["data"])])),_:1}),(0,o.Wm)(O,null,{default:(0,o.w5)((()=>[(0,o.Wm)(L,{layout:"prev, pager, next","hide-on-single-page":!1,currentPage:m.projectOperationLogPageData.number,"page-size":m.projectOperationLogPageData.size,"page-count":m.projectOperationLogPageData.totalPages,onCurrentChange:P.onProjectOperationLogCurrentPageChange},null,8,["currentPage","page-size","page-count","onCurrentChange"])])),_:1})])),_:1})}var m=t(5430),P={data(){return{projectOperationLogPageData:{data:[],number:1,size:10,totalElements:0,totalPages:1},projectOperationLogPageQuery:{page:0,size:10,isSuccess:null,involveProjectId:null,module:null}}},created(){this.fetchProjectOperationLogs()},methods:{fetchProjectOperationLogs(e){this.projectOperationLogPageQuery.page=e?e-1:null,(0,m.v)(this.projectOperationLogPageQuery).then((e=>{e.errCode||(this.projectOperationLogPageData.data=e.data.content,this.projectOperationLogPageData.number=e.data.number+1,this.projectOperationLogPageData.size=e.data.size,this.projectOperationLogPageData.totalPages=e.data.totalPages,this.projectOperationLogPageData.totalElements=e.data.totalElements)}))},onProjectOperationLogCurrentPageChange(e){e&&e-1!=this.projectOperationLogPageQuery.page&&(this.projectOperationLogPageQuery.page=e-1,this.fetchProjectOperationLogs(e))},onQuery(){this.fetchProjectOperationLogs()}}},h=t(3744);const j=(0,h.Z)(P,[["render",w]]);var f=j}}]);
|
||||
//# sourceMappingURL=99.810cec85.js.map
|
||||
//# sourceMappingURL=99.e2e8211b.js.map
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -2,7 +2,7 @@ plugins {
|
|||
id 'java'
|
||||
id 'idea'
|
||||
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
|
||||
id 'org.springframework.boot' version '2.5.8' apply false
|
||||
id 'org.springframework.boot' version '2.5.11' apply false
|
||||
id 'nu.studer.jooq' version '6.0.1' apply false
|
||||
}
|
||||
|
||||
|
|
|
@ -29,6 +29,7 @@ dependencies {
|
|||
// others
|
||||
implementation 'com.auth0:java-jwt:3.18.3'
|
||||
implementation 'org.commonmark:commonmark:0.18.1'
|
||||
implementation 'com.github.javafaker:javafaker:1.0.2'
|
||||
implementation 'com.alibaba:easyexcel'
|
||||
implementation "org.freemarker:freemarker"
|
||||
|
||||
|
|
|
@ -34,6 +34,14 @@ public enum DomainErrors implements DatabasirErrors {
|
|||
INVALID_DATABASE_TYPE_URL_PATTERN("A_10019", "不合法的 url pattern"),
|
||||
DOCUMENT_VERSION_IS_INVALID("A_10020", "文档版本不合法"),
|
||||
CANNOT_UPDATE_SELF_ENABLED_STATUS("A_10021", "无法对自己执行启用禁用操作"),
|
||||
MOCK_DATA_SCRIPT_MUST_NOT_BE_BLANK("A_10022", "脚本内容不能为空"),
|
||||
TABLE_META_NOT_FOUND("A_10023", "不存在的数据库表"),
|
||||
DEPENDENT_COLUMN_NAME_MUST_NOT_BE_BLANK("A_10024", "必须指定依赖的字段"),
|
||||
DEPENDENT_REF_MUST_NOT_BE_BLANK("A_10025", "请选择关联表和字段"),
|
||||
MUST_NOT_REF_SELF("A_10026", "不能引用自身"),
|
||||
CIRCLE_REFERENCE("A_10027", "检查到循环引用"),
|
||||
DUPLICATE_COLUMN("A_10028", "重复的列"),
|
||||
INVALID_MOCK_DATA_SCRIPT("A_10029", "不合法的表达式"),
|
||||
;
|
||||
|
||||
private final String errCode;
|
||||
|
|
|
@ -0,0 +1,25 @@
|
|||
package com.databasir.core.domain.document.converter;
|
||||
|
||||
import com.databasir.core.domain.document.data.TableResponse;
|
||||
import com.databasir.dao.tables.pojos.TableColumnDocumentPojo;
|
||||
import com.databasir.dao.tables.pojos.TableDocumentPojo;
|
||||
import org.mapstruct.Mapper;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Mapper(componentModel = "spring")
|
||||
public interface TableResponseConverter {
|
||||
|
||||
default List<TableResponse> from(List<TableDocumentPojo> tables,
|
||||
Map<Integer, List<TableColumnDocumentPojo>> columnMapByTableId) {
|
||||
return tables.stream()
|
||||
.map(table -> from(table, columnMapByTableId.get(table.getId())))
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
TableResponse from(TableDocumentPojo table, List<TableColumnDocumentPojo> columns);
|
||||
|
||||
TableResponse.ColumnResponse from(TableColumnDocumentPojo column);
|
||||
}
|
|
@ -16,12 +16,16 @@ import java.util.List;
|
|||
@AllArgsConstructor
|
||||
public class DocumentTemplatePropertiesResponse {
|
||||
|
||||
@Builder.Default
|
||||
private List<DocumentTemplatePropertyResponse> columnFieldNameProperties = Collections.emptyList();
|
||||
|
||||
@Builder.Default
|
||||
private List<DocumentTemplatePropertyResponse> indexFieldNameProperties = Collections.emptyList();
|
||||
|
||||
@Builder.Default
|
||||
private List<DocumentTemplatePropertyResponse> triggerFieldNameProperties = Collections.emptyList();
|
||||
|
||||
@Builder.Default
|
||||
private List<DocumentTemplatePropertyResponse> foreignKeyFieldNameProperties = Collections.emptyList();
|
||||
|
||||
@Data
|
||||
|
|
|
@ -0,0 +1,27 @@
|
|||
package com.databasir.core.domain.document.data;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
@Data
|
||||
public class TableResponse {
|
||||
|
||||
private Integer id;
|
||||
|
||||
private String name;
|
||||
|
||||
private List<ColumnResponse> columns = Collections.emptyList();
|
||||
|
||||
@Data
|
||||
public static class ColumnResponse {
|
||||
|
||||
private Integer id;
|
||||
|
||||
private String name;
|
||||
|
||||
private String type;
|
||||
|
||||
}
|
||||
}
|
|
@ -6,14 +6,8 @@ import com.databasir.core.diff.Diffs;
|
|||
import com.databasir.core.diff.data.DiffType;
|
||||
import com.databasir.core.diff.data.RootDiff;
|
||||
import com.databasir.core.domain.DomainErrors;
|
||||
import com.databasir.core.domain.document.converter.DatabaseMetaConverter;
|
||||
import com.databasir.core.domain.document.converter.DocumentPojoConverter;
|
||||
import com.databasir.core.domain.document.converter.DocumentResponseConverter;
|
||||
import com.databasir.core.domain.document.converter.DocumentSimpleResponseConverter;
|
||||
import com.databasir.core.domain.document.data.DatabaseDocumentResponse;
|
||||
import com.databasir.core.domain.document.data.DatabaseDocumentSimpleResponse;
|
||||
import com.databasir.core.domain.document.data.DatabaseDocumentVersionResponse;
|
||||
import com.databasir.core.domain.document.data.TableDocumentResponse;
|
||||
import com.databasir.core.domain.document.converter.*;
|
||||
import com.databasir.core.domain.document.data.*;
|
||||
import com.databasir.core.domain.document.event.DocumentUpdated;
|
||||
import com.databasir.core.domain.document.generator.DocumentFileGenerator;
|
||||
import com.databasir.core.domain.document.generator.DocumentFileType;
|
||||
|
@ -82,6 +76,8 @@ public class DocumentService {
|
|||
|
||||
private final DatabaseMetaConverter databaseMetaConverter;
|
||||
|
||||
private final TableResponseConverter tableResponseConverter;
|
||||
|
||||
private final JsonConverter jsonConverter;
|
||||
|
||||
private final List<DocumentFileGenerator> documentFileGenerators;
|
||||
|
@ -373,4 +369,23 @@ public class DocumentService {
|
|||
DatabaseMeta originalMeta = retrieveOriginalDatabaseMeta(original);
|
||||
return Diffs.diff(originalMeta, currMeta);
|
||||
}
|
||||
|
||||
public List<TableResponse> getTableAndColumns(Integer projectId, Long version) {
|
||||
Optional<DatabaseDocumentPojo> documentOption;
|
||||
if (version == null) {
|
||||
documentOption = databaseDocumentDao.selectNotArchivedByProjectId(projectId);
|
||||
} else {
|
||||
documentOption = databaseDocumentDao.selectOptionalByProjectIdAndVersion(projectId, version);
|
||||
}
|
||||
if (documentOption.isEmpty()) {
|
||||
return Collections.emptyList();
|
||||
} else {
|
||||
DatabaseDocumentPojo databaseDoc = documentOption.get();
|
||||
var tables = tableDocumentDao.selectByDatabaseDocumentId(databaseDoc.getId());
|
||||
var columns = tableColumnDocumentDao.selectByDatabaseDocumentId(databaseDoc.getId());
|
||||
var columnMapByTableId = columns.stream()
|
||||
.collect(Collectors.groupingBy(TableColumnDocumentPojo::getTableDocumentId));
|
||||
return tableResponseConverter.from(tables, columnMapByTableId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,96 @@
|
|||
package com.databasir.core.domain.mock;
|
||||
|
||||
import com.databasir.core.domain.mock.converter.MockDataRulePojoConverter;
|
||||
import com.databasir.core.domain.mock.converter.MockDataRuleResponseConverter;
|
||||
import com.databasir.core.domain.mock.data.ColumnMockRuleSaveRequest;
|
||||
import com.databasir.core.domain.mock.data.MockDataGenerateCondition;
|
||||
import com.databasir.core.domain.mock.data.MockDataRuleListCondition;
|
||||
import com.databasir.core.domain.mock.data.MockDataRuleResponse;
|
||||
import com.databasir.core.domain.mock.generator.MockDataGenerator;
|
||||
import com.databasir.core.domain.mock.validator.MockDataSaveValidator;
|
||||
import com.databasir.core.domain.mock.validator.MockDataValidator;
|
||||
import com.databasir.dao.enums.MockDataType;
|
||||
import com.databasir.dao.impl.MockDataRuleDao;
|
||||
import com.databasir.dao.impl.TableColumnDocumentDao;
|
||||
import com.databasir.dao.tables.pojos.DatabaseDocumentPojo;
|
||||
import com.databasir.dao.tables.pojos.MockDataRulePojo;
|
||||
import com.databasir.dao.tables.pojos.TableColumnDocumentPojo;
|
||||
import com.databasir.dao.tables.pojos.TableDocumentPojo;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
public class MockDataService {
|
||||
|
||||
private final MockDataGenerator mockDataGenerator;
|
||||
|
||||
private final MockDataRuleDao mockDataRuleDao;
|
||||
|
||||
private final TableColumnDocumentDao tableColumnDocumentDao;
|
||||
|
||||
private final MockDataRulePojoConverter mockDataRulePojoConverter;
|
||||
|
||||
private final MockDataRuleResponseConverter mockDataRuleResponseConverter;
|
||||
|
||||
private final MockDataSaveValidator mockDataSaveValidator;
|
||||
|
||||
private final MockDataValidator mockDataValidator;
|
||||
|
||||
public String generateMockInsertSql(Integer projectId, MockDataGenerateCondition condition) {
|
||||
mockDataValidator.validProject(projectId);
|
||||
DatabaseDocumentPojo databaseDoc =
|
||||
mockDataValidator.validAndGetDatabaseDocumentPojo(projectId, condition.getVersion());
|
||||
TableDocumentPojo tableDoc =
|
||||
mockDataValidator.validAndGetTableDocumentPojo(databaseDoc.getId(), condition.getTableId());
|
||||
return mockDataGenerator.createInsertSql(projectId, databaseDoc.getId(), tableDoc.getName());
|
||||
}
|
||||
|
||||
public void saveMockRules(Integer projectId,
|
||||
Integer tableId,
|
||||
List<ColumnMockRuleSaveRequest> rules) {
|
||||
mockDataValidator.validProject(projectId);
|
||||
DatabaseDocumentPojo doc =
|
||||
mockDataValidator.validAndGetDatabaseDocumentPojo(projectId, null);
|
||||
TableDocumentPojo tableDoc =
|
||||
mockDataValidator.validAndGetTableDocumentPojo(doc.getId(), tableId);
|
||||
List<String> columnNames = rules.stream()
|
||||
.map(ColumnMockRuleSaveRequest::getColumnName)
|
||||
.collect(Collectors.toList());
|
||||
mockDataSaveValidator.validTableColumn(tableDoc.getId(), columnNames);
|
||||
mockDataSaveValidator.validScriptMockType(rules);
|
||||
mockDataSaveValidator.validRefMockType(doc.getId(), rules);
|
||||
// verify
|
||||
mockDataGenerator.createInsertSql(projectId, doc.getId(), tableDoc.getName());
|
||||
|
||||
List<MockDataRulePojo> pojo = mockDataRulePojoConverter.from(projectId, rules);
|
||||
mockDataRuleDao.batchSave(pojo);
|
||||
}
|
||||
|
||||
public List<MockDataRuleResponse> listRules(Integer projectId, MockDataRuleListCondition condition) {
|
||||
mockDataValidator.validProject(projectId);
|
||||
DatabaseDocumentPojo databaseDoc =
|
||||
mockDataValidator.validAndGetDatabaseDocumentPojo(projectId, condition.getVersion());
|
||||
TableDocumentPojo tableDoc =
|
||||
mockDataValidator.validAndGetTableDocumentPojo(databaseDoc.getId(), condition.getTableId());
|
||||
List<TableColumnDocumentPojo> columns =
|
||||
tableColumnDocumentDao.selectByTableDocumentId(condition.getTableId());
|
||||
var ruleMapByColumnName = mockDataRuleDao.selectByProjectIdAndTableName(projectId, tableDoc.getName())
|
||||
.stream()
|
||||
.collect(Collectors.toMap(MockDataRulePojo::getColumnName, Function.identity()));
|
||||
return columns.stream()
|
||||
.map(col -> {
|
||||
if (ruleMapByColumnName.containsKey(col.getName())) {
|
||||
return mockDataRuleResponseConverter.from(ruleMapByColumnName.get(col.getName()), col);
|
||||
} else {
|
||||
return mockDataRuleResponseConverter.from(tableDoc.getName(), MockDataType.AUTO, col);
|
||||
}
|
||||
})
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,20 @@
|
|||
package com.databasir.core.domain.mock.converter;
|
||||
|
||||
import com.databasir.core.domain.mock.data.ColumnMockRuleSaveRequest;
|
||||
import com.databasir.dao.tables.pojos.MockDataRulePojo;
|
||||
import org.mapstruct.Mapper;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Mapper(componentModel = "spring")
|
||||
public interface MockDataRulePojoConverter {
|
||||
|
||||
MockDataRulePojo from(Integer projectId, ColumnMockRuleSaveRequest request);
|
||||
|
||||
default List<MockDataRulePojo> from(Integer projectId, List<ColumnMockRuleSaveRequest> request) {
|
||||
return request.stream()
|
||||
.map(rule -> from(projectId, rule))
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
package com.databasir.core.domain.mock.converter;
|
||||
|
||||
import com.databasir.core.domain.mock.data.MockDataRuleResponse;
|
||||
import com.databasir.dao.enums.MockDataType;
|
||||
import com.databasir.dao.tables.pojos.MockDataRulePojo;
|
||||
import com.databasir.dao.tables.pojos.TableColumnDocumentPojo;
|
||||
import org.mapstruct.Mapper;
|
||||
import org.mapstruct.Mapping;
|
||||
|
||||
@Mapper(componentModel = "spring")
|
||||
public interface MockDataRuleResponseConverter {
|
||||
|
||||
@Mapping(target = "columnType", source = "column.type")
|
||||
MockDataRuleResponse from(MockDataRulePojo pojo, TableColumnDocumentPojo column);
|
||||
|
||||
@Mapping(target = "columnName", source = "pojo.name")
|
||||
@Mapping(target = "columnType", source = "pojo.type")
|
||||
MockDataRuleResponse from(String tableName, MockDataType mockDataType, TableColumnDocumentPojo pojo);
|
||||
}
|
|
@ -0,0 +1,27 @@
|
|||
package com.databasir.core.domain.mock.data;
|
||||
|
||||
import com.databasir.dao.enums.MockDataType;
|
||||
import lombok.Data;
|
||||
|
||||
import javax.validation.constraints.NotBlank;
|
||||
import javax.validation.constraints.NotNull;
|
||||
|
||||
@Data
|
||||
public class ColumnMockRuleSaveRequest {
|
||||
|
||||
@NotBlank
|
||||
private String tableName;
|
||||
|
||||
@NotBlank
|
||||
private String columnName;
|
||||
|
||||
private String dependentTableName;
|
||||
|
||||
private String dependentColumnName;
|
||||
|
||||
@NotNull
|
||||
private MockDataType mockDataType;
|
||||
|
||||
private String mockDataScript;
|
||||
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
package com.databasir.core.domain.mock.data;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class MockDataGenerateCondition {
|
||||
|
||||
private Long version;
|
||||
|
||||
private Integer tableId;
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
package com.databasir.core.domain.mock.data;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class MockDataRuleListCondition {
|
||||
|
||||
private Long version;
|
||||
|
||||
private Integer tableId;
|
||||
}
|
|
@ -0,0 +1,23 @@
|
|||
package com.databasir.core.domain.mock.data;
|
||||
|
||||
import com.databasir.dao.enums.MockDataType;
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class MockDataRuleResponse {
|
||||
|
||||
private String tableName;
|
||||
|
||||
private String columnName;
|
||||
|
||||
private String columnType;
|
||||
|
||||
private String dependentTableName;
|
||||
|
||||
private String dependentColumnName;
|
||||
|
||||
private MockDataType mockDataType;
|
||||
|
||||
private String mockDataScript;
|
||||
|
||||
}
|
|
@ -0,0 +1,74 @@
|
|||
package com.databasir.core.domain.mock.factory;
|
||||
|
||||
import com.databasir.dao.enums.MockDataType;
|
||||
import com.databasir.dao.impl.TableColumnDocumentDao;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.core.annotation.Order;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.sql.Types;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
@Component
|
||||
@Order
|
||||
@RequiredArgsConstructor
|
||||
public class AutoMockDataFactory implements MockDataFactory {
|
||||
|
||||
private final TableColumnDocumentDao tableColumnDocumentDao;
|
||||
|
||||
public static final Map<Integer, String> DATA_TYPE_VALUE_MAP = new HashMap<>();
|
||||
|
||||
static {
|
||||
DATA_TYPE_VALUE_MAP.put(9999, "''");
|
||||
DATA_TYPE_VALUE_MAP.put(Types.BIT, "1");
|
||||
DATA_TYPE_VALUE_MAP.put(Types.TINYINT, "1");
|
||||
DATA_TYPE_VALUE_MAP.put(Types.SMALLINT, "1");
|
||||
DATA_TYPE_VALUE_MAP.put(Types.INTEGER, "1");
|
||||
DATA_TYPE_VALUE_MAP.put(Types.BIGINT, "1");
|
||||
DATA_TYPE_VALUE_MAP.put(Types.FLOAT, "1.1");
|
||||
DATA_TYPE_VALUE_MAP.put(Types.REAL, "''");
|
||||
DATA_TYPE_VALUE_MAP.put(Types.DOUBLE, "1.2");
|
||||
DATA_TYPE_VALUE_MAP.put(Types.NUMERIC, "1");
|
||||
DATA_TYPE_VALUE_MAP.put(Types.DECIMAL, "1.1");
|
||||
DATA_TYPE_VALUE_MAP.put(Types.CHAR, "''");
|
||||
DATA_TYPE_VALUE_MAP.put(Types.VARCHAR, "''");
|
||||
DATA_TYPE_VALUE_MAP.put(Types.LONGVARCHAR, "''");
|
||||
DATA_TYPE_VALUE_MAP.put(Types.DATE, "'1970-12-31'");
|
||||
DATA_TYPE_VALUE_MAP.put(Types.TIME, "'00:00:00'");
|
||||
DATA_TYPE_VALUE_MAP.put(Types.TIMESTAMP, "'2001-01-01 00:00:00'");
|
||||
DATA_TYPE_VALUE_MAP.put(Types.BINARY, "''");
|
||||
DATA_TYPE_VALUE_MAP.put(Types.VARBINARY, "''");
|
||||
DATA_TYPE_VALUE_MAP.put(Types.LONGVARBINARY, "''");
|
||||
DATA_TYPE_VALUE_MAP.put(Types.NULL, "null");
|
||||
DATA_TYPE_VALUE_MAP.put(Types.OTHER, "''");
|
||||
DATA_TYPE_VALUE_MAP.put(Types.JAVA_OBJECT, "''");
|
||||
DATA_TYPE_VALUE_MAP.put(Types.DISTINCT, "''");
|
||||
DATA_TYPE_VALUE_MAP.put(Types.STRUCT, "''");
|
||||
DATA_TYPE_VALUE_MAP.put(Types.ARRAY, "'{}'");
|
||||
DATA_TYPE_VALUE_MAP.put(Types.BLOB, "''");
|
||||
DATA_TYPE_VALUE_MAP.put(Types.CLOB, "''");
|
||||
DATA_TYPE_VALUE_MAP.put(Types.REF, "''");
|
||||
DATA_TYPE_VALUE_MAP.put(Types.DATALINK, "''");
|
||||
DATA_TYPE_VALUE_MAP.put(Types.BOOLEAN, "true");
|
||||
DATA_TYPE_VALUE_MAP.put(Types.ROWID, "''");
|
||||
DATA_TYPE_VALUE_MAP.put(Types.NCHAR, "''");
|
||||
DATA_TYPE_VALUE_MAP.put(Types.NVARCHAR, "''");
|
||||
DATA_TYPE_VALUE_MAP.put(Types.LONGNVARCHAR, "''");
|
||||
DATA_TYPE_VALUE_MAP.put(Types.NCLOB, "''");
|
||||
DATA_TYPE_VALUE_MAP.put(Types.SQLXML, "''");
|
||||
DATA_TYPE_VALUE_MAP.put(Types.REF_CURSOR, "''");
|
||||
DATA_TYPE_VALUE_MAP.put(Types.TIME_WITH_TIMEZONE, "''");
|
||||
DATA_TYPE_VALUE_MAP.put(Types.TIMESTAMP_WITH_TIMEZONE, "''");
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean accept(MockColumnRule rule) {
|
||||
return rule == null || rule.getMockDataType() == MockDataType.AUTO;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String create(MockColumnRule rule) {
|
||||
return DATA_TYPE_VALUE_MAP.getOrDefault(rule.getDataType(), "''");
|
||||
}
|
||||
}
|
|
@ -0,0 +1,48 @@
|
|||
package com.databasir.core.domain.mock.factory;
|
||||
|
||||
import com.databasir.dao.enums.MockDataType;
|
||||
import com.github.javafaker.Faker;
|
||||
import org.springframework.core.annotation.Order;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.util.StringJoiner;
|
||||
import java.util.UUID;
|
||||
|
||||
@Component
|
||||
@Order(0)
|
||||
public class FakerMockDataFactory implements MockDataFactory {
|
||||
|
||||
@Override
|
||||
public boolean accept(MockColumnRule rule) {
|
||||
return MockDataType.fakerTypes().contains(rule.getMockDataType());
|
||||
}
|
||||
|
||||
@Override
|
||||
public String create(MockColumnRule rule) {
|
||||
Faker faker = new Faker();
|
||||
StringJoiner joiner = new StringJoiner("", "'", "'");
|
||||
switch (rule.getMockDataType()) {
|
||||
case FULL_NAME:
|
||||
joiner.add(faker.name().username());
|
||||
return joiner.toString();
|
||||
case PHONE:
|
||||
joiner.add(faker.phoneNumber().cellPhone());
|
||||
return joiner.toString();
|
||||
case FULL_ADDRESS:
|
||||
joiner.add(faker.address().fullAddress());
|
||||
return joiner.toString();
|
||||
case AVATAR_URL:
|
||||
joiner.add(faker.avatar().image());
|
||||
return joiner.toString();
|
||||
case UUID:
|
||||
joiner.add(UUID.randomUUID().toString());
|
||||
return joiner.toString();
|
||||
case EMAIL:
|
||||
joiner.add(faker.name().username() + "@generated" + UUID.randomUUID().toString()
|
||||
.replace("-", "").toString());
|
||||
return joiner.toString();
|
||||
default:
|
||||
return "''";
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,36 @@
|
|||
package com.databasir.core.domain.mock.factory;
|
||||
|
||||
import com.databasir.dao.enums.MockDataType;
|
||||
import lombok.Builder;
|
||||
import lombok.Getter;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
@Getter
|
||||
@Builder
|
||||
public class MockColumnRule {
|
||||
|
||||
private String tableName;
|
||||
|
||||
private String columnName;
|
||||
|
||||
private String columnType;
|
||||
|
||||
private Integer dataType;
|
||||
|
||||
private MockDataType mockDataType;
|
||||
|
||||
private String mockDataScript;
|
||||
|
||||
public static MockColumnRule auto(String tableName, String columnName) {
|
||||
return MockColumnRule.builder()
|
||||
.tableName(tableName)
|
||||
.columnName(columnName)
|
||||
.mockDataType(MockDataType.AUTO)
|
||||
.build();
|
||||
}
|
||||
|
||||
public Optional<String> getMockDataScript() {
|
||||
return Optional.ofNullable(mockDataScript);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,9 @@
|
|||
package com.databasir.core.domain.mock.factory;
|
||||
|
||||
public interface MockDataFactory {
|
||||
|
||||
boolean accept(MockColumnRule rule);
|
||||
|
||||
String create(MockColumnRule rule);
|
||||
|
||||
}
|
|
@ -0,0 +1,26 @@
|
|||
package com.databasir.core.domain.mock.factory;
|
||||
|
||||
import com.databasir.core.domain.mock.script.MockScriptEvaluator;
|
||||
import com.databasir.dao.enums.MockDataType;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.core.annotation.Order;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
@Component
|
||||
@Order(0)
|
||||
@RequiredArgsConstructor
|
||||
public class ScriptMockDataFactory implements MockDataFactory {
|
||||
|
||||
private final MockScriptEvaluator mockScriptEvaluator;
|
||||
|
||||
@Override
|
||||
public boolean accept(MockColumnRule rule) {
|
||||
return rule.getMockDataType() == MockDataType.SCRIPT;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String create(MockColumnRule rule) {
|
||||
return mockScriptEvaluator.evaluate(rule.getMockDataScript().get(), new MockScriptEvaluator.ScriptContext());
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,16 @@
|
|||
package com.databasir.core.domain.mock.generator;
|
||||
|
||||
import lombok.Builder;
|
||||
import lombok.Getter;
|
||||
|
||||
@Getter
|
||||
@Builder
|
||||
public class ColumnMockData {
|
||||
|
||||
private String columnName;
|
||||
|
||||
private String columnType;
|
||||
|
||||
private String mockData;
|
||||
|
||||
}
|
|
@ -0,0 +1,173 @@
|
|||
package com.databasir.core.domain.mock.generator;
|
||||
|
||||
import com.databasir.core.domain.DomainErrors;
|
||||
import com.databasir.dao.exception.DataNotExistsException;
|
||||
import com.databasir.dao.tables.pojos.MockDataRulePojo;
|
||||
import com.databasir.dao.tables.pojos.TableColumnDocumentPojo;
|
||||
import lombok.Builder;
|
||||
import lombok.Getter;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Getter
|
||||
@Builder
|
||||
public class MockDataContext {
|
||||
|
||||
private Integer projectId;
|
||||
|
||||
private Integer databaseDocumentId;
|
||||
|
||||
@Builder.Default
|
||||
private Map<String, TableMockData> tableMockDataMap = new LinkedHashMap<>();
|
||||
|
||||
@Builder.Default
|
||||
private Map<String, Set<String>> fromReference = new LinkedHashMap<>();
|
||||
|
||||
@Builder.Default
|
||||
private Map<String, Set<String>> toReference = new LinkedHashMap<>();
|
||||
|
||||
@Builder.Default
|
||||
private Map<String, Map<String, MockDataRulePojo>> ruleMap = new LinkedHashMap<>(16);
|
||||
|
||||
@Builder.Default
|
||||
private Map<String, Map<String, TableColumnDocumentPojo>> tableColumnMap = new LinkedHashMap<>(16);
|
||||
|
||||
@Builder.Default
|
||||
private Map<String, Set<String>> mockInProgress = new HashMap<>();
|
||||
|
||||
public void addTableMockRules(String tableName, List<MockDataRulePojo> rules) {
|
||||
var columnRuleMap = rules.stream()
|
||||
.collect(Collectors.toMap(MockDataRulePojo::getColumnName, Function.identity()));
|
||||
this.ruleMap.put(tableName, columnRuleMap);
|
||||
}
|
||||
|
||||
public boolean containMockRule(String tableName) {
|
||||
return ruleMap.containsKey(tableName);
|
||||
}
|
||||
|
||||
public boolean containMockRule(String tableName, String columnName) {
|
||||
if (!ruleMap.containsKey(tableName)) {
|
||||
return false;
|
||||
}
|
||||
return ruleMap.get(tableName).containsKey(columnName);
|
||||
}
|
||||
|
||||
public Optional<MockDataRulePojo> getMockRule(String tableName, String columnName) {
|
||||
if (!ruleMap.containsKey(tableName)) {
|
||||
return Optional.empty();
|
||||
}
|
||||
return Optional.ofNullable(ruleMap.get(tableName).get(columnName));
|
||||
}
|
||||
|
||||
public void addTableColumns(String tableName, List<TableColumnDocumentPojo> columns) {
|
||||
Map<String, TableColumnDocumentPojo> columnMap = new LinkedHashMap<>();
|
||||
for (TableColumnDocumentPojo column : columns) {
|
||||
columnMap.put(column.getName(), column);
|
||||
}
|
||||
this.tableColumnMap.put(tableName, columnMap);
|
||||
}
|
||||
|
||||
public boolean containsTable(String tableName) {
|
||||
return tableColumnMap.containsKey(tableName);
|
||||
}
|
||||
|
||||
public boolean containsTableColumn(String tableName, String columnName) {
|
||||
if (!tableColumnMap.containsKey(tableName)) {
|
||||
return false;
|
||||
}
|
||||
return tableColumnMap.get(tableName).containsKey(columnName);
|
||||
}
|
||||
|
||||
public TableColumnDocumentPojo getTableColumn(String tableName, String columnName) {
|
||||
if (!tableColumnMap.containsKey(tableName)) {
|
||||
return null;
|
||||
}
|
||||
return tableColumnMap.get(tableName).get(columnName);
|
||||
}
|
||||
|
||||
public boolean containsTableMockData(String tableName) {
|
||||
return tableMockDataMap.containsKey(tableName);
|
||||
}
|
||||
|
||||
public boolean containsColumnMockData(String tableName, String columName) {
|
||||
return tableMockDataMap.containsKey(tableName) && tableMockDataMap.get(tableName).containsColumn(columName);
|
||||
}
|
||||
|
||||
public void addTableMockData(TableMockData tableMockData) {
|
||||
this.tableMockDataMap.put(tableMockData.getTableName(), tableMockData);
|
||||
}
|
||||
|
||||
public TableMockData getTableMockData(String tableName) {
|
||||
return this.tableMockDataMap.get(tableName);
|
||||
}
|
||||
|
||||
public void addColumnMockData(String tableName, ColumnMockData columnMockData) {
|
||||
TableMockData mock =
|
||||
tableMockDataMap.computeIfAbsent(tableName, key -> TableMockData.of(tableName, new ArrayList<>()));
|
||||
mock.addColumnIfNotExists(columnMockData);
|
||||
// sort to last
|
||||
tableMockDataMap.remove(tableName);
|
||||
tableMockDataMap.put(tableName, mock);
|
||||
}
|
||||
|
||||
public String getRawColumnMockData(String tableName, String columnName) {
|
||||
if (!this.containsTableMockData(tableName)) {
|
||||
throw new DataNotExistsException("can't find table mock data by " + tableName);
|
||||
}
|
||||
return getTableMockData(tableName)
|
||||
.getColumnMockData()
|
||||
.stream()
|
||||
.filter(t -> t.getColumnName().equals(columnName))
|
||||
.findFirst()
|
||||
.map(ColumnMockData::getMockData)
|
||||
.orElseThrow(DataNotExistsException::new);
|
||||
}
|
||||
|
||||
public boolean isMockInProgress(String tableName, String columnName) {
|
||||
return this.mockInProgress.containsKey(tableName) && this.mockInProgress.get(tableName).contains(columnName);
|
||||
}
|
||||
|
||||
public void addMockInProgress(String tableName, String columnName) {
|
||||
Set<String> inProgress = this.mockInProgress.computeIfAbsent(tableName, key -> new HashSet<>());
|
||||
inProgress.add(columnName);
|
||||
}
|
||||
|
||||
public void removeMockInProgress(String tableName, String columnName) {
|
||||
Set<String> inProgress = this.mockInProgress.computeIfAbsent(tableName, key -> new HashSet<>());
|
||||
inProgress.remove(columnName);
|
||||
}
|
||||
|
||||
public String toInsertSql() {
|
||||
return tableMockDataMap.entrySet()
|
||||
.stream()
|
||||
.map(entry -> {
|
||||
String tableName = entry.getKey();
|
||||
List<ColumnMockData> columns = entry.getValue().getColumnMockData();
|
||||
String format = "insert into %s (%s)\nvalues\n(%s);";
|
||||
String columnNames = columns.stream()
|
||||
.map(c -> "" + c.getColumnName() + "")
|
||||
.collect(Collectors.joining(", "));
|
||||
String columnValues = columns.stream()
|
||||
.map(ColumnMockData::getMockData)
|
||||
.collect(Collectors.joining(", "));
|
||||
return String.format(format, tableName, columnNames, columnValues);
|
||||
})
|
||||
.collect(Collectors.joining("\n\n"));
|
||||
}
|
||||
|
||||
public void saveReference(String fromTable, String fromColumn, String toTable, String toColumn) {
|
||||
if (toReference.containsKey(fromTable) && toReference.get(fromTable).contains(fromColumn)) {
|
||||
if (fromReference.containsKey(toTable) && fromReference.get(toTable).contains(toColumn)) {
|
||||
String format = "%s 和 %s 出现了循环引用";
|
||||
String message = String.format(format, fromTable + "." + fromColumn, toTable + "." + toColumn);
|
||||
throw DomainErrors.CIRCLE_REFERENCE.exception(message);
|
||||
}
|
||||
}
|
||||
Set<String> fromColumns = this.fromReference.computeIfAbsent(fromTable, key -> new HashSet<>());
|
||||
fromColumns.add(fromColumn);
|
||||
Set<String> toColumns = this.toReference.computeIfAbsent(toTable, key -> new HashSet<>());
|
||||
toColumns.add(toColumn);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,129 @@
|
|||
package com.databasir.core.domain.mock.generator;
|
||||
|
||||
import com.databasir.core.domain.DomainErrors;
|
||||
import com.databasir.core.domain.mock.factory.MockColumnRule;
|
||||
import com.databasir.core.domain.mock.factory.MockDataFactory;
|
||||
import com.databasir.dao.enums.MockDataType;
|
||||
import com.databasir.dao.impl.MockDataRuleDao;
|
||||
import com.databasir.dao.impl.ProjectDao;
|
||||
import com.databasir.dao.impl.TableColumnDocumentDao;
|
||||
import com.databasir.dao.impl.TableDocumentDao;
|
||||
import com.databasir.dao.tables.pojos.MockDataRulePojo;
|
||||
import com.databasir.dao.tables.pojos.TableColumnDocumentPojo;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
|
||||
@Component
|
||||
@RequiredArgsConstructor
|
||||
@Slf4j
|
||||
public class MockDataGenerator {
|
||||
|
||||
private final List<MockDataFactory> mockDataFactories;
|
||||
|
||||
private final MockDataRuleDao mockDataRuleDao;
|
||||
|
||||
private final TableDocumentDao tableDocumentDao;
|
||||
|
||||
private final TableColumnDocumentDao tableColumnDocumentDao;
|
||||
|
||||
private final ProjectDao projectDao;
|
||||
|
||||
public String createInsertSql(Integer projectId,
|
||||
Integer databaseDocId,
|
||||
String tableName) {
|
||||
if (!projectDao.existsById(projectId)) {
|
||||
throw DomainErrors.PROJECT_NOT_FOUND.exception();
|
||||
}
|
||||
MockDataContext context = MockDataContext.builder()
|
||||
.databaseDocumentId(databaseDocId)
|
||||
.projectId(projectId)
|
||||
.build();
|
||||
create(context, tableName);
|
||||
return context.toInsertSql();
|
||||
}
|
||||
|
||||
private void create(MockDataContext context, String tableName) {
|
||||
if (!context.containsTable(tableName)) {
|
||||
var tableOption =
|
||||
tableDocumentDao.selectByDatabaseDocumentIdAndTableName(context.getDatabaseDocumentId(), tableName);
|
||||
if (tableOption.isEmpty()) {
|
||||
log.warn("can not find table => " + tableName);
|
||||
return;
|
||||
}
|
||||
var table = tableOption.get();
|
||||
var columns = tableColumnDocumentDao.selectByTableDocumentId(table.getId());
|
||||
context.addTableColumns(tableName, columns);
|
||||
}
|
||||
if (!context.containMockRule(tableName)) {
|
||||
var columnRules = mockDataRuleDao.selectByProjectIdAndTableName(context.getProjectId(), tableName);
|
||||
context.addTableMockRules(tableName, columnRules);
|
||||
}
|
||||
|
||||
for (TableColumnDocumentPojo column : context.getTableColumnMap().get(tableName).values()) {
|
||||
if (context.containsColumnMockData(tableName, column.getName())
|
||||
|| context.isMockInProgress(tableName, column.getName())) {
|
||||
continue;
|
||||
}
|
||||
create(context, tableName, column.getName());
|
||||
}
|
||||
}
|
||||
|
||||
private void create(MockDataContext context, String tableName, String columnName) {
|
||||
if (context.containsColumnMockData(tableName, columnName)) {
|
||||
return;
|
||||
}
|
||||
TableColumnDocumentPojo column = context.getTableColumn(tableName, columnName);
|
||||
Optional<MockDataRulePojo> ruleOption = context.getMockRule(tableName, columnName);
|
||||
String rawData;
|
||||
if (ruleOption.isPresent()) {
|
||||
MockDataRulePojo rule = ruleOption.get();
|
||||
if (rule.getMockDataType() == MockDataType.REF) {
|
||||
context.addMockInProgress(tableName, columnName);
|
||||
context.saveReference(
|
||||
rule.getTableName(), rule.getColumnName(),
|
||||
rule.getDependentTableName(), rule.getDependentColumnName()
|
||||
);
|
||||
if (context.containsTable(rule.getDependentTableName())) {
|
||||
create(context, rule.getDependentTableName(), rule.getDependentColumnName());
|
||||
} else {
|
||||
create(context, rule.getDependentTableName());
|
||||
}
|
||||
context.removeMockInProgress(tableName, columnName);
|
||||
rawData = context.getRawColumnMockData(rule.getDependentTableName(), rule.getDependentColumnName());
|
||||
} else {
|
||||
rawData = createByFactory(column, rule);
|
||||
}
|
||||
} else {
|
||||
rawData = createByFactory(column, null);
|
||||
}
|
||||
context.addColumnMockData(tableName, toData(rawData, column));
|
||||
}
|
||||
|
||||
private String createByFactory(TableColumnDocumentPojo column, MockDataRulePojo rule) {
|
||||
MockDataType mockType = rule == null ? MockDataType.AUTO : rule.getMockDataType();
|
||||
MockColumnRule colRule = MockColumnRule.builder()
|
||||
.dataType(column.getDataType())
|
||||
.mockDataType(mockType)
|
||||
.mockDataScript(null == rule ? null : rule.getMockDataScript())
|
||||
.columnName(column.getName())
|
||||
.columnType(column.getType())
|
||||
.build();
|
||||
return mockDataFactories.stream()
|
||||
.filter(factory -> factory.accept(colRule))
|
||||
.findFirst()
|
||||
.map(factory -> factory.create(colRule))
|
||||
.orElseThrow();
|
||||
}
|
||||
|
||||
private ColumnMockData toData(String data, TableColumnDocumentPojo column) {
|
||||
return ColumnMockData.builder()
|
||||
.columnName(column.getName())
|
||||
.columnType(column.getType())
|
||||
.mockData(data)
|
||||
.build();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,34 @@
|
|||
package com.databasir.core.domain.mock.generator;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
@Getter
|
||||
@AllArgsConstructor
|
||||
public class TableMockData {
|
||||
|
||||
private String tableName;
|
||||
|
||||
private List<ColumnMockData> columnMockData;
|
||||
|
||||
public static TableMockData of(String tableName, List<ColumnMockData> columnMockData) {
|
||||
return new TableMockData(tableName, columnMockData);
|
||||
}
|
||||
|
||||
public void addColumnIfNotExists(ColumnMockData data) {
|
||||
boolean present = columnMockData.stream()
|
||||
.anyMatch(col -> Objects.equals(col.getColumnName(), data.getColumnName()));
|
||||
if (present) {
|
||||
return;
|
||||
}
|
||||
this.columnMockData.add(data);
|
||||
}
|
||||
|
||||
public boolean containsColumn(String columnName) {
|
||||
return columnMockData.stream()
|
||||
.anyMatch(col -> Objects.equals(col.getColumnName(), columnName));
|
||||
}
|
||||
}
|
|
@ -0,0 +1,14 @@
|
|||
package com.databasir.core.domain.mock.script;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
public interface MockScriptEvaluator {
|
||||
|
||||
String evaluate(String script, ScriptContext context);
|
||||
|
||||
@Data
|
||||
class ScriptContext {
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,21 @@
|
|||
package com.databasir.core.domain.mock.script;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.expression.Expression;
|
||||
import org.springframework.expression.spel.standard.SpelExpressionParser;
|
||||
import org.springframework.expression.spel.support.StandardEvaluationContext;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
@Component
|
||||
@RequiredArgsConstructor
|
||||
public class SpelScriptEvaluator implements MockScriptEvaluator {
|
||||
|
||||
private final SpelExpressionParser spelExpressionParser = new SpelExpressionParser();
|
||||
|
||||
@Override
|
||||
public String evaluate(String script, ScriptContext context) {
|
||||
Expression expression = spelExpressionParser.parseExpression(script);
|
||||
StandardEvaluationContext spelContext = new StandardEvaluationContext(context);
|
||||
return expression.getValue(spelContext, String.class);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,127 @@
|
|||
package com.databasir.core.domain.mock.validator;
|
||||
|
||||
import com.alibaba.excel.util.StringUtils;
|
||||
import com.databasir.core.domain.DomainErrors;
|
||||
import com.databasir.core.domain.mock.data.ColumnMockRuleSaveRequest;
|
||||
import com.databasir.core.domain.mock.script.MockScriptEvaluator;
|
||||
import com.databasir.core.domain.mock.script.SpelScriptEvaluator;
|
||||
import com.databasir.dao.enums.MockDataType;
|
||||
import com.databasir.dao.impl.TableColumnDocumentDao;
|
||||
import com.databasir.dao.impl.TableDocumentDao;
|
||||
import com.databasir.dao.tables.pojos.TableColumnDocumentPojo;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Component
|
||||
@RequiredArgsConstructor
|
||||
public class MockDataSaveValidator {
|
||||
|
||||
private final TableDocumentDao tableDocumentDao;
|
||||
|
||||
private final TableColumnDocumentDao tableColumnDocumentDao;
|
||||
|
||||
private final SpelScriptEvaluator spelScriptEvaluator;
|
||||
|
||||
public void validScriptMockType(List<ColumnMockRuleSaveRequest> rules) {
|
||||
for (ColumnMockRuleSaveRequest request : rules) {
|
||||
if (request.getMockDataType() != MockDataType.SCRIPT) {
|
||||
continue;
|
||||
}
|
||||
if (StringUtils.isBlank(request.getMockDataScript())) {
|
||||
throw DomainErrors.MOCK_DATA_SCRIPT_MUST_NOT_BE_BLANK.exception();
|
||||
}
|
||||
try {
|
||||
spelScriptEvaluator.evaluate(request.getMockDataScript(), new MockScriptEvaluator.ScriptContext());
|
||||
} catch (Exception e) {
|
||||
throw DomainErrors.INVALID_MOCK_DATA_SCRIPT.exception(e.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void validTableColumn(Integer tableDocId, List<String> requestColumnNames) {
|
||||
var existsColumnNames = tableColumnDocumentDao.selectByTableDocumentId(tableDocId)
|
||||
.stream()
|
||||
.map(TableColumnDocumentPojo::getName)
|
||||
.collect(Collectors.toSet());
|
||||
for (String colName : requestColumnNames) {
|
||||
if (!existsColumnNames.contains(colName)) {
|
||||
throw DomainErrors.TABLE_META_NOT_FOUND.exception("column "
|
||||
+ colName
|
||||
+ " not exists in "
|
||||
+ tableDocId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void validRefMockType(Integer databaseDocId,
|
||||
List<ColumnMockRuleSaveRequest> rules) {
|
||||
Map<String, Set<String>> fromTableAndColumn = new HashMap<>();
|
||||
Map<String, Set<String>> toTableAndColumn = new HashMap<>();
|
||||
for (ColumnMockRuleSaveRequest request : rules) {
|
||||
if (request.getMockDataType() != MockDataType.REF) {
|
||||
continue;
|
||||
}
|
||||
forbiddenIfMissRequireParams(request);
|
||||
forbiddenIfSelfReference(request);
|
||||
forbiddenIfCircleReference(request, fromTableAndColumn, toTableAndColumn);
|
||||
forbiddenIfIsInvalidTableOrColumn(databaseDocId, request);
|
||||
}
|
||||
}
|
||||
|
||||
private void forbiddenIfSelfReference(ColumnMockRuleSaveRequest request) {
|
||||
if (!Objects.equals(request.getTableName(), request.getDependentTableName())) {
|
||||
return;
|
||||
}
|
||||
if (!Objects.equals(request.getColumnName(), request.getDependentColumnName())) {
|
||||
return;
|
||||
}
|
||||
throw DomainErrors.MUST_NOT_REF_SELF.exception();
|
||||
}
|
||||
|
||||
private void forbiddenIfMissRequireParams(ColumnMockRuleSaveRequest request) {
|
||||
if (StringUtils.isBlank(request.getDependentTableName())) {
|
||||
throw DomainErrors.DEPENDENT_COLUMN_NAME_MUST_NOT_BE_BLANK.exception();
|
||||
}
|
||||
if (StringUtils.isBlank(request.getDependentColumnName())) {
|
||||
throw DomainErrors.DEPENDENT_COLUMN_NAME_MUST_NOT_BE_BLANK.exception();
|
||||
}
|
||||
}
|
||||
|
||||
private void forbiddenIfIsInvalidTableOrColumn(Integer docId, ColumnMockRuleSaveRequest request) {
|
||||
String dependentTableName = request.getDependentTableName();
|
||||
var dependentTable = tableDocumentDao.selectByDatabaseDocumentIdAndTableName(docId, dependentTableName)
|
||||
.orElseThrow(DomainErrors.TABLE_META_NOT_FOUND::exception);
|
||||
if (!tableColumnDocumentDao.exists(dependentTable.getId(), request.getDependentColumnName())) {
|
||||
throw DomainErrors.TABLE_META_NOT_FOUND.exception("列字段 "
|
||||
+ request.getDependentColumnName()
|
||||
+ "不存在");
|
||||
}
|
||||
}
|
||||
|
||||
private void forbiddenIfCircleReference(ColumnMockRuleSaveRequest request,
|
||||
Map<String, Set<String>> fromTableAndColumn,
|
||||
Map<String, Set<String>> toTableAndColumn) {
|
||||
if (toTableAndColumn.containsKey(request.getTableName())
|
||||
&& toTableAndColumn.get(request.getTableName()).contains(request.getColumnName())) {
|
||||
if (fromTableAndColumn.containsKey(request.getDependentTableName())
|
||||
&& fromTableAndColumn.get(request.getDependentTableName())
|
||||
.contains(request.getDependentColumnName())) {
|
||||
String format = "%s 和 %s 出现了循环引用";
|
||||
String from = request.getTableName() + "." + request.getColumnName();
|
||||
String to = request.getDependentTableName() + "." + request.getDependentColumnName();
|
||||
String message = String.format(format, from, to);
|
||||
throw DomainErrors.CIRCLE_REFERENCE.exception(message);
|
||||
}
|
||||
}
|
||||
|
||||
Set<String> fromColumns =
|
||||
fromTableAndColumn.computeIfAbsent(request.getTableName(), key -> new HashSet<String>());
|
||||
fromColumns.add(request.getColumnName());
|
||||
Set<String> toColumns =
|
||||
toTableAndColumn.computeIfAbsent(request.getDependentTableName(), key -> new HashSet<String>());
|
||||
toColumns.add(request.getDependentColumnName());
|
||||
}
|
||||
}
|
|
@ -0,0 +1,52 @@
|
|||
package com.databasir.core.domain.mock.validator;
|
||||
|
||||
import com.databasir.core.domain.DomainErrors;
|
||||
import com.databasir.dao.impl.DatabaseDocumentDao;
|
||||
import com.databasir.dao.impl.ProjectDao;
|
||||
import com.databasir.dao.impl.TableDocumentDao;
|
||||
import com.databasir.dao.tables.pojos.DatabaseDocumentPojo;
|
||||
import com.databasir.dao.tables.pojos.TableDocumentPojo;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
@Component
|
||||
@RequiredArgsConstructor
|
||||
public class MockDataValidator {
|
||||
|
||||
private final ProjectDao projectDao;
|
||||
|
||||
private final DatabaseDocumentDao databaseDocumentDao;
|
||||
|
||||
private final TableDocumentDao tableDocumentDao;
|
||||
|
||||
public void validProject(Integer projectId) {
|
||||
if (!projectDao.existsById(projectId)) {
|
||||
throw DomainErrors.PROJECT_NOT_FOUND.exception();
|
||||
}
|
||||
}
|
||||
|
||||
public DatabaseDocumentPojo validAndGetDatabaseDocumentPojo(Integer projectId, Long version) {
|
||||
Optional<DatabaseDocumentPojo> databaseDoc;
|
||||
if (version == null) {
|
||||
databaseDoc = databaseDocumentDao.selectNotArchivedByProjectId(projectId);
|
||||
} else {
|
||||
databaseDoc = databaseDocumentDao.selectOptionalByProjectIdAndVersion(projectId, version);
|
||||
}
|
||||
if (databaseDoc.isEmpty()) {
|
||||
throw DomainErrors.DATABASE_META_NOT_FOUND.exception();
|
||||
}
|
||||
return databaseDoc.get();
|
||||
}
|
||||
|
||||
public TableDocumentPojo validAndGetTableDocumentPojo(Integer databaseDocId, Integer tableId) {
|
||||
Optional<TableDocumentPojo> tableOption =
|
||||
tableDocumentDao.selectByDatabaseDocumentIdAndId(databaseDocId, tableId);
|
||||
if (tableOption.isEmpty()) {
|
||||
throw DomainErrors.DATABASE_META_NOT_FOUND.exception("表数据不存在");
|
||||
}
|
||||
return tableOption.get();
|
||||
}
|
||||
|
||||
}
|
|
@ -72,6 +72,12 @@ jooq {
|
|||
includeExpression = 'document_template_property.type'
|
||||
includeTypes = '.*'
|
||||
}
|
||||
forcedType {
|
||||
userType = 'com.databasir.dao.enums.MockDataType'
|
||||
converter = 'com.databasir.dao.converter.MockDataTypeConverter'
|
||||
includeExpression = 'mock_data_rule.mock_data_type'
|
||||
includeTypes = '.*'
|
||||
}
|
||||
}
|
||||
}
|
||||
generate {
|
||||
|
|
|
@ -13,6 +13,7 @@ import com.databasir.dao.tables.DocumentDiscussion;
|
|||
import com.databasir.dao.tables.DocumentTemplateProperty;
|
||||
import com.databasir.dao.tables.Group;
|
||||
import com.databasir.dao.tables.Login;
|
||||
import com.databasir.dao.tables.MockDataRule;
|
||||
import com.databasir.dao.tables.OauthApp;
|
||||
import com.databasir.dao.tables.OperationLog;
|
||||
import com.databasir.dao.tables.Project;
|
||||
|
@ -94,6 +95,11 @@ public class Databasir extends SchemaImpl {
|
|||
*/
|
||||
public final Login LOGIN = Login.LOGIN;
|
||||
|
||||
/**
|
||||
* The table <code>databasir.mock_data_rule</code>.
|
||||
*/
|
||||
public final MockDataRule MOCK_DATA_RULE = MockDataRule.MOCK_DATA_RULE;
|
||||
|
||||
/**
|
||||
* oauth app info
|
||||
*/
|
||||
|
@ -189,6 +195,7 @@ public class Databasir extends SchemaImpl {
|
|||
DocumentTemplateProperty.DOCUMENT_TEMPLATE_PROPERTY,
|
||||
Group.GROUP,
|
||||
Login.LOGIN,
|
||||
MockDataRule.MOCK_DATA_RULE,
|
||||
OauthApp.OAUTH_APP,
|
||||
OperationLog.OPERATION_LOG,
|
||||
Project.PROJECT,
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue