Files
dypid/web/src/components/AddDataDialog.vue
T
ygxbnet 462c476141
部署开发环境 / deploy-dev (push) Successful in 1m27s
refactor(AddDataDialog): 移除未使用的 node:timers 导入
- 删除了未被引用的 timers 模块导入
- 清理了组件中无用的依赖引入
2026-04-24 17:51:02 +08:00

149 lines
3.2 KiB
Vue

<script setup lang="ts">
import {ref, computed} from "vue"
import axios from "@/axios.ts"
import {ElMessage} from 'element-plus'
import {Upload} from '@element-plus/icons-vue'
const props = defineProps<{
modelValue: boolean
token?: string
}>()
const emit = defineEmits<{
(e: 'update:modelValue', value: boolean): void
}>()
const inputData = ref('')
const uploading = ref(false)
const uploadedCount = ref(0)
const totalCount = computed(() => {
const lines = inputData.value.split('\n').filter(line => line.trim())
return lines.length
})
const close = () => {
emit('update:modelValue', false)
inputData.value = ''
uploadedCount.value = 0
}
const handleUpload = async () => {
if (!inputData.value.trim()) {
ElMessage.warning('请输入数据')
return
}
uploading.value = true
uploadedCount.value = 0
const lines = inputData.value.split('\n').filter(line => line.trim())
const total = lines.length
uploadedCount.value = 0
for (const line of lines) {
try {
await axios.post('/api/data', {}, {
params: {
data: line,
token: props.token || ''
}
})
uploadedCount.value++
} catch (error: any) {
ElMessage.error(error.response?.data?.error || '上传失败')
uploading.value = false
return
}
}
uploading.value = false
ElMessage({message: '已上传成功 ' + uploadedCount.value + ' 条数据', type: 'success'})
setTimeout(() => {
close()
}, 2000)
}
</script>
<template>
<el-dialog
:model-value="modelValue"
@update:model-value="emit('update:modelValue', $event)"
width="700px"
:close-on-click-modal="false"
@close="close"
>
<template #title>
添加数据&nbsp;
<el-tag type="primary" effect="plain">{{ props.token }}</el-tag>
</template>
<div class="add-data-dialog">
<el-input
v-model="inputData"
type="textarea"
:rows="18"
placeholder="请输入数据,每行一条"
:disabled="uploading"
class="textarea-input"
/>
<div class="footer">
<div class="progress">
<el-progress
:percentage="totalCount > 0 ? Math.round((uploadedCount / totalCount) * 100) : 0"
:show-text="false"
/>
<span class="progress-text">已上传 {{ uploadedCount }}/{{ totalCount }} </span>
</div>
<el-button
type="primary"
:loading="uploading"
@click="handleUpload"
>
<el-icon v-if="!uploading">
<Upload/>
</el-icon>
上传
</el-button>
</div>
</div>
</el-dialog>
</template>
<style scoped>
.add-data-dialog {
display: flex;
flex-direction: column;
gap: 16px;
}
.textarea-input :deep(.el-textarea__inner) {
overflow-x: auto;
white-space: pre;
word-break: keep-all;
}
.footer {
display: flex;
justify-content: space-between;
align-items: center;
gap: 16px;
}
.progress {
flex: 1;
display: flex;
align-items: center;
gap: 12px;
}
.progress-text {
font-size: 14px;
color: var(--text-secondary);
white-space: nowrap;
}
.footer .el-progress {
flex: 1;
}
</style>