Browse Source

support mock data (#67)

* feat:support generate mock sql

* feat: update frontend resources

* feat: update readme

* fix: check failed
master
vran 3 years ago
committed by GitHub
parent
commit
e4428a3890
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 2
      README.md
  2. 10
      api/src/main/java/com/databasir/api/DocumentController.java
  3. 49
      api/src/main/java/com/databasir/api/MockDataController.java
  4. 12
      api/src/main/java/com/databasir/api/Routes.java
  5. 20
      api/src/main/resources/static/css/146.9911c11a.css
  6. 1
      api/src/main/resources/static/css/703.438fd5a5.css
  7. 2
      api/src/main/resources/static/index.html
  8. 2
      api/src/main/resources/static/js/101-legacy.fe788b74.js
  9. 2
      api/src/main/resources/static/js/101-legacy.fe788b74.js.map
  10. 2
      api/src/main/resources/static/js/117-legacy.e08db215.js
  11. 2
      api/src/main/resources/static/js/117-legacy.e08db215.js.map
  12. 2
      api/src/main/resources/static/js/139-legacy.c7c6213a.js
  13. 2
      api/src/main/resources/static/js/139-legacy.c7c6213a.js.map
  14. 2
      api/src/main/resources/static/js/139.23e83679.js
  15. 2
      api/src/main/resources/static/js/139.23e83679.js.map
  16. 33
      api/src/main/resources/static/js/146-legacy.1c773831.js
  17. 1
      api/src/main/resources/static/js/146-legacy.1c773831.js.map
  18. 33
      api/src/main/resources/static/js/146.08f4ba55.js
  19. 1
      api/src/main/resources/static/js/146.08f4ba55.js.map
  20. 2
      api/src/main/resources/static/js/243-legacy.92016c20.js
  21. 2
      api/src/main/resources/static/js/243-legacy.92016c20.js.map
  22. 2
      api/src/main/resources/static/js/243.e2c9f564.js
  23. 2
      api/src/main/resources/static/js/243.e2c9f564.js.map
  24. 2
      api/src/main/resources/static/js/414-legacy.d93814b8.js
  25. 2
      api/src/main/resources/static/js/414-legacy.d93814b8.js.map
  26. 2
      api/src/main/resources/static/js/459-legacy.f3905f9c.js
  27. 2
      api/src/main/resources/static/js/459-legacy.f3905f9c.js.map
  28. 2
      api/src/main/resources/static/js/459.3cf4a06a.js
  29. 2
      api/src/main/resources/static/js/459.3cf4a06a.js.map
  30. 2
      api/src/main/resources/static/js/469-legacy.b0c9ae4b.js
  31. 2
      api/src/main/resources/static/js/469-legacy.b0c9ae4b.js.map
  32. 2
      api/src/main/resources/static/js/469.609a9412.js
  33. 2
      api/src/main/resources/static/js/469.609a9412.js.map
  34. 2
      api/src/main/resources/static/js/564.b084aa8c.js
  35. 2
      api/src/main/resources/static/js/564.b084aa8c.js.map
  36. 2
      api/src/main/resources/static/js/596-legacy.1d54812e.js
  37. 2
      api/src/main/resources/static/js/596-legacy.1d54812e.js.map
  38. 2
      api/src/main/resources/static/js/596.c5d055fb.js
  39. 2
      api/src/main/resources/static/js/596.c5d055fb.js.map
  40. 33
      api/src/main/resources/static/js/703-legacy.2314ffd2.js
  41. 1
      api/src/main/resources/static/js/703-legacy.2314ffd2.js.map
  42. 33
      api/src/main/resources/static/js/703.1398b838.js
  43. 1
      api/src/main/resources/static/js/703.1398b838.js.map
  44. 2
      api/src/main/resources/static/js/754-legacy.9cccfd52.js
  45. 2
      api/src/main/resources/static/js/754-legacy.9cccfd52.js.map
  46. 2
      api/src/main/resources/static/js/754.94f1d1eb.js
  47. 2
      api/src/main/resources/static/js/754.94f1d1eb.js.map
  48. 2
      api/src/main/resources/static/js/865-legacy.55e3080f.js
  49. 2
      api/src/main/resources/static/js/865-legacy.55e3080f.js.map
  50. 2
      api/src/main/resources/static/js/865.4a2f905b.js
  51. 2
      api/src/main/resources/static/js/865.4a2f905b.js.map
  52. 2
      api/src/main/resources/static/js/99-legacy.fcfcb9cd.js
  53. 2
      api/src/main/resources/static/js/99-legacy.fcfcb9cd.js.map
  54. 2
      api/src/main/resources/static/js/99.e2e8211b.js
  55. 2
      api/src/main/resources/static/js/99.e2e8211b.js.map
  56. 2
      api/src/main/resources/static/js/app-legacy.26c8cf98.js
  57. 1
      api/src/main/resources/static/js/app-legacy.26c8cf98.js.map
  58. 2
      api/src/main/resources/static/js/app-legacy.359fd70e.js
  59. 1
      api/src/main/resources/static/js/app-legacy.359fd70e.js.map
  60. 2
      api/src/main/resources/static/js/app.969627b4.js
  61. 1
      api/src/main/resources/static/js/app.969627b4.js.map
  62. 2
      api/src/main/resources/static/js/app.dcbe0648.js
  63. 1
      api/src/main/resources/static/js/app.dcbe0648.js.map
  64. 28
      api/src/main/resources/static/js/chunk-vendors-legacy.2897f987.js
  65. 1
      api/src/main/resources/static/js/chunk-vendors-legacy.2897f987.js.map
  66. 28
      api/src/main/resources/static/js/chunk-vendors-legacy.ca7b1117.js
  67. 1
      api/src/main/resources/static/js/chunk-vendors-legacy.ca7b1117.js.map
  68. 28
      api/src/main/resources/static/js/chunk-vendors.34b8254e.js
  69. 1
      api/src/main/resources/static/js/chunk-vendors.34b8254e.js.map
  70. 28
      api/src/main/resources/static/js/chunk-vendors.c33500d9.js
  71. 1
      api/src/main/resources/static/js/chunk-vendors.c33500d9.js.map
  72. 2
      build.gradle
  73. 1
      core/build.gradle
  74. 8
      core/src/main/java/com/databasir/core/domain/DomainErrors.java
  75. 25
      core/src/main/java/com/databasir/core/domain/document/converter/TableResponseConverter.java
  76. 4
      core/src/main/java/com/databasir/core/domain/document/data/DocumentTemplatePropertiesResponse.java
  77. 27
      core/src/main/java/com/databasir/core/domain/document/data/TableResponse.java
  78. 31
      core/src/main/java/com/databasir/core/domain/document/service/DocumentService.java
  79. 96
      core/src/main/java/com/databasir/core/domain/mock/MockDataService.java
  80. 20
      core/src/main/java/com/databasir/core/domain/mock/converter/MockDataRulePojoConverter.java
  81. 19
      core/src/main/java/com/databasir/core/domain/mock/converter/MockDataRuleResponseConverter.java
  82. 27
      core/src/main/java/com/databasir/core/domain/mock/data/ColumnMockRuleSaveRequest.java
  83. 11
      core/src/main/java/com/databasir/core/domain/mock/data/MockDataGenerateCondition.java
  84. 11
      core/src/main/java/com/databasir/core/domain/mock/data/MockDataRuleListCondition.java
  85. 23
      core/src/main/java/com/databasir/core/domain/mock/data/MockDataRuleResponse.java
  86. 74
      core/src/main/java/com/databasir/core/domain/mock/factory/AutoMockDataFactory.java
  87. 48
      core/src/main/java/com/databasir/core/domain/mock/factory/FakerMockDataFactory.java
  88. 36
      core/src/main/java/com/databasir/core/domain/mock/factory/MockColumnRule.java
  89. 9
      core/src/main/java/com/databasir/core/domain/mock/factory/MockDataFactory.java
  90. 26
      core/src/main/java/com/databasir/core/domain/mock/factory/ScriptMockDataFactory.java
  91. 16
      core/src/main/java/com/databasir/core/domain/mock/generator/ColumnMockData.java
  92. 173
      core/src/main/java/com/databasir/core/domain/mock/generator/MockDataContext.java
  93. 129
      core/src/main/java/com/databasir/core/domain/mock/generator/MockDataGenerator.java
  94. 34
      core/src/main/java/com/databasir/core/domain/mock/generator/TableMockData.java
  95. 14
      core/src/main/java/com/databasir/core/domain/mock/script/MockScriptEvaluator.java
  96. 21
      core/src/main/java/com/databasir/core/domain/mock/script/SpelScriptEvaluator.java
  97. 127
      core/src/main/java/com/databasir/core/domain/mock/validator/MockDataSaveValidator.java
  98. 52
      core/src/main/java/com/databasir/core/domain/mock/validator/MockDataValidator.java
  99. 6
      dao/build.gradle
  100. 7
      dao/generated-src/jooq/main/java/com/databasir/dao/Databasir.java

2
README.md

@ -16,7 +16,7 @@
## 特性
1. 兼容市面多数数据库:支持所有拥有 JDBC 驱动的数据库,mysql、postgresql 开箱即用
2. 丰富的文档管理功能:支持文档自动同步,版本历史回溯,版本差异对比,文档讨论,UML 生成, 文档导出等,应有尽有
2. 丰富的文档管理功能:支持文档自动同步,版本历史回溯,版本差异对比,文档讨论,UML 生成, 文档导出,数据 SQL 生成等,应有尽有
3. 面向团队的专业能力:扁平化的角色管理,支持 Github \ Github Enterprise \ Gitlab 的 OAuth2 登录,日志审计
更多内容请到 https://doc.databasir.com 查看

10
api/src/main/java/com/databasir/api/DocumentController.java

@ -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));
}
}

