From 6cc15ebedab8a65ec87c18fc286e114b84e8233d Mon Sep 17 00:00:00 2001
From: "meilin.huang" <954537473@qq.com>
Date: Tue, 26 Nov 2024 17:32:44 +0800
Subject: [PATCH] feat: tag refactor & other
---
frontend/{.eslintrc.js => .eslintrc.cjs} | 0
frontend/src/common/assert.ts | 7 +-
frontend/src/common/commonEnum.ts | 17 ++-
frontend/src/common/config.ts | 2 +-
frontend/src/views/flow/ProcdefEdit.vue | 4 +-
.../views/flow/flowbiz/dbms/DbSqlExecBiz.vue | 2 +-
.../flowbiz/dbms/DbSqlExecFlowBizForm.vue | 2 +-
frontend/src/views/home/Home.vue | 11 +-
.../ops/component/ResourceAuthCertEdit.vue | 8 +-
frontend/src/views/ops/component/TagTree.vue | 2 +-
.../src/views/ops/component/TagTreeCheck.vue | 2 +-
.../ops/component/TagTreeResourceSelect.vue | 2 +-
frontend/src/views/ops/component/tag.ts | 18 +--
frontend/src/views/ops/db/DbEdit.vue | 2 +-
frontend/src/views/ops/db/InstanceEdit.vue | 4 +-
frontend/src/views/ops/db/InstanceList.vue | 14 +-
frontend/src/views/ops/db/SqlExec.vue | 6 +-
.../views/ops/db/component/DbSelectTree.vue | 4 +-
.../db/component/sqleditor/DbSqlEditor.vue | 2 +-
.../ops/db/component/table/DbTableData.vue | 2 +-
.../ops/db/component/table/DbTableOp.vue | 2 +-
frontend/src/views/ops/db/db.ts | 69 +++++----
.../src/views/ops/machine/MachineList.vue | 4 +-
frontend/src/views/ops/machine/MachineOp.vue | 4 +-
.../views/ops/machine/cronjob/CronJobEdit.vue | 6 +-
.../ops/machine/security/CmdConfList.vue | 8 +-
frontend/src/views/ops/redis/RedisEdit.vue | 2 +-
frontend/src/views/ops/tag/TagTreeList.vue | 2 +-
frontend/src/views/ops/tag/api.ts | 2 +-
server/internal/db/api/db.go | 2 +-
server/internal/db/api/db_instance.go | 4 +-
server/internal/db/api/db_transfer.go | 16 +-
server/internal/db/application/db.go | 4 +-
server/internal/db/application/db_instance.go | 2 +-
server/internal/db/dbm/dbi/conn.go | 137 +++---------------
server/internal/db/dbm/dbi/dialect.go | 78 ++++++++++
server/internal/db/dbm/dm/helper.go | 56 +++++++
server/internal/db/dbm/mssql/helper.go | 1 +
server/internal/db/dbm/mysql/helper.go | 1 +
server/internal/db/dbm/oracle/helper.go | 1 +
server/internal/db/dbm/postgres/helper.go | 1 +
server/internal/db/dbm/sqlite/helper.go | 19 +--
server/internal/machine/api/dashbord.go | 3 +-
server/internal/machine/api/machine.go | 4 +-
.../internal/machine/application/machine.go | 4 +-
server/internal/mongo/api/mongo.go | 2 +-
server/internal/redis/api/redis.go | 26 ++--
server/internal/tag/api/tag_tree.go | 20 ++-
.../tag/application/resouce_auth_cert.go | 55 ++-----
.../tag/application/resource_op_log.go | 15 +-
server/internal/tag/application/tag_tree.go | 107 ++++++++++++--
.../internal/tag/application/tag_tree_test.go | 38 +++++
server/internal/tag/domain/entity/query.go | 23 ++-
server/internal/tag/domain/entity/tag_tree.go | 16 +-
server/internal/tag/router/tag_tree.go | 2 +-
server/pkg/config/app.go | 2 +-
server/resources/script/sql/v1.9/v1.9.2.sql | 3 +
57 files changed, 538 insertions(+), 314 deletions(-)
rename frontend/{.eslintrc.js => .eslintrc.cjs} (100%)
create mode 100644 server/internal/tag/application/tag_tree_test.go
create mode 100644 server/resources/script/sql/v1.9/v1.9.2.sql
diff --git a/frontend/.eslintrc.js b/frontend/.eslintrc.cjs
similarity index 100%
rename from frontend/.eslintrc.js
rename to frontend/.eslintrc.cjs
diff --git a/frontend/src/common/assert.ts b/frontend/src/common/assert.ts
index 16e8808e..a4c004cb 100644
--- a/frontend/src/common/assert.ts
+++ b/frontend/src/common/assert.ts
@@ -30,7 +30,12 @@ export function isTrue(condition: boolean, msg: string) {
* @param msg 错误消息
*/
export function notBlank(obj: any, msg: string) {
- isTrue(obj, msg);
+ if (obj == null || obj == undefined || obj == '') {
+ throw new AssertError(msg);
+ }
+ if (Array.isArray(obj) && obj.length == 0) {
+ throw new AssertError(msg);
+ }
}
/**
diff --git a/frontend/src/common/commonEnum.ts b/frontend/src/common/commonEnum.ts
index d320dd3d..9eae5aad 100644
--- a/frontend/src/common/commonEnum.ts
+++ b/frontend/src/common/commonEnum.ts
@@ -19,15 +19,22 @@ export const ResourceTypeEnum = {
// 标签关联的资源类型
export const TagResourceTypeEnum = {
- AuthCert: EnumValue.of(-2, '公共凭证').setExtra({ icon: 'Ticket' }),
+ PublicAuthCert: EnumValue.of(-2, '公共凭证').setExtra({ icon: 'Ticket' }),
Tag: EnumValue.of(-1, '标签').setExtra({ icon: 'CollectionTag' }),
Machine: ResourceTypeEnum.Machine,
- Db: ResourceTypeEnum.Db,
+ DbInstance: ResourceTypeEnum.Db,
Redis: ResourceTypeEnum.Redis,
Mongo: ResourceTypeEnum.Mongo,
+ AuthCert: EnumValue.of(5, '授权凭证').setExtra({ icon: 'Ticket', iconColor: 'var(--el-color-success)' }),
- MachineAuthCert: EnumValue.of(11, '机器-授权凭证').setExtra({ icon: 'Ticket', iconColor: 'var(--el-color-success)' }),
- DbAuthCert: EnumValue.of(21, '数据库-授权凭证').setExtra({ icon: 'Ticket', iconColor: 'var(--el-color-success)' }),
- DbName: EnumValue.of(22, '数据库').setExtra({ icon: 'Coin' }),
+ Db: EnumValue.of(22, '数据库').setExtra({ icon: 'Coin' }),
+};
+
+// 标签关联的资源类型路径
+export const TagResourceTypePath = {
+ MachineAuthCert: `${TagResourceTypeEnum.Machine.value}/${TagResourceTypeEnum.AuthCert.value}`,
+
+ DbInstanceAuthCert: `${TagResourceTypeEnum.DbInstance.value}/${TagResourceTypeEnum.AuthCert.value}`,
+ Db: `${TagResourceTypeEnum.DbInstance.value}/${TagResourceTypeEnum.AuthCert.value}/${TagResourceTypeEnum.Db.value}`,
};
diff --git a/frontend/src/common/config.ts b/frontend/src/common/config.ts
index ad716390..855e674b 100644
--- a/frontend/src/common/config.ts
+++ b/frontend/src/common/config.ts
@@ -15,7 +15,7 @@ const config = {
baseWsUrl: `${(window as any).globalConfig.BaseWsUrl || `${location.protocol == 'https:' ? 'wss:' : 'ws:'}//${getBaseApiUrl()}`}/api`,
// 系统版本
- version: 'v1.9.1',
+ version: 'v1.9.2',
};
export default config;
diff --git a/frontend/src/views/flow/ProcdefEdit.vue b/frontend/src/views/flow/ProcdefEdit.vue
index 94941be6..da3d6786 100755
--- a/frontend/src/views/flow/ProcdefEdit.vue
+++ b/frontend/src/views/flow/ProcdefEdit.vue
@@ -37,7 +37,7 @@
-
+
{{ $t('flow.approvalNode') }}
@@ -94,7 +94,7 @@ import Sortable from 'sortablejs';
import { randomUuid } from '../../common/utils/string';
import { ProcdefStatus } from './enums';
import TagTreeCheck from '../ops/component/TagTreeCheck.vue';
-import { TagResourceTypeEnum } from '@/common/commonEnum';
+import { TagResourceTypeEnum, TagResourceTypePath } from '@/common/commonEnum';
import EnumSelect from '@/components/enumselect/EnumSelect.vue';
import { useI18nFormValidate, useI18nPleaseInput, useI18nSaveSuccessMsg } from '@/hooks/useI18n';
import { useI18n } from 'vue-i18n';
diff --git a/frontend/src/views/flow/flowbiz/dbms/DbSqlExecBiz.vue b/frontend/src/views/flow/flowbiz/dbms/DbSqlExecBiz.vue
index 84916aad..50508561 100755
--- a/frontend/src/views/flow/flowbiz/dbms/DbSqlExecBiz.vue
+++ b/frontend/src/views/flow/flowbiz/dbms/DbSqlExecBiz.vue
@@ -95,7 +95,7 @@ const parseBizForm = async (bizFormStr: string) => {
const dbRes = await dbApi.dbs.request({ id: bizForm.dbId });
state.db = dbRes.list?.[0];
- tagApi.listByQuery.request({ type: TagResourceTypeEnum.DbName.value, codes: state.db.code }).then((res) => {
+ tagApi.listByQuery.request({ type: TagResourceTypeEnum.Db.value, codes: state.db.code }).then((res) => {
state.db.codePaths = res.map((item: any) => item.codePath);
});
};
diff --git a/frontend/src/views/flow/flowbiz/dbms/DbSqlExecFlowBizForm.vue b/frontend/src/views/flow/flowbiz/dbms/DbSqlExecFlowBizForm.vue
index ad9a360f..c43d8d2c 100755
--- a/frontend/src/views/flow/flowbiz/dbms/DbSqlExecFlowBizForm.vue
+++ b/frontend/src/views/flow/flowbiz/dbms/DbSqlExecFlowBizForm.vue
@@ -68,7 +68,7 @@ watch(
);
const changeResourceCode = async (db: any) => {
- emit('changeResourceCode', TagResourceTypeEnum.DbName.value, db.code);
+ emit('changeResourceCode', TagResourceTypeEnum.Db.value, db.code);
};
const validateBizForm = async () => {
diff --git a/frontend/src/views/home/Home.vue b/frontend/src/views/home/Home.vue
index cf07dc72..8153c2cf 100644
--- a/frontend/src/views/home/Home.vue
+++ b/frontend/src/views/home/Home.vue
@@ -122,7 +122,12 @@
-
+
{{ state.db.num }}
@@ -388,7 +393,7 @@ const handleAvatarSuccess = (response: any, uploadFile: any) => {
// 初始化数字滚动
const initData = async () => {
resourceOpLogApi.getAccountResourceOpLogs
- .request({ resourceType: TagResourceTypeEnum.MachineAuthCert.value, pageSize: state.defaultLogSize })
+ .request({ resourceType: TagResourceTypeEnum.Machine.value, pageSize: state.defaultLogSize })
.then(async (res: any) => {
const tagInfos = await getAllTagInfoByCodePaths(res.list?.map((item: any) => item.codePath));
state.machine.tagInfos = tagInfos;
@@ -396,7 +401,7 @@ const initData = async () => {
});
resourceOpLogApi.getAccountResourceOpLogs
- .request({ resourceType: TagResourceTypeEnum.DbName.value, pageSize: state.defaultLogSize })
+ .request({ resourceType: TagResourceTypeEnum.DbInstance.value, pageSize: state.defaultLogSize })
.then(async (res: any) => {
const tagInfos = await getAllTagInfoByCodePaths(res.list?.map((item: any) => item.codePath));
state.db.tagInfos = tagInfos;
diff --git a/frontend/src/views/ops/component/ResourceAuthCertEdit.vue b/frontend/src/views/ops/component/ResourceAuthCertEdit.vue
index 0f60023d..5809c095 100644
--- a/frontend/src/views/ops/component/ResourceAuthCertEdit.vue
+++ b/frontend/src/views/ops/component/ResourceAuthCertEdit.vue
@@ -38,7 +38,11 @@
:value="TagResourceTypeEnum.Machine.value"
/>
-
+
],
+ type: [Number, Array, String, Array],
default: TagResourceTypeEnum.Tag.value,
},
nodeKey: {
diff --git a/frontend/src/views/ops/component/TagTreeResourceSelect.vue b/frontend/src/views/ops/component/TagTreeResourceSelect.vue
index 0c87f86c..9bfc534e 100644
--- a/frontend/src/views/ops/component/TagTreeResourceSelect.vue
+++ b/frontend/src/views/ops/component/TagTreeResourceSelect.vue
@@ -43,7 +43,7 @@ import { tagApi } from '../tag/api';
const props = defineProps({
resourceType: {
- type: [Number],
+ type: [Number, String],
required: true,
},
tagPathNodeType: {
diff --git a/frontend/src/views/ops/component/tag.ts b/frontend/src/views/ops/component/tag.ts
index 53ca42cc..8ff34937 100644
--- a/frontend/src/views/ops/component/tag.ts
+++ b/frontend/src/views/ops/component/tag.ts
@@ -1,7 +1,7 @@
-import {OptionsApi, SearchItem} from '@/components/SearchForm';
-import {ContextmenuItem} from '@/components/contextmenu';
-import {TagResourceTypeEnum} from '@/common/commonEnum';
-import {tagApi} from '../tag/api';
+import { OptionsApi, SearchItem } from '@/components/SearchForm';
+import { ContextmenuItem } from '@/components/contextmenu';
+import { TagResourceTypeEnum } from '@/common/commonEnum';
+import { tagApi } from '../tag/api';
export class TagTreeNode {
/**
@@ -160,9 +160,9 @@ export class NodeType {
* @param resourceType 资源类型
* @returns
*/
-export function getTagPathSearchItem(resourceType: number) {
+export function getTagPathSearchItem(resourceType: any) {
return SearchItem.select('tagPath', 'common.tag').withOptionsApi(
- OptionsApi.new(tagApi.getResourceTagPaths, {resourceType}).withConvertFn((res: any) => {
+ OptionsApi.new(tagApi.getResourceTagPaths, { resourceType }).withConvertFn((res: any) => {
return res.map((x: any) => {
return {
label: x,
@@ -180,7 +180,7 @@ export function getTagPathSearchItem(resourceType: number) {
*/
export function getTagTypeCodeByPath(codePath: string) {
const result: any = {};
- if (!codePath) return result
+ if (!codePath) return result;
const parts = codePath.split('/'); // 切分字符串并保留数字和对应的值部分
for (let part of parts) {
@@ -208,7 +208,7 @@ export function getTagTypeCodeByPath(codePath: string) {
* @returns
*/
export async function getAllTagInfoByCodePaths(codePaths: string[]) {
- if (!codePaths) return
+ if (!codePaths) return;
const allTypeAndCode: any = {};
for (let codePath of codePaths) {
@@ -222,7 +222,7 @@ export async function getAllTagInfoByCodePaths(codePaths: string[]) {
if (type == TagResourceTypeEnum.Tag.value) {
continue;
}
- const tagInfo = await tagApi.listByQuery.request({type: type, codes: allTypeAndCode[type]});
+ const tagInfo = await tagApi.listByQuery.request({ type: type, codes: allTypeAndCode[type] });
allTypeAndCode[type] = tagInfo;
}
diff --git a/frontend/src/views/ops/db/DbEdit.vue b/frontend/src/views/ops/db/DbEdit.vue
index 65d92c61..adc8793b 100644
--- a/frontend/src/views/ops/db/DbEdit.vue
+++ b/frontend/src/views/ops/db/DbEdit.vue
@@ -198,7 +198,7 @@ const getAuthCerts = async () => {
const inst: any = props.instance;
const res = await resourceAuthCertApi.listByQuery.request({
resourceCode: inst.code,
- resourceType: TagResourceTypeEnum.Db.value,
+ resourceType: TagResourceTypeEnum.DbInstance.value,
pageSize: 100,
});
state.authCerts = res.list || [];
diff --git a/frontend/src/views/ops/db/InstanceEdit.vue b/frontend/src/views/ops/db/InstanceEdit.vue
index bbd37d0b..21bc8b2f 100644
--- a/frontend/src/views/ops/db/InstanceEdit.vue
+++ b/frontend/src/views/ops/db/InstanceEdit.vue
@@ -89,7 +89,7 @@
{
const btnOk = async () => {
await useI18nFormValidate(dbForm);
state.submitForm = await getReqForm();
+ notBlankI18n(state.submitForm.authCerts, 'db.acName');
await saveInstanceExec();
useI18nSaveSuccessMsg();
state.form.id = saveInstanceRes as any;
diff --git a/frontend/src/views/ops/db/InstanceList.vue b/frontend/src/views/ops/db/InstanceList.vue
index be64348e..13792207 100644
--- a/frontend/src/views/ops/db/InstanceList.vue
+++ b/frontend/src/views/ops/db/InstanceList.vue
@@ -13,9 +13,9 @@
>
{{ $t('common.create') }}
- {{
- $t('common.delete')
- }}
+
+ {{ $t('common.delete') }}
+
@@ -76,7 +76,6 @@