xiongzhu 2 år sedan
förälder
incheckning
030e196451
3 ändrade filer med 121 tillägg och 79 borttagningar
  1. 1 1
      src/views/AccountsView.vue
  2. 111 75
      src/views/CreateTask.vue
  3. 9 3
      src/views/TaskView.vue

+ 1 - 1
src/views/AccountsView.vue

@@ -67,7 +67,7 @@
             <ElTableColumn prop="lastMint" label="mint时间" width="150" :formatter="timeFormatter" sortable></ElTableColumn>
             <ElTableColumn width="80" fixed="right">
                 <template #default="{ row }">
-                    <ElButton type="danger" size="small" @click="deleteAccount(row)">删除</ElButton>
+                    <ElButton type="danger" size="small" @click.stop="deleteAccount(row)">删除</ElButton>
                 </template>
             </ElTableColumn>
         </ElTable>

+ 111 - 75
src/views/CreateTask.vue

@@ -13,8 +13,8 @@
                 <ElCard v-for="(item, i) in items" :key="item.id" shadow="never" class="mb-4">
                     <ElForm :model="item" :rules="rules" inline ref="form" class="flex items-center">
                         <ElFormItem>
-                            <ElIcon class="drag-icon cursor-move" size="large">
-                                <ArrowsDownUp />
+                            <ElIcon class="drag-icon cursor-move !text-neutral-500" size="large">
+                                <Menu2 />
                             </ElIcon>
                         </ElFormItem>
                         <ElFormItem prop="type">
@@ -22,50 +22,54 @@
                                 <ElOption v-for="key in TaskType" :key="key" :label="TaskType[key]" :value="key" />
                             </ElSelect>
                         </ElFormItem>
-                        <ElFormItem prop="amountType">
-                            <ElRadioGroup v-model="item.amountType">
-                                <ElRadio label="amount">随机金额</ElRadio>
-                                <ElRadio label="percent">随机百分比</ElRadio>
-                            </ElRadioGroup>
-                        </ElFormItem>
-                        <ElFormItem prop="amount" v-if="item.amountType === 'amount'">
-                            <ElInputNumber
-                                :controls="false"
-                                v-model="item.amount.min"
-                                class="!w-24"
-                                placeholder="最小金额"
-                            >
-                            </ElInputNumber>
-                            <div class="pl-2 pr-2">-</div>
-                            <ElInputNumber
-                                :controls="false"
-                                v-model="item.amount.max"
-                                class="!w-24"
-                                placeholder="最大金额"
-                            >
-                            </ElInputNumber>
-                        </ElFormItem>
-                        <ElFormItem prop="percent" v-else>
-                            <ElInputNumber
-                                :controls="false"
-                                v-model="item.percent.min"
-                                class="!w-24"
-                                placeholder="最小百分比"
-                                :min="1"
-                                :max="100"
-                            >
-                            </ElInputNumber>
-                            <div class="pl-2 pr-2">-</div>
-                            <ElInputNumber
-                                :controls="false"
-                                v-model="item.percent.max"
-                                class="!w-24"
-                                placeholder="最大百分比"
-                                :min="1"
-                                :max="100"
-                            >
-                            </ElInputNumber>
-                        </ElFormItem>
+
+                        <template v-if="item.type !== 'removeLiquidity' && item.type !== 'mint'">
+                            <ElFormItem prop="amountType">
+                                <ElRadioGroup v-model="item.amountType">
+                                    <ElRadio label="amount">随机金额</ElRadio>
+                                    <ElRadio label="percent">随机百分比</ElRadio>
+                                </ElRadioGroup>
+                            </ElFormItem>
+                            <ElFormItem prop="amount" v-if="item.amountType === 'amount'">
+                                <ElInputNumber
+                                    :controls="false"
+                                    v-model="item.amount.min"
+                                    class="!w-24"
+                                    placeholder="最小金额"
+                                >
+                                </ElInputNumber>
+                                <div class="pl-2 pr-2">-</div>
+                                <ElInputNumber
+                                    :controls="false"
+                                    v-model="item.amount.max"
+                                    class="!w-24"
+                                    placeholder="最大金额"
+                                >
+                                </ElInputNumber>
+                            </ElFormItem>
+                            <ElFormItem prop="percent" v-else>
+                                <ElInputNumber
+                                    :controls="false"
+                                    v-model="item.percent.min"
+                                    class="!w-24"
+                                    placeholder="最小百分比"
+                                    :min="1"
+                                    :max="100"
+                                >
+                                </ElInputNumber>
+                                <div class="pl-2 pr-2">-</div>
+                                <ElInputNumber
+                                    :controls="false"
+                                    v-model="item.percent.max"
+                                    class="!w-24"
+                                    placeholder="最大百分比"
+                                    :min="1"
+                                    :max="100"
+                                >
+                                </ElInputNumber>
+                            </ElFormItem>
+                        </template>
+
                         <div class="flex-1"></div>
                         <ElFormItem class="">
                             <ElButton :icon="TrashX" type="danger" @click="removeItem(i)">删除</ElButton>
@@ -74,30 +78,34 @@
                 </ElCard>
             </VueDraggable>
 