49
api/src/main/java/com/databasir/api/MockDataController.java

@ -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();
}
}

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

@ -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";
}
}

20
api/src/main/resources/static/css/146.9911c11a.css

@ -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
api/src/main/resources/static/css/703.438fd5a5.css

@ -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}

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

@ -1 +1 @@
<!doctype html><html lang=""><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="/favicon.ico"><title>databasir</title><script defer="defer" type="module" src="/js/chunk-vendors.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>

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

File diff suppressed because one or more lines are too long

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

File diff suppressed because one or more lines are too long

2
api/src/main/resources/static/js/117-legacy.5a8a817f.js → api/src/main/resources/static/js/117-legacy.e08db215.js

File diff suppressed because one or more lines are too long

2
api/src/main/resources/static/js/117-legacy.5a8a817f.js.map → api/src/main/resources/static/js/117-legacy.e08db215.js.map

File diff suppressed because one or more lines are too long

2
api/src/main/resources/static/js/139-legacy.b3ab46a9.js → api/src/main/resources/static/js/139-legacy.c7c6213a.js

File diff suppressed because one or more lines are too long

2
api/src/main/resources/static/js/139-legacy.b3ab46a9.js.map → api/src/main/resources/static/js/139-legacy.c7c6213a.js.map

File diff suppressed because one or more lines are too long

