From fd99b4379859536e63a471499a8cc937cce47004 Mon Sep 17 00:00:00 2001 From: tiny-craft <137850705+tiny-craft@users.noreply.github.com> Date: Mon, 30 Oct 2023 00:54:45 +0800 Subject: [PATCH] feat: add display of content length and size info --- backend/services/connection_service.go | 21 ++++++++----- .../src/components/content/ContentPane.vue | 2 ++ .../content_value/ContentValueHash.vue | 30 +++++++++++++----- .../content_value/ContentValueList.vue | 30 +++++++++++++----- .../content_value/ContentValueSet.vue | 30 +++++++++++++----- .../content_value/ContentValueStream.vue | 31 ++++++++++++++----- .../content_value/ContentValueString.vue | 9 ++++-- .../content_value/ContentValueWrapper.vue | 2 ++ .../content_value/ContentValueZSet.vue | 30 +++++++++++++----- frontend/src/langs/en.json | 4 ++- frontend/src/langs/zh-cn.json | 4 ++- frontend/src/stores/connections.js | 4 ++- frontend/src/stores/tab.js | 5 ++- frontend/src/styles/style.scss | 4 --- 14 files changed, 148 insertions(+), 58 deletions(-) diff --git a/backend/services/connection_service.go b/backend/services/connection_service.go index 336eac0..fad3c80 100644 --- a/backend/services/connection_service.go +++ b/backend/services/connection_service.go @@ -825,17 +825,19 @@ func (c *connectionService) GetKeyValue(connName string, db int, k any, viewAs, } var value any - var size int64 + var size, length int64 var cursor uint64 switch strings.ToLower(keyType) { case "string": var str string str, err = client.Get(ctx, key).Result() value, decodeType, viewAs = strutil.ConvertTo(str, decodeType, viewAs) - size, _ = client.StrLen(ctx, key).Result() + length, _ = client.StrLen(ctx, key).Result() + size, _ = client.MemoryUsage(ctx, key, 0).Result() case "list": value, err = client.LRange(ctx, key, 0, -1).Result() - size, _ = client.LLen(ctx, key).Result() + length, _ = client.LLen(ctx, key).Result() + size, _ = client.MemoryUsage(ctx, key, 0).Result() case "hash": //value, err = client.HGetAll(ctx, key).Result() items := map[string]string{} @@ -855,7 +857,8 @@ func (c *connectionService) GetKeyValue(connName string, db int, k any, viewAs, } } value = items - size, _ = client.HLen(ctx, key).Result() + length, _ = client.HLen(ctx, key).Result() + size, _ = client.MemoryUsage(ctx, key, 0).Result() case "set": //value, err = client.SMembers(ctx, key).Result() items := []string{} @@ -873,7 +876,8 @@ func (c *connectionService) GetKeyValue(connName string, db int, k any, viewAs, } } value = items - size, _ = client.SCard(ctx, key).Result() + length, _ = client.SCard(ctx, key).Result() + size, _ = client.MemoryUsage(ctx, key, 0).Result() case "zset": //value, err = client.ZRangeWithScores(ctx, key, 0, -1).Result() var items []types.ZSetItem @@ -899,7 +903,8 @@ func (c *connectionService) GetKeyValue(connName string, db int, k any, viewAs, } } value = items - size, _ = client.ZCard(ctx, key).Result() + length, _ = client.ZCard(ctx, key).Result() + size, _ = client.MemoryUsage(ctx, key, 0).Result() case "stream": var msgs []redis.XMessage items := []types.StreamItem{} @@ -915,7 +920,8 @@ func (c *connectionService) GetKeyValue(connName string, db int, k any, viewAs, }) } value = items - size, _ = client.XLen(ctx, key).Result() + length, _ = client.XLen(ctx, key).Result() + size, _ = client.MemoryUsage(ctx, key, 0).Result() } if err != nil { resp.Msg = err.Error() @@ -927,6 +933,7 @@ func (c *connectionService) GetKeyValue(connName string, db int, k any, viewAs, "ttl": ttl, "value": value, "size": size, + "length": length, "viewAs": viewAs, "decode": decodeType, } diff --git a/frontend/src/components/content/ContentPane.vue b/frontend/src/components/content/ContentPane.vue index c60b270..5432573 100644 --- a/frontend/src/components/content/ContentPane.vue +++ b/frontend/src/components/content/ContentPane.vue @@ -50,6 +50,7 @@ const tabContent = computed(() => { ttl: tab.ttl, value: tab.value, size: tab.size || 0, + length: tab.length || 0, viewAs: tab.viewAs, decode: tab.decode, } @@ -131,6 +132,7 @@ watch( :decode="tabContent.decode" :key-code="tabContent.keyCode" :key-path="tabContent.keyPath" + :length="tabContent.length" :name="tabContent.name" :size="tabContent.size" :ttl="tabContent.ttl" diff --git a/frontend/src/components/content_value/ContentValueHash.vue b/frontend/src/components/content_value/ContentValueHash.vue index dbf1f53..9cf5694 100644 --- a/frontend/src/components/content_value/ContentValueHash.vue +++ b/frontend/src/components/content_value/ContentValueHash.vue @@ -3,14 +3,17 @@ import { computed, h, reactive, ref } from 'vue' import { useI18n } from 'vue-i18n' import ContentToolbar from './ContentToolbar.vue' import AddLink from '@/components/icons/AddLink.vue' -import { NButton, NCode, NIcon, NInput } from 'naive-ui' +import { NButton, NCode, NIcon, NInput, useThemeVars } from 'naive-ui' import { types, types as redisTypes } from '@/consts/support_redis_type.js' import EditableTableColumn from '@/components/common/EditableTableColumn.vue' import useDialogStore from 'stores/dialog.js' import useConnectionStore from 'stores/connections.js' import { isEmpty } from 'lodash' +import bytes from 'bytes' const i18n = useI18n() +const themeVars = useThemeVars() + const props = defineProps({ name: String, db: Number, @@ -25,6 +28,7 @@ const props = defineProps({ }, value: Object, size: Number, + length: Number, }) /** @@ -259,8 +263,9 @@ const onUpdateFilter = (filters, sourceColumn) => { :key-path="props.keyPath" :key-type="keyType" :server="props.name" - :ttl="ttl" /> -
+ :ttl="ttl" + class="value-item-part" /> +
{ @update:value="onFilterInput" />
-
- {{ $t('interface.total', { size: props.size }) }} -
+
- + diff --git a/frontend/src/components/content_value/ContentValueList.vue b/frontend/src/components/content_value/ContentValueList.vue index 23251ad..3ef6e19 100644 --- a/frontend/src/components/content_value/ContentValueList.vue +++ b/frontend/src/components/content_value/ContentValueList.vue @@ -3,14 +3,17 @@ import { computed, h, reactive, ref } from 'vue' import { useI18n } from 'vue-i18n' import ContentToolbar from './ContentToolbar.vue' import AddLink from '@/components/icons/AddLink.vue' -import { NButton, NCode, NIcon, NInput } from 'naive-ui' +import { NButton, NCode, NIcon, NInput, useThemeVars } from 'naive-ui' import { isEmpty, size } from 'lodash' import { types, types as redisTypes } from '@/consts/support_redis_type.js' import EditableTableColumn from '@/components/common/EditableTableColumn.vue' import useDialogStore from 'stores/dialog.js' import useConnectionStore from 'stores/connections.js' +import bytes from 'bytes' const i18n = useI18n() +const themeVars = useThemeVars() + const props = defineProps({ name: String, db: Number, @@ -25,6 +28,7 @@ const props = defineProps({ }, value: Object, size: Number, + length: Number, }) /** @@ -191,8 +195,9 @@ const onUpdateFilter = (filters, sourceColumn) => { :key-path="props.keyPath" :key-type="keyType" :server="props.name" - :ttl="ttl" /> -
+ :ttl="ttl" + class="value-item-part" /> +
{ @clear="clearFilter" @update:value="onFilterInput" />
-
- {{ $t('interface.total', { size: props.size }) }} -
+
- + diff --git a/frontend/src/components/content_value/ContentValueSet.vue b/frontend/src/components/content_value/ContentValueSet.vue index 35c973a..fa66c4e 100644 --- a/frontend/src/components/content_value/ContentValueSet.vue +++ b/frontend/src/components/content_value/ContentValueSet.vue @@ -3,14 +3,17 @@ import { computed, h, reactive, ref } from 'vue' import { useI18n } from 'vue-i18n' import ContentToolbar from './ContentToolbar.vue' import AddLink from '@/components/icons/AddLink.vue' -import { NButton, NCode, NIcon, NInput } from 'naive-ui' +import { NButton, NCode, NIcon, NInput, useThemeVars } from 'naive-ui' import { isEmpty, size } from 'lodash' import useDialogStore from 'stores/dialog.js' import { types, types as redisTypes } from '@/consts/support_redis_type.js' import EditableTableColumn from '@/components/common/EditableTableColumn.vue' import useConnectionStore from 'stores/connections.js' +import bytes from 'bytes' const i18n = useI18n() +const themeVars = useThemeVars() + const props = defineProps({ name: String, db: Number, @@ -25,6 +28,7 @@ const props = defineProps({ }, value: Array, size: Number, + length: Number, }) /** @@ -186,8 +190,9 @@ const onUpdateFilter = (filters, sourceColumn) => { :key-path="props.keyPath" :key-type="keyType" :server="props.name" - :ttl="ttl" /> -
+ :ttl="ttl" + class="value-item-part" /> +
{ @clear="clearFilter" @update:value="onFilterInput" />
-
- {{ $t('interface.total', { size: props.size }) }} -
+
- + diff --git a/frontend/src/components/content_value/ContentValueStream.vue b/frontend/src/components/content_value/ContentValueStream.vue index 66baa22..d35b5cb 100644 --- a/frontend/src/components/content_value/ContentValueStream.vue +++ b/frontend/src/components/content_value/ContentValueStream.vue @@ -3,14 +3,17 @@ import { computed, h, reactive, ref } from 'vue' import { useI18n } from 'vue-i18n' import ContentToolbar from './ContentToolbar.vue' import AddLink from '@/components/icons/AddLink.vue' -import { NButton, NCode, NIcon, NInput } from 'naive-ui' +import { NButton, NCode, NIcon, NInput, useThemeVars } from 'naive-ui' import { types, types as redisTypes } from '@/consts/support_redis_type.js' import EditableTableColumn from '@/components/common/EditableTableColumn.vue' import useDialogStore from 'stores/dialog.js' import useConnectionStore from 'stores/connections.js' import { includes, isEmpty, keys, some, values } from 'lodash' +import bytes from 'bytes' const i18n = useI18n() +const themeVars = useThemeVars() + const props = defineProps({ name: String, db: Number, @@ -25,6 +28,7 @@ const props = defineProps({ }, value: Object, size: Number, + length: Number, }) /** @@ -171,8 +175,9 @@ const onUpdateFilter = (filters, sourceColumn) => { :key-path="props.keyPath" :key-type="keyType" :server="props.name" - :ttl="ttl" /> -
+ :ttl="ttl" + class="value-item-part" /> +
{ @update:value="onFilterInput" />
-
- {{ $t('interface.total', { size: props.size }) }} -
+
- + diff --git a/frontend/src/components/content_value/ContentValueString.vue b/frontend/src/components/content_value/ContentValueString.vue index 2f7e964..0258987 100644 --- a/frontend/src/components/content_value/ContentValueString.vue +++ b/frontend/src/components/content_value/ContentValueString.vue @@ -15,6 +15,7 @@ import DropdownSelector from '@/components/content_value/DropdownSelector.vue' import Code from '@/components/icons/Code.vue' import Conversion from '@/components/icons/Conversion.vue' import EditFile from '@/components/icons/EditFile.vue' +import bytes from 'bytes' const i18n = useI18n() const themeVars = useThemeVars() @@ -33,6 +34,7 @@ const props = defineProps({ }, value: String, size: Number, + length: Number, viewAs: { type: String, default: formatTypes.PLAIN_TEXT, @@ -192,6 +194,9 @@ const onSaveValue = async () => { type="textarea" />