perf: prevent adding new key when value is empty
This commit is contained in:
parent
ab4c78c3d7
commit
00e29ef611
|
@ -5,6 +5,7 @@ import (
|
|||
"errors"
|
||||
"fmt"
|
||||
"github.com/redis/go-redis/v9"
|
||||
"log"
|
||||
"strconv"
|
||||
"strings"
|
||||
"sync"
|
||||
|
@ -567,13 +568,9 @@ func (c *connectionService) SetKeyValue(connName string, db int, key, keyType st
|
|||
return
|
||||
} else {
|
||||
_, err = rdb.Pipelined(ctx, func(pipe redis.Pipeliner) error {
|
||||
if len(strs) > 1 {
|
||||
for _, str := range strs {
|
||||
pipe.SAdd(ctx, key, str.(string))
|
||||
}
|
||||
} else {
|
||||
pipe.SAdd(ctx, key)
|
||||
}
|
||||
if expiration > 0 {
|
||||
pipe.Expire(ctx, key, expiration)
|
||||
}
|
||||
|
@ -585,11 +582,13 @@ func (c *connectionService) SetKeyValue(connName string, db int, key, keyType st
|
|||
resp.Msg = "invalid zset value"
|
||||
return
|
||||
} else {
|
||||
log.Println(strs)
|
||||
_, err = rdb.Pipelined(ctx, func(pipe redis.Pipeliner) error {
|
||||
var members []redis.Z
|
||||
for i := 0; i < len(strs); i += 2 {
|
||||
score, _ := strconv.ParseFloat(strs[i].(string), 64)
|
||||
members = append(members, redis.Z{
|
||||
Score: strs[i].(float64),
|
||||
Score: score,
|
||||
Member: strs[i+1],
|
||||
})
|
||||
}
|
||||
|
|
|
@ -10,6 +10,7 @@ import NewZSetValue from '../new_value/NewZSetValue.vue'
|
|||
import NewSetValue from '../new_value/NewSetValue.vue'
|
||||
import { useI18n } from 'vue-i18n'
|
||||
import useConnectionStore from '../../stores/connections.js'
|
||||
import { useMessage } from 'naive-ui'
|
||||
|
||||
const i18n = useI18n()
|
||||
const newForm = reactive({
|
||||
|
@ -35,6 +36,7 @@ const dbOptions = computed(() =>
|
|||
}))
|
||||
)
|
||||
const newFormRef = ref(null)
|
||||
const subFormRef = ref(null)
|
||||
|
||||
const formLabelWidth = '100px'
|
||||
const options = computed(() => {
|
||||
|
@ -74,8 +76,15 @@ watch(
|
|||
)
|
||||
|
||||
const connectionStore = useConnectionStore()
|
||||
const message = useMessage()
|
||||
const onAdd = async () => {
|
||||
await newFormRef.value?.validate()
|
||||
await newFormRef.value?.validate().catch((err) => {
|
||||
message.error(err.message)
|
||||
})
|
||||
if (subFormRef.value?.validate && !subFormRef.value?.validate()) {
|
||||
message.error(i18n.t('spec_field_required', { key: i18n.t('element') }))
|
||||
return false
|
||||
}
|
||||
try {
|
||||
const { server, db, key, type, ttl } = newForm
|
||||
let { value } = newForm
|
||||
|
@ -145,7 +154,7 @@ const onClose = () => {
|
|||
<n-button secondary type="primary" @click="newForm.ttl = -1">{{ $t('persist_key') }}</n-button>
|
||||
</n-input-group>
|
||||
</n-form-item>
|
||||
<component :is="addValueComponent[newForm.type]" v-model:value="newForm.value" />
|
||||
<component ref="subFormRef" :is="addValueComponent[newForm.type]" v-model:value="newForm.value" />
|
||||
<!-- TODO: Add import from txt file option -->
|
||||
</n-form>
|
||||
</n-scrollbar>
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<script setup>
|
||||
import { ref } from 'vue'
|
||||
import { flatMap, reject } from 'lodash'
|
||||
import { flatMap, isEmpty, reject } from 'lodash'
|
||||
import Add from '../icons/Add.vue'
|
||||
import Delete from '../icons/Delete.vue'
|
||||
import IconButton from '../common/IconButton.vue'
|
||||
|
@ -28,6 +28,12 @@ const onUpdate = (val) => {
|
|||
flatMap(val, (item) => [item.key, item.value])
|
||||
)
|
||||
}
|
||||
|
||||
defineExpose({
|
||||
validate: () => {
|
||||
return !isEmpty(props.value)
|
||||
},
|
||||
})
|
||||
</script>
|
||||
|
||||
<template>
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<script setup>
|
||||
import { ref } from 'vue'
|
||||
import { compact } from 'lodash'
|
||||
import { compact, isEmpty } from 'lodash'
|
||||
import Add from '../icons/Add.vue'
|
||||
import Delete from '../icons/Delete.vue'
|
||||
import IconButton from '../common/IconButton.vue'
|
||||
|
@ -15,6 +15,12 @@ const onUpdate = (val) => {
|
|||
val = compact(val)
|
||||
emit('update:value', val)
|
||||
}
|
||||
|
||||
defineExpose({
|
||||
validate: () => {
|
||||
return !isEmpty(props.value)
|
||||
},
|
||||
})
|
||||
</script>
|
||||
|
||||
<template>
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<script setup>
|
||||
import { ref } from 'vue'
|
||||
import { compact, uniq } from 'lodash'
|
||||
import { compact, isEmpty, uniq } from 'lodash'
|
||||
import Add from '../icons/Add.vue'
|
||||
import Delete from '../icons/Delete.vue'
|
||||
import IconButton from '../common/IconButton.vue'
|
||||
|
@ -15,6 +15,12 @@ const onUpdate = (val) => {
|
|||
val = uniq(compact(val))
|
||||
emit('update:value', val)
|
||||
}
|
||||
|
||||
defineExpose({
|
||||
validate: () => {
|
||||
return !isEmpty(props.value)
|
||||
},
|
||||
})
|
||||
</script>
|
||||
|
||||
<template>
|
||||
|
|
|
@ -29,9 +29,15 @@ const onUpdate = () => {
|
|||
const val = reject(zset.value, (v) => v == null || isEmpty(v.value))
|
||||
emit(
|
||||
'update:value',
|
||||
flatMap(val, (item) => [item.value, item.score])
|
||||
flatMap(val, (item) => [item.value, item.score.toString()])
|
||||
)
|
||||
}
|
||||
|
||||
defineExpose({
|
||||
validate: () => {
|
||||
return !isEmpty(props.value)
|
||||
},
|
||||
})
|
||||
</script>
|
||||
|
||||
<template>
|
||||
|
|
|
@ -128,7 +128,6 @@
|
|||
"reload_succ": "Reload Success !",
|
||||
"field_required": "This item should not be blank",
|
||||
"spec_field_required": "\"{key}\" should not be blank",
|
||||
"no_connections": "No Connection",
|
||||
"nonexist_tab_content": "The selected key does not exist. Please retry",
|
||||
"empty_server_content": "Connect server from left list",
|
||||
"reload_when_succ": "Reload immediately after success",
|
||||
|
|
|
@ -130,7 +130,6 @@
|
|||
"reload_succ": "已重新载入",
|
||||
"field_required": "此项不能为空",
|
||||
"spec_field_required": "{key} 不能为空",
|
||||
"no_connections": "空空如也",
|
||||
"nonexist_tab_content": "所选键不存在,请尝试刷新重试",
|
||||
"empty_server_content": "可以从左边选择并打开连接",
|
||||
"reload_when_succ": "操作成功后立即重新加载",
|
||||
|
|
Loading…
Reference in New Issue