update
This commit is contained in:
@@ -1,23 +1,27 @@
|
|||||||
<script lang="ts" setup>
|
|
||||||
import { ref } from "vue"
|
import { ref } from "vue"
|
||||||
import { downloadZip } from "client-zip"
|
|
||||||
import { saveAs } from "file-saver"
|
|
||||||
import { submit } from "../api"
|
import { submit } from "../api"
|
||||||
import { code } from "../composables/code"
|
import { code } from "./code"
|
||||||
import { File } from "../types"
|
import { downloadZip } from "client-zip"
|
||||||
|
import saveAs from "file-saver"
|
||||||
|
|
||||||
interface Props {
|
export const files = ref(
|
||||||
files: File[]
|
Array.from({ length: 5 }).map(() => ({ in: "", out: "", error: false })),
|
||||||
}
|
)
|
||||||
const props = defineProps<Props>()
|
|
||||||
const files = ref(props.files)
|
|
||||||
|
|
||||||
function unique(arr: any[], key: string) {
|
function unique(arr: any[], key: string) {
|
||||||
const res = new Map()
|
const res = new Map()
|
||||||
return arr.filter((item) => !res.has(item[key]) && res.set(item[key], 1))
|
return arr.filter((item) => !res.has(item[key]) && res.set(item[key], 1))
|
||||||
}
|
}
|
||||||
|
|
||||||
function addFive() {
|
export function reset() {
|
||||||
|
files.value = Array.from({ length: 5 }).map(() => ({
|
||||||
|
in: "",
|
||||||
|
out: "",
|
||||||
|
error: false,
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
|
||||||
|
export function addFive() {
|
||||||
files.value.push(
|
files.value.push(
|
||||||
...Array.from({ length: 5 }).map(() => ({
|
...Array.from({ length: 5 }).map(() => ({
|
||||||
in: "",
|
in: "",
|
||||||
@@ -27,11 +31,11 @@ function addFive() {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
function remove(index: number) {
|
export function remove(index: number) {
|
||||||
files.value = files.value.filter((_, i) => i !== index)
|
files.value = files.value.filter((_, i) => i !== index)
|
||||||
}
|
}
|
||||||
|
|
||||||
function onChange(value: string, index: number, slot: "in" | "out") {
|
export function onChange(value: string, index: number, slot: "in" | "out") {
|
||||||
files.value = files.value.map((item, i) => {
|
files.value = files.value.map((item, i) => {
|
||||||
if (i === index) {
|
if (i === index) {
|
||||||
item[slot] = value
|
item[slot] = value
|
||||||
@@ -40,7 +44,7 @@ function onChange(value: string, index: number, slot: "in" | "out") {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
async function run() {
|
export async function run() {
|
||||||
files.value = files.value.filter((it) => {
|
files.value = files.value.filter((it) => {
|
||||||
if (it.in === "" && it.out === "") return false
|
if (it.in === "" && it.out === "") return false
|
||||||
return true
|
return true
|
||||||
@@ -59,18 +63,14 @@ async function run() {
|
|||||||
files.value = newFiles
|
files.value = newFiles
|
||||||
}
|
}
|
||||||
|
|
||||||
async function download() {
|
export async function download() {
|
||||||
let failed = false
|
let failed = false
|
||||||
|
const data = []
|
||||||
for (let i = 0; i < files.value.length; i++) {
|
for (let i = 0; i < files.value.length; i++) {
|
||||||
if (files.value[i].error) {
|
if (files.value[i].error) {
|
||||||
failed = true
|
failed = true
|
||||||
break
|
break
|
||||||
}
|
} else {
|
||||||
}
|
|
||||||
if (failed) return
|
|
||||||
const data = []
|
|
||||||
for (let i = 0; i < files.value.length; i++) {
|
|
||||||
if (files.value[i].out) {
|
|
||||||
data.push({
|
data.push({
|
||||||
name: `${i + 1}.in`,
|
name: `${i + 1}.in`,
|
||||||
input: files.value[i].in,
|
input: files.value[i].in,
|
||||||
@@ -83,39 +83,7 @@ async function download() {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!data.length) return
|
if (failed || !data.length) return
|
||||||
const blob = await downloadZip(data).blob()
|
const blob = await downloadZip(data).blob()
|
||||||
saveAs(blob, "testcase.zip")
|
saveAs(blob, "testcase.zip")
|
||||||
}
|
}
|
||||||
</script>
|
|
||||||
<template>
|
|
||||||
<n-flex vertical>
|
|
||||||
<n-flex>
|
|
||||||
<n-button @click="addFive">增加5个</n-button>
|
|
||||||
<n-button @click="run">先运行</n-button>
|
|
||||||
<n-button type="primary" @click="download">再下载</n-button>
|
|
||||||
</n-flex>
|
|
||||||
<n-flex v-for="(it, index) in files" :key="index">
|
|
||||||
<n-flex vertical>
|
|
||||||
<span>{{ index + 1 }}.in</span>
|
|
||||||
<n-input
|
|
||||||
type="textarea"
|
|
||||||
v-model:value="it.in"
|
|
||||||
@update:value="(v) => onChange(v, index, 'in')"
|
|
||||||
/>
|
|
||||||
</n-flex>
|
|
||||||
<n-flex vertical>
|
|
||||||
<span>{{ index + 1 }}.out</span>
|
|
||||||
<n-input
|
|
||||||
type="textarea"
|
|
||||||
v-model:value="it.out"
|
|
||||||
@update:value="(v) => onChange(v, index, 'out')"
|
|
||||||
:status="it.error ? 'error' : 'success'"
|
|
||||||
/>
|
|
||||||
</n-flex>
|
|
||||||
<n-button :disabled="files.length == 1" @click="remove(index)">
|
|
||||||
删除
|
|
||||||
</n-button>
|
|
||||||
</n-flex>
|
|
||||||
</n-flex>
|
|
||||||
</template>
|
|
||||||
48
src/desktop/File.vue
Normal file
48
src/desktop/File.vue
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
<script lang="ts" setup>
|
||||||
|
import {
|
||||||
|
files,
|
||||||
|
addFive,
|
||||||
|
run,
|
||||||
|
download,
|
||||||
|
onChange,
|
||||||
|
remove,
|
||||||
|
reset,
|
||||||
|
} from "../composables/file"
|
||||||
|
</script>
|
||||||
|
<template>
|
||||||
|
<n-flex vertical>
|
||||||
|
<n-flex>
|
||||||
|
<n-button @click="reset">重置</n-button>
|
||||||
|
<n-button @click="addFive">增加5个</n-button>
|
||||||
|
<n-button @click="run">先运行</n-button>
|
||||||
|
<n-button @click="download">再下载</n-button>
|
||||||
|
</n-flex>
|
||||||
|
<n-flex v-for="(it, index) in files" :key="index">
|
||||||
|
<n-flex vertical class="testcase">
|
||||||
|
<span>{{ index + 1 }}.in</span>
|
||||||
|
<n-input
|
||||||
|
type="textarea"
|
||||||
|
v-model:value="it.in"
|
||||||
|
@update:value="(v) => onChange(v, index, 'in')"
|
||||||
|
/>
|
||||||
|
</n-flex>
|
||||||
|
<n-flex vertical class="testcase">
|
||||||
|
<span>{{ index + 1 }}.out</span>
|
||||||
|
<n-input
|
||||||
|
type="textarea"
|
||||||
|
v-model:value="it.out"
|
||||||
|
@update:value="(v) => onChange(v, index, 'out')"
|
||||||
|
:status="it.error ? 'error' : 'success'"
|
||||||
|
/>
|
||||||
|
</n-flex>
|
||||||
|
<n-button :disabled="files.length == 1" @click="remove(index)">
|
||||||
|
删除
|
||||||
|
</n-button>
|
||||||
|
</n-flex>
|
||||||
|
</n-flex>
|
||||||
|
</template>
|
||||||
|
<style scoped>
|
||||||
|
.testcase {
|
||||||
|
flex: 1;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -8,22 +8,19 @@
|
|||||||
:mask-closable="false"
|
:mask-closable="false"
|
||||||
title="测试用例文件生成器"
|
title="测试用例文件生成器"
|
||||||
>
|
>
|
||||||
<TestPanel :files="files" />
|
<File />
|
||||||
</n-modal>
|
</n-modal>
|
||||||
</template>
|
</template>
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import Header from "./Header.vue"
|
import Header from "./Header.vue"
|
||||||
import Content from "./Content.vue"
|
import Content from "./Content.vue"
|
||||||
import TestPanel from "./TestPanel.vue"
|
import File from "./File.vue"
|
||||||
import { useMagicKeys, whenever } from "@vueuse/core"
|
import { useMagicKeys, whenever } from "@vueuse/core"
|
||||||
import { ref } from "vue"
|
import { ref } from "vue"
|
||||||
|
|
||||||
const { alt_shift_p, ctrl_shift_p, ctrl_shift_z } = useMagicKeys()
|
const { alt_shift_p, ctrl_shift_p, ctrl_shift_z } = useMagicKeys()
|
||||||
|
|
||||||
const show = ref(false)
|
const show = ref(false)
|
||||||
const files = ref(
|
|
||||||
Array.from({ length: 5 }).map(() => ({ in: "", out: "", error: false })),
|
|
||||||
)
|
|
||||||
|
|
||||||
whenever(alt_shift_p, () => {
|
whenever(alt_shift_p, () => {
|
||||||
show.value = true
|
show.value = true
|
||||||
|
|||||||
Reference in New Issue
Block a user