2
api/src/main/resources/static/js/139.338f8cdc.js → api/src/main/resources/static/js/139.23e83679.js

File diff suppressed because one or more lines are too long

2
api/src/main/resources/static/js/139.338f8cdc.js.map → api/src/main/resources/static/js/139.23e83679.js.map

File diff suppressed because one or more lines are too long

33
api/src/main/resources/static/js/146-legacy.1c773831.js

File diff suppressed because one or more lines are too long

1
api/src/main/resources/static/js/146-legacy.1c773831.js.map

File diff suppressed because one or more lines are too long

33
api/src/main/resources/static/js/146.08f4ba55.js

File diff suppressed because one or more lines are too long

1
api/src/main/resources/static/js/146.08f4ba55.js.map

File diff suppressed because one or more lines are too long

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

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

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

File diff suppressed because one or more lines are too long

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

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

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

File diff suppressed because one or more lines are too long

2
api/src/main/resources/static/js/414-legacy.360748a4.js → api/src/main/resources/static/js/414-legacy.d93814b8.js

File diff suppressed because one or more lines are too long

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

File diff suppressed because one or more lines are too long

2
api/src/main/resources/static/js/459-legacy.e006098f.js → api/src/main/resources/static/js/459-legacy.f3905f9c.js

File diff suppressed because one or more lines are too long

2
api/src/main/resources/static/js/459-legacy.e006098f.js.map → api/src/main/resources/static/js/459-legacy.f3905f9c.js.map

File diff suppressed because one or more lines are too long

2
api/src/main/resources/static/js/459.03157dea.js → api/src/main/resources/static/js/459.3cf4a06a.js

File diff suppressed because one or more lines are too long

2
api/src/main/resources/static/js/459.03157dea.js.map → api/src/main/resources/static/js/459.3cf4a06a.js.map

File diff suppressed because one or more lines are too long

2
api/src/main/resources/static/js/469-legacy.15ca5259.js → api/src/main/resources/static/js/469-legacy.b0c9ae4b.js

