fix: 工单流程信息展示问题修复

This commit is contained in:
meilin.huang
2024-06-24 17:17:57 +08:00
parent f43851698e
commit 10630847df
14 changed files with 62 additions and 50 deletions

View File

@@ -10,20 +10,20 @@
}, },
"dependencies": { "dependencies": {
"@element-plus/icons-vue": "^2.3.1", "@element-plus/icons-vue": "^2.3.1",
"@vueuse/core": "^10.10.0", "@vueuse/core": "^10.11.0",
"asciinema-player": "^3.7.1", "asciinema-player": "^3.8.0",
"axios": "^1.6.2", "axios": "^1.6.2",
"clipboard": "^2.0.11", "clipboard": "^2.0.11",
"cropperjs": "^1.6.1", "cropperjs": "^1.6.1",
"dayjs": "^1.11.11", "dayjs": "^1.11.11",
"echarts": "^5.5.0", "echarts": "^5.5.0",
"element-plus": "^2.7.4", "element-plus": "^2.7.6",
"js-base64": "^3.7.7", "js-base64": "^3.7.7",
"jsencrypt": "^3.3.2", "jsencrypt": "^3.3.2",
"lodash": "^4.17.21", "lodash": "^4.17.21",
"mitt": "^3.0.1", "mitt": "^3.0.1",
"monaco-editor": "^0.49.0", "monaco-editor": "^0.50.0",
"monaco-sql-languages": "^0.12.0", "monaco-sql-languages": "^0.12.2",
"monaco-themes": "^0.4.4", "monaco-themes": "^0.4.4",
"nprogress": "^0.2.0", "nprogress": "^0.2.0",
"pinia": "^2.1.7", "pinia": "^2.1.7",
@@ -34,8 +34,8 @@
"sql-formatter": "^15.0.2", "sql-formatter": "^15.0.2",
"trzsz": "^1.1.5", "trzsz": "^1.1.5",
"uuid": "^9.0.1", "uuid": "^9.0.1",
"vue": "^3.4.27", "vue": "^3.4.30",
"vue-router": "^4.3.2", "vue-router": "^4.4.0",
"xterm": "^5.3.0", "xterm": "^5.3.0",
"xterm-addon-fit": "^0.8.0", "xterm-addon-fit": "^0.8.0",
"xterm-addon-search": "^0.13.0", "xterm-addon-search": "^0.13.0",
@@ -49,15 +49,15 @@
"@typescript-eslint/eslint-plugin": "^6.7.4", "@typescript-eslint/eslint-plugin": "^6.7.4",
"@typescript-eslint/parser": "^6.7.4", "@typescript-eslint/parser": "^6.7.4",
"@vitejs/plugin-vue": "^5.0.4", "@vitejs/plugin-vue": "^5.0.4",
"@vue/compiler-sfc": "^3.4.27", "@vue/compiler-sfc": "^3.4.30",
"code-inspector-plugin": "^0.4.5", "code-inspector-plugin": "^0.4.5",
"dotenv": "^16.3.1", "dotenv": "^16.3.1",
"eslint": "^8.35.0", "eslint": "^8.35.0",
"eslint-plugin-vue": "^9.25.0", "eslint-plugin-vue": "^9.25.0",
"prettier": "^3.2.5", "prettier": "^3.2.5",
"sass": "^1.77.1", "sass": "^1.77.6",
"typescript": "^5.4.5", "typescript": "^5.5.2",
"vite": "^5.2.12", "vite": "^5.3.1",
"vue-eslint-parser": "^9.4.2" "vue-eslint-parser": "^9.4.2"
}, },
"browserslist": [ "browserslist": [

View File

@@ -15,7 +15,7 @@ const config = {
baseWsUrl: `${(window as any).globalConfig.BaseWsUrl || `${location.protocol == 'https:' ? 'wss:' : 'ws:'}//${getBaseApiUrl()}`}/api`, baseWsUrl: `${(window as any).globalConfig.BaseWsUrl || `${location.protocol == 'https:' ? 'wss:' : 'ws:'}//${getBaseApiUrl()}`}/api`,
// 系统版本 // 系统版本
version: 'v1.8.7', version: 'v1.8.8',
}; };
export default config; export default config;

View File

@@ -1,16 +1,13 @@
<template> <template>
<div> <div>
<el-descriptions :column="3" border> <el-descriptions :column="3" border>
<el-descriptions-item :span="2" label="名称">{{ db?.name }}</el-descriptions-item> <el-descriptions-item :span="3" label="标签"><TagCodePath :path="db.codePaths" /></el-descriptions-item>
<el-descriptions-item :span="1" label="id">{{ db?.id }}</el-descriptions-item>
<el-descriptions-item :span="3" label="关联标签"><ResourceTags :tags="db.tags" /></el-descriptions-item>
<el-descriptions-item :span="1" label="名称">{{ db?.name }}</el-descriptions-item>
<el-descriptions-item :span="1" label="主机">{{ `${db?.host}:${db?.port}` }}</el-descriptions-item> <el-descriptions-item :span="1" label="主机">{{ `${db?.host}:${db?.port}` }}</el-descriptions-item>
<el-descriptions-item :span="1" label="类型"> <el-descriptions-item :span="1" label="类型">
<SvgIcon :name="getDbDialect(db?.type).getInfo().icon" :size="20" />{{ db?.type }} <SvgIcon :name="getDbDialect(db?.type).getInfo().icon" :size="20" />{{ db?.type }}
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item :span="1" label="用户名">{{ db?.username }}</el-descriptions-item>
<el-descriptions-item label="数据库">{{ sqlExec.db }}</el-descriptions-item> <el-descriptions-item label="数据库">{{ sqlExec.db }}</el-descriptions-item>
<el-descriptions-item label="表"> <el-descriptions-item label="表">
@@ -33,7 +30,9 @@ import { dbApi } from '@/views/ops/db/api';
import { DbSqlExecTypeEnum } from '@/views/ops/db/enums'; import { DbSqlExecTypeEnum } from '@/views/ops/db/enums';
import MonacoEditor from '@/components/monaco/MonacoEditor.vue'; import MonacoEditor from '@/components/monaco/MonacoEditor.vue';
import { getDbDialect } from '@/views/ops/db/dialect'; import { getDbDialect } from '@/views/ops/db/dialect';
import ResourceTags from '@/views/ops/component/ResourceTags.vue'; import { tagApi } from '@/views/ops/tag/api';
import { TagResourceTypeEnum } from '@/common/commonEnum';
import TagCodePath from '@/views/ops/component/TagCodePath.vue';
const props = defineProps({ const props = defineProps({
// 业务key // 业务key
@@ -74,6 +73,10 @@ const getDbSqlExec = async (bizKey: string) => {
state.sqlExec = res.list?.[0]; state.sqlExec = res.list?.[0];
const dbRes = await dbApi.dbs.request({ id: state.sqlExec.dbId }); const dbRes = await dbApi.dbs.request({ id: state.sqlExec.dbId });
state.db = dbRes.list?.[0]; state.db = dbRes.list?.[0];
tagApi.listByQuery.request({ type: TagResourceTypeEnum.DbName.value, codes: state.db.code }).then((res) => {
state.db.codePaths = res.map((item: any) => item.codePath);
});
}; };
</script> </script>
<style lang="scss"></style> <style lang="scss"></style>

View File

@@ -1,11 +1,10 @@
<template> <template>
<div> <div>
<el-descriptions :column="3" border> <el-descriptions :column="3" border>
<el-descriptions-item :span="1" label="名称">{{ redis?.name }}</el-descriptions-item> <el-descriptions-item :span="3" label="标签"><TagCodePath :path="redis.codePaths" /></el-descriptions-item>
<el-descriptions-item :span="1" label="id">{{ redis?.id }}</el-descriptions-item>
<el-descriptions-item :span="1" label="用户名">{{ redis?.username }}</el-descriptions-item>
<el-descriptions-item :span="3" label="关联标签"><ResourceTags :tags="redis.tags" /></el-descriptions-item> <el-descriptions-item :span="2" label="编号">{{ redis?.code }}</el-descriptions-item>
<el-descriptions-item :span="1" label="名称">{{ redis?.name }}</el-descriptions-item>
<el-descriptions-item :span="1" label="主机">{{ `${redis?.host}` }}</el-descriptions-item> <el-descriptions-item :span="1" label="主机">{{ `${redis?.host}` }}</el-descriptions-item>
<el-descriptions-item :span="1" label="库">{{ state.db }}</el-descriptions-item> <el-descriptions-item :span="1" label="库">{{ state.db }}</el-descriptions-item>
@@ -22,8 +21,10 @@
<script lang="ts" setup> <script lang="ts" setup>
import { toRefs, reactive, watch, onMounted } from 'vue'; import { toRefs, reactive, watch, onMounted } from 'vue';
import ResourceTags from '@/views/ops/component/ResourceTags.vue';
import { redisApi } from '@/views/ops/redis/api'; import { redisApi } from '@/views/ops/redis/api';
import TagCodePath from '@/views/ops/component/TagCodePath.vue';
import { tagApi } from '@/views/ops/tag/api';
import { TagResourceTypeEnum } from '@/common/commonEnum';
const props = defineProps({ const props = defineProps({
// 业务表单 // 业务表单
@@ -75,6 +76,10 @@ const parseRunCmdForm = async (bizForm: string) => {
return; return;
} }
state.redis = res.list?.[0]; state.redis = res.list?.[0];
tagApi.listByQuery.request({ type: TagResourceTypeEnum.Redis.value, codes: state.redis.code }).then((res) => {
state.redis.codePaths = res.map((item: any) => item.codePath);
});
}; };
</script> </script>
<style lang="scss"></style> <style lang="scss"></style>

View File

@@ -222,7 +222,7 @@
import { defineAsyncComponent, h, onBeforeUnmount, onMounted, reactive, ref, toRefs, watch } from 'vue'; import { defineAsyncComponent, h, onBeforeUnmount, onMounted, reactive, ref, toRefs, watch } from 'vue';
import { ElCheckbox, ElMessage, ElMessageBox } from 'element-plus'; import { ElCheckbox, ElMessage, ElMessageBox } from 'element-plus';
import { formatByteSize } from '@/common/utils/format'; import { formatByteSize } from '@/common/utils/format';
import { DbInst, registerDbCompletionItemProvider, TabInfo, TabType } from './db'; import { DbInst, DbThemeConfig, registerDbCompletionItemProvider, TabInfo, TabType } from './db';
import { NodeType, TagTreeNode, getTagTypeCodeByPath } from '../component/tag'; import { NodeType, TagTreeNode, getTagTypeCodeByPath } from '../component/tag';
import TagTree from '../component/TagTree.vue'; import TagTree from '../component/TagTree.vue';
import { dbApi } from './api'; import { dbApi } from './api';
@@ -505,7 +505,7 @@ const state = reactive({
const { nowDbInst, tableCreateDialog } = toRefs(state); const { nowDbInst, tableCreateDialog } = toRefs(state);
const dbConfig = useStorage('dbConfig', { showColumnComment: false, locationTreeNode: false }); const dbConfig = useStorage('dbConfig', DbThemeConfig);
const serverInfoReqParam = ref({ const serverInfoReqParam = ref({
instanceId: 0, instanceId: 0,

View File

@@ -156,7 +156,7 @@
import { onBeforeUnmount, onMounted, reactive, ref, toRefs, watch } from 'vue'; import { onBeforeUnmount, onMounted, reactive, ref, toRefs, watch } from 'vue';
import { ElInput, ElMessage } from 'element-plus'; import { ElInput, ElMessage } from 'element-plus';
import { copyToClipboard } from '@/common/utils/string'; import { copyToClipboard } from '@/common/utils/string';
import { DbInst } from '@/views/ops/db/db'; import { DbInst, DbThemeConfig } from '@/views/ops/db/db';
import { Contextmenu, ContextmenuItem } from '@/components/contextmenu'; import { Contextmenu, ContextmenuItem } from '@/components/contextmenu';
import SvgIcon from '@/components/svgIcon/index.vue'; import SvgIcon from '@/components/svgIcon/index.vue';
import { exportCsv, exportFile } from '@/common/utils/export'; import { exportCsv, exportFile } from '@/common/utils/export';
@@ -363,7 +363,7 @@ const state = reactive({
const { tableHeight, datas } = toRefs(state); const { tableHeight, datas } = toRefs(state);
const dbConfig = useStorage('dbConfig', { showColumnComment: false }); const dbConfig = useStorage('dbConfig', DbThemeConfig);
/** /**
* 行号字段列 * 行号字段列

View File

@@ -50,22 +50,6 @@
</el-tooltip> </el-tooltip>
<el-divider direction="vertical" border-style="dashed" /> <el-divider direction="vertical" border-style="dashed" />
<!-- 表数据展示配置 -->
<el-popover
popper-style="max-height: 550px; overflow: auto; max-width: 450px"
placement="bottom"
width="auto"
title="展示配置"
trigger="click"
>
<el-checkbox v-model="dbConfig.showColumnComment" label="显示字段备注" :true-value="true" :false-value="false" size="small" />
<template #reference>
<el-link type="primary" icon="setting" :underline="false"></el-link>
</template>
</el-popover>
<el-divider direction="vertical" border-style="dashed" />
<el-tooltip :show-after="500" v-if="hasUpdatedFileds" class="box-item" effect="dark" content="提交修改" placement="top"> <el-tooltip :show-after="500" v-if="hasUpdatedFileds" class="box-item" effect="dark" content="提交修改" placement="top">
<el-link @click="submitUpdateFields()" type="success" :underline="false" class="font12">提交</el-link> <el-link @click="submitUpdateFields()" type="success" :underline="false" class="font12">提交</el-link>
</el-tooltip> </el-tooltip>
@@ -258,7 +242,7 @@ import { DbInst } from '@/views/ops/db/db';
import DbTableData from './DbTableData.vue'; import DbTableData from './DbTableData.vue';
import { DbDialect } from '@/views/ops/db/dialect'; import { DbDialect } from '@/views/ops/db/dialect';
import SvgIcon from '@/components/svgIcon/index.vue'; import SvgIcon from '@/components/svgIcon/index.vue';
import { useEventListener, useStorage } from '@vueuse/core'; import { useEventListener } from '@vueuse/core';
import { copyToClipboard, fuzzyMatchField } from '@/common/utils/string'; import { copyToClipboard, fuzzyMatchField } from '@/common/utils/string';
import DbTableDataForm from './DbTableDataForm.vue'; import DbTableDataForm from './DbTableDataForm.vue';
@@ -288,8 +272,6 @@ const condDialogInputRef: Ref = ref(null);
const defaultPageSize = DbInst.DefaultLimit; const defaultPageSize = DbInst.DefaultLimit;
const dbConfig = useStorage('dbConfig', { showColumnComment: false });
const state = reactive({ const state = reactive({
datas: [], datas: [],
sql: '', // 当前数据tab执行的sql sql: '', // 当前数据tab执行的sql

View File

@@ -842,3 +842,18 @@ function getTableName4SqlCtx(sql: string, alias: string = '', defaultDb: string)
return tables.length > 0 ? tables[0] : undefined; return tables.length > 0 ? tables[0] : undefined;
} }
} }
/**
* 数据库主题配置
*/
export const DbThemeConfig = {
/**
* 表数据表头是否显示备注
*/
showColumnComment: true,
/**
* 是否自动定位至树节点
*/
locationTreeNode: true,
};

View File

@@ -17,7 +17,7 @@ require (
github.com/go-sql-driver/mysql v1.8.1 github.com/go-sql-driver/mysql v1.8.1
github.com/golang-jwt/jwt/v5 v5.2.1 github.com/golang-jwt/jwt/v5 v5.2.1
github.com/google/uuid v1.6.0 github.com/google/uuid v1.6.0
github.com/gorilla/websocket v1.5.1 github.com/gorilla/websocket v1.5.3
github.com/kanzihuang/vitess/go/vt/sqlparser v0.0.0-20231018071450-ac8d9f0167e9 github.com/kanzihuang/vitess/go/vt/sqlparser v0.0.0-20231018071450-ac8d9f0167e9
github.com/lionsoul2014/ip2region/binding/golang v0.0.0-20230712084735-068dc2aee82d github.com/lionsoul2014/ip2region/binding/golang v0.0.0-20230712084735-068dc2aee82d
github.com/may-fly/cast v1.6.1 github.com/may-fly/cast v1.6.1
@@ -26,7 +26,7 @@ require (
github.com/pkg/errors v0.9.1 github.com/pkg/errors v0.9.1
github.com/pkg/sftp v1.13.6 github.com/pkg/sftp v1.13.6
github.com/pquerna/otp v1.4.0 github.com/pquerna/otp v1.4.0
github.com/redis/go-redis/v9 v9.5.1 github.com/redis/go-redis/v9 v9.5.3
github.com/robfig/cron/v3 v3.0.1 // github.com/robfig/cron/v3 v3.0.1 //
github.com/sijms/go-ora/v2 v2.8.19 github.com/sijms/go-ora/v2 v2.8.19
github.com/stretchr/testify v1.9.0 github.com/stretchr/testify v1.9.0

View File

@@ -66,6 +66,7 @@ func (d *Db) Dbs(rc *req.Ctx) {
for _, dbvo := range dbvos { for _, dbvo := range dbvos {
di := instancesMap[dbvo.InstanceId] di := instancesMap[dbvo.InstanceId]
if di != nil { if di != nil {
dbvo.InstanceCode = di.Code
dbvo.InstanceType = di.Type dbvo.InstanceType = di.Type
dbvo.Host = di.Host dbvo.Host = di.Host
dbvo.Port = di.Port dbvo.Port = di.Port

View File

@@ -15,6 +15,7 @@ type DbListVO struct {
InstanceId uint64 `json:"instanceId"` InstanceId uint64 `json:"instanceId"`
AuthCertName string `json:"authCertName"` AuthCertName string `json:"authCertName"`
InstanceCode string `json:"instanceCode" gorm:"-"`
InstanceType string `json:"type" gorm:"-"` InstanceType string `json:"type" gorm:"-"`
Host string `json:"host" gorm:"-"` Host string `json:"host" gorm:"-"`
Port int `json:"port" gorm:"-"` Port int `json:"port" gorm:"-"`

View File

@@ -17,6 +17,6 @@ func newDbRepo() repository.Db {
// 分页获取数据库信息列表 // 分页获取数据库信息列表
func (d *dbRepoImpl) GetDbList(condition *entity.DbQuery, pageParam *model.PageParam, toEntity any, orderBy ...string) (*model.PageResult[any], error) { func (d *dbRepoImpl) GetDbList(condition *entity.DbQuery, pageParam *model.PageParam, toEntity any, orderBy ...string) (*model.PageResult[any], error) {
pd := model.NewCond().Eq("instance_id", condition.InstanceId).In("code", condition.Codes) pd := model.NewCond().Eq("instance_id", condition.InstanceId).In("code", condition.Codes).Eq("id", condition.Id)
return d.PageByCondToAny(pd, pageParam, toEntity) return d.PageByCondToAny(pd, pageParam, toEntity)
} }

View File

@@ -82,6 +82,11 @@ func (p *TagTree) ListByQuery(rc *req.Ctx) {
cond.CodePaths = strings.Split(tagPaths, ",") cond.CodePaths = strings.Split(tagPaths, ",")
} }
cond.Id = uint64(rc.QueryInt("id")) cond.Id = uint64(rc.QueryInt("id"))
cond.Type = entity.TagType(rc.QueryInt("type"))
codes := rc.Query("codes")
if codes != "" {
cond.Codes = strings.Split(codes, ",")
}
var tagTrees []entity.TagTree var tagTrees []entity.TagTree
p.TagTreeApp.ListByQuery(cond, &tagTrees) p.TagTreeApp.ListByQuery(cond, &tagTrees)

View File

@@ -4,7 +4,7 @@ import "fmt"
const ( const (
AppName = "mayfly-go" AppName = "mayfly-go"
Version = "v1.8.7" Version = "v1.8.8"
) )
func GetAppInfo() string { func GetAppInfo() string {