-            <ElButton @click="addItem">添加</ElButton>
-            <div class="text-xs mt-4 flex items-center">
-                <div class="mr-2">随机延迟</div>
-                <ElInputNumber
-                    :controls="false"
-                    v-model="delay.min"
-                    class="!w-24"
-                    placeholder="最小"
-                    :min="1"
-                    :max="100"
-                >
-                </ElInputNumber>
-                <div class="pl-2 pr-2">-</div>
-                <ElInputNumber
-                    :controls="false"
-                    v-model="delay.max"
-                    class="!w-24"
-                    placeholder="最大"
-                    :min="1"
-                    :max="100"
-                >
-                </ElInputNumber>
-                <div class="ml-2">秒</div>
-            </div>
+            <ElButton @click="addItem" :icon="Plus" type="primary" plain>添加</ElButton>
+            <ElForm class="mt-4" :model="data" ref="form1" :rules="rules1" inline label-position="right">
+                <ElFormItem prop="startTime" label="开始时间">
+                    <ElDatePicker class="ml-2" type="datetime" v-model="data.startTime" placeholder="请选择" />
+                </ElFormItem>
+                <ElFormItem prop="delay" label="随机延迟">
+                    <ElInputNumber
+                        :controls="false"
+                        v-model="data.delay.min"
+                        class="!w-24"
+                        placeholder="最小"
+                        :min="1"
+                        :max="100"
+                    >
+                    </ElInputNumber>
+                    <div class="pl-2 pr-2">-</div>
+                    <ElInputNumber
+                        :controls="false"
+                        v-model="data.delay.max"
+                        class="!w-24"
+                        placeholder="最大"
+                        :min="1"
+                        :max="100"
+                    >
+                    </ElInputNumber>
+                    <div class="ml-2">秒</div>
+                </ElFormItem>
+            </ElForm>
             <template #footer>
                 <ElButton @click="onClose">取消</ElButton>
                 <ElButton type="primary" @click="createTask" :loading="creatingTask">确定</ElButton>
@@ -108,19 +116,24 @@
 <script setup>
 import { ref } from 'vue'
 import { TaskType } from '@/enums'
-import { TrashX, ArrowsDownUp, Menu2 } from '@vicons/tabler'
+import { TrashX, ArrowsDownUp, Menu2, Plus } from '@vicons/tabler'
 import { VueDraggable } from 'vue-draggable-plus'
 import { ElMessage } from 'element-plus'
 import { http } from '@/plugins/http'
+import { useStorage } from '@vueuse/core'
 
 const props = defineProps(['modelValue', 'accounts'])
 const emit = defineEmits(['update:modelValue', 'createTask'])
 const creatingTask = ref(false)
 const form = ref(null)
+const form1 = ref(null)
 const items = ref([])
-const delay = ref({
-    min: 5,
-    max: 10
+const data = ref({
+    startTime: null,
+    delay: {
+        min: 5,
+        max: 10
+    }
 })
 const rules = {
     type: [{ required: true, message: '请选择任务类型', trigger: 'blur' }],
@@ -154,6 +167,23 @@ const rules = {
         }
     ]
 }
+const rules1 = {
+    startTime: [{ required: true, message: '请选择开始时间', trigger: 'blur' }],
+    delay: [
+        {
+            validator: (rule, value, callback) => {
+                if (value.min === null || value.max === null) {
+                    return callback(new Error('请输入最小延迟和最大延迟'))
+                }
+                if (value.min > value.max) {
+                    return callback(new Error('最小延迟不能大于最大延迟'))
+                }
+                callback()
+            },
+            trigger: 'blur'
+        }
+    ]
+}
 function onClose() {
     emit('update:modelValue', false)
 }
@@ -193,9 +223,15 @@ async function createTask() {
     if (!valid) {
         return
     }
+    await form1.value.validate()
     creatingTask.value = true
     try {
-        await http.put('/tasks')
+        await http.put('/tasks', {
+            accounts: props.accounts.map((item) => item.id),
+            items: items.value.map((i) => ({ ...i })),
+            startTime: data.value.startTime,
+            delay: data.value.delay
+        })
         creatingTask.value = false
         emit('update:modelValue', false)
         ElMessage.success('创建成功')

+ 9 - 3
src/views/TaskView.vue

@@ -14,7 +14,11 @@
             <ElTableColumn prop="id" label="ID" width="50" />
             <ElTableColumn prop="createdAt" label="创建时间" :formatter="timeFormatter" width="150" />
             <ElTableColumn prop="startTime" label="执行时间" :formatter="timeFormatter" width="150" />
-            <ElTableColumn prop="type" label="任务类型" :formatter="taskTypeFormatter" />
+            <ElTableColumn prop="type" label="任务类型" show-overflow-tooltip>
+                <template #default="{ row }">
+                    {{ row.items.map((i) => i.type).join(' ,') }}
+                </template>
+            </ElTableColumn>
             <ElTableColumn prop="status" label="状态" align="center" width="120">
                 <template #default="{ row }">
                     <ElTag v-if="row.status === 'pending'" type="info">未开始</ElTag>
@@ -25,7 +29,9 @@
             <ElTableColumn prop="progress" label="进度" :formatter="progressFormatter" width="100" />
             <ElTableColumn label="操作" align="center" width="100">
                 <template #default="{ row }">
-                    <ElButton @click="delTask(row)" type="danger" :disabled="row.status === 'in_progress'">删除</ElButton>
+                    <ElButton @click="delTask(row)" type="danger" :disabled="row.status === 'in_progress'"
+                        >删除</ElButton
+                    >
                 </template>
             </ElTableColumn>
         </PagingTable>
@@ -49,7 +55,7 @@ useIntervalFn(() => {
     pt.value && pt.value.refresh()
 }, 2000)
 function progressFormatter(row, column, value, index) {
-    return `${value + 1}/${row.accounts.length}`
+    return `${value + 1}/${row.accounts.length * row.items.length}`
 }
 const loading = ref(false)
 function refresh() {