File diff suppressed because one or more lines are too long

2
api/src/main/resources/static/js/469-legacy.15ca5259.js.map → api/src/main/resources/static/js/469-legacy.b0c9ae4b.js.map

File diff suppressed because one or more lines are too long

2
api/src/main/resources/static/js/469.88db1032.js → api/src/main/resources/static/js/469.609a9412.js

File diff suppressed because one or more lines are too long

2
api/src/main/resources/static/js/469.88db1032.js.map → api/src/main/resources/static/js/469.609a9412.js.map

File diff suppressed because one or more lines are too long

2
api/src/main/resources/static/js/564.d209a2a0.js → api/src/main/resources/static/js/564.b084aa8c.js

File diff suppressed because one or more lines are too long

2
api/src/main/resources/static/js/564.d209a2a0.js.map → api/src/main/resources/static/js/564.b084aa8c.js.map

File diff suppressed because one or more lines are too long

2
api/src/main/resources/static/js/596-legacy.b305a8fd.js → api/src/main/resources/static/js/596-legacy.1d54812e.js

File diff suppressed because one or more lines are too long

2
api/src/main/resources/static/js/596-legacy.b305a8fd.js.map → api/src/main/resources/static/js/596-legacy.1d54812e.js.map

File diff suppressed because one or more lines are too long

2
api/src/main/resources/static/js/596.b510e94b.js → api/src/main/resources/static/js/596.c5d055fb.js

File diff suppressed because one or more lines are too long

2
api/src/main/resources/static/js/596.b510e94b.js.map → api/src/main/resources/static/js/596.c5d055fb.js.map

File diff suppressed because one or more lines are too long

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

File diff suppressed because one or more lines are too long

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

File diff suppressed because one or more lines are too long

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

File diff suppressed because one or more lines are too long

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

File diff suppressed because one or more lines are too long

2
api/src/main/resources/static/js/754-legacy.8ce78db0.js → api/src/main/resources/static/js/754-legacy.9cccfd52.js

File diff suppressed because one or more lines are too long

2
api/src/main/resources/static/js/754-legacy.8ce78db0.js.map → api/src/main/resources/static/js/754-legacy.9cccfd52.js.map

File diff suppressed because one or more lines are too long

2
api/src/main/resources/static/js/754.d964c8b8.js → api/src/main/resources/static/js/754.94f1d1eb.js

File diff suppressed because one or more lines are too long

2
api/src/main/resources/static/js/754.d964c8b8.js.map → api/src/main/resources/static/js/754.94f1d1eb.js.map

File diff suppressed because one or more lines are too long

2
api/src/main/resources/static/js/865-legacy.95ef57b0.js → api/src/main/resources/static/js/865-legacy.55e3080f.js

@ -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

2
api/src/main/resources/static/js/865-legacy.95ef57b0.js.map → api/src/main/resources/static/js/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":""}

2
api/src/main/resources/static/js/865.8a397b0a.js → api/src/main/resources/static/js/865.4a2f905b.js

@ -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

2
api/src/main/resources/static/js/865.8a397b0a.js.map → api/src/main/resources/static/js/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":""}

2
api/src/main/resources/static/js/99-legacy.0cf27260.js → api/src/main/resources/static/js/99-legacy.fcfcb9cd.js

@ -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

2
api/src/main/resources/static/js/99-legacy.0cf27260.js.map → api/src/main/resources/static/js/99-legacy.fcfcb9cd.js.map

File diff suppressed because one or more lines are too long

2
api/src/main/resources/static/js/99.810cec85.js → api/src/main/resources/static/js/99.e2e8211b.js

@ -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

2
api/src/main/resources/static/js/99.810cec85.js.map → api/src/main/resources/static/js/99.e2e8211b.js.map

File diff suppressed because one or more lines are too long

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

File diff suppressed because one or more lines are too long

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

File diff suppressed because one or more lines are too long

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

File diff suppressed because one or more lines are too long

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

File diff suppressed because one or more lines are too long

2
api/src/main/resources/static/js/app.969627b4.js

File diff suppressed because one or more lines are too long

1
api/src/main/resources/static/js/app.969627b4.js.map

File diff suppressed because one or more lines are too long

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

File diff suppressed because one or more lines are too long

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

File diff suppressed because one or more lines are too long

28
api/src/main/resources/static/js/chunk-vendors-legacy.2897f987.js

File diff suppressed because one or more lines are too long

1
api/src/main/resources/static/js/chunk-vendors-legacy.2897f987.js.map

File diff suppressed because one or more lines are too long

28
api/src/main/resources/static/js/chunk-vendors-legacy.ca7b1117.js

File diff suppressed because one or more lines are too long

1
api/src/main/resources/static/js/chunk-vendors-legacy.ca7b1117.js.map

File diff suppressed because one or more lines are too long

28
api/src/main/resources/static/js/chunk-vendors.34b8254e.js

File diff suppressed because one or more lines are too long

1
api/src/main/resources/static/js/chunk-vendors.34b8254e.js.map

File diff suppressed because one or more lines are too long

28
api/src/main/resources/static/js/chunk-vendors.c33500d9.js

File diff suppressed because one or more lines are too long

1
api/src/main/resources/static/js/chunk-vendors.c33500d9.js.map

File diff suppressed because one or more lines are too long

2
build.gradle

@ -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
}

1
core/build.gradle

@ -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"

8
core/src/main/java/com/databasir/core/domain/DomainErrors.java

@ -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;

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

@ -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);
}

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

@ -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

27
core/src/main/java/com/databasir/core/domain/document/data/TableResponse.java

@ -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;
}
}

31
core/src/main/java/com/databasir/core/domain/document/service/DocumentService.java

@ -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);
}
}
}

96
core/src/main/java/com/databasir/core/domain/mock/MockDataService.java

@ -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());
}
}

20
core/src/main/java/com/databasir/core/domain/mock/converter/MockDataRulePojoConverter.java

@ -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());
}
}

19
core/src/main/java/com/databasir/core/domain/mock/converter/MockDataRuleResponseConverter.java

@ -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);
}

27
core/src/main/java/com/databasir/core/domain/mock/data/ColumnMockRuleSaveRequest.java

@ -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;
}

11
core/src/main/java/com/databasir/core/domain/mock/data/MockDataGenerateCondition.java

@ -0,0 +1,11 @@
package com.databasir.core.domain.mock.data;
import lombok.Data;
@Data
public class MockDataGenerateCondition {
private Long version;
private Integer tableId;
}

11
core/src/main/java/com/databasir/core/domain/mock/data/MockDataRuleListCondition.java

@ -0,0 +1,11 @@
package com.databasir.core.domain.mock.data;
import lombok.Data;
@Data
public class MockDataRuleListCondition {
private Long version;
private Integer tableId;
}

23
core/src/main/java/com/databasir/core/domain/mock/data/MockDataRuleResponse.java

@ -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;
}

74
core/src/main/java/com/databasir/core/domain/mock/factory/AutoMockDataFactory.java

@ -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(), "''");
}
}

48
core/src/main/java/com/databasir/core/domain/mock/factory/FakerMockDataFactory.java

@ -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 "''";
}
}
}

36
core/src/main/java/com/databasir/core/domain/mock/factory/MockColumnRule.java

@ -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);
}
}

9
core/src/main/java/com/databasir/core/domain/mock/factory/MockDataFactory.java

@ -0,0 +1,9 @@
package com.databasir.core.domain.mock.factory;
public interface MockDataFactory {
boolean accept(MockColumnRule rule);
String create(MockColumnRule rule);
}

26
core/src/main/java/com/databasir/core/domain/mock/factory/ScriptMockDataFactory.java

@ -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());
}
}

16
core/src/main/java/com/databasir/core/domain/mock/generator/ColumnMockData.java

@ -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;
}

173
core/src/main/java/com/databasir/core/domain/mock/generator/MockDataContext.java

@ -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);
}
}

129
core/src/main/java/com/databasir/core/domain/mock/generator/MockDataGenerator.java

@ -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();
}
}

34
core/src/main/java/com/databasir/core/domain/mock/generator/TableMockData.java

@ -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));
}
}

14
core/src/main/java/com/databasir/core/domain/mock/script/MockScriptEvaluator.java

@ -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 {
}
}

21
core/src/main/java/com/databasir/core/domain/mock/script/SpelScriptEvaluator.java

@ -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);
}
}

127
core/src/main/java/com/databasir/core/domain/mock/validator/MockDataSaveValidator.java

@ -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());
}
}

52
core/src/main/java/com/databasir/core/domain/mock/validator/MockDataValidator.java

@ -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();
}
}

6
dao/build.gradle

@ -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 {

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

@ -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 changed in this diff

Loading…
Cancel
Save