为比赛添加标签

This commit is contained in:
2024-07-02 20:06:50 +08:00
parent 922fc61ead
commit 60c1a495f2
7 changed files with 43 additions and 5 deletions

View File

@@ -23,16 +23,12 @@ async function handleDelete() {
emit("deleted")
}
function goDetail() {}
</script>
<template>
<n-space>
<n-button size="small" type="success" secondary @click="goEdit">
编辑
</n-button>
<n-button size="small" type="info" secondary @click="goDetail">
查看
</n-button>
<n-popconfirm @positive-click="handleDelete">
<template #trigger>
<n-button size="small" type="error" secondary>删除</n-button>

View File

@@ -39,6 +39,7 @@ async function init() {
announcement.title = res.data.title
announcement.content = res.data.content
announcement.visible = res.data.visible
announcement.tag = res.data.tag
announcement.top = res.data.top
}

View File

@@ -20,10 +20,17 @@ const [ready, toggleReady] = useToggle()
const startTime = ref(after10mins)
const endTime = ref(after70mins)
const tags: SelectOption[] = [
{ label: "练习", value: "练习" },
{ label: "期中", value: "期中" },
{ label: "期末", value: "期末" },
]
const contest = reactive<BlankContest & { id: number }>({
id: 0,
title: "",
description: "",
tag: "练习",
start_time: formatISO(after10mins),
end_time: formatISO(after70mins),
rule_type: "ACM",
@@ -48,6 +55,7 @@ async function getContestDetail() {
contest.id = data.id
contest.title = data.title
contest.description = data.description
contest.tag = data.tag
contest.start_time = data.start_time
contest.end_time = data.end_time
contest.rule_type = "ACM"
@@ -93,6 +101,13 @@ onMounted(getContestDetail)
<n-form-item label="标题">
<n-input class="contestTitle" v-model:value="contest.title" />
</n-form-item>
<n-form-item label="标签">
<n-select
style="width: 100px"
:options="tags"
v-model:value="contest.tag"
/>
</n-form-item>
<n-form-item label="开始">
<n-date-picker v-model:value="startTime" type="datetime" />
</n-form-item>

View File

@@ -29,6 +29,11 @@ const columns: DataTableColumn<Contest>[] = [
minWidth: 250,
render: (row) => h(ContestTitle, { contest: row }),
},
{
title: "标签",
key: "tag",
width: 80,
},
{
title: "类型",
key: "contest_type",

View File

@@ -120,6 +120,7 @@ export function getContestList(query: {
limit: number
keyword: string
status: string
tag: string
}) {
return http.get("contests", { params: query })
}

View File

@@ -18,6 +18,7 @@ const query = reactive({
limit: parseInt(<string>route.query.limit) || 10,
keyword: <string>route.query.keyword ?? "",
status: <string>route.query.status ?? "",
tag: <string>route.query.tag ?? "",
})
const data = ref<Contest[]>([])
const total = ref(0)
@@ -29,6 +30,13 @@ const options: SelectOption[] = [
{ label: "已结束", value: "-1" },
]
const tags: SelectOption[] = [
{ label: "全部", value: "" },
{ label: "练习", value: "练习" },
{ label: "期中", value: "期中" },
{ label: "期末", value: "期末" },
]
const columns: DataTableColumn<Contest>[] = [
{
title: renderTableTitle("状态", "streamline-emojis:collision"),
@@ -47,6 +55,12 @@ const columns: DataTableColumn<Contest>[] = [
minWidth: 360,
render: (row) => h(ContestTitle, { contest: row }),
},
{
title: renderTableTitle("标签", "fluent-emoji-flat:keycap-hashtag"),
key: "tag",
width: 100,
render: (row) => h(NTag, () => row.tag),
},
{
title: renderTableTitle("开始时间", "fluent-emoji-flat:eleven-thirty"),
key: "start_time",
@@ -68,6 +82,7 @@ async function listContests() {
limit: query.limit,
keyword: query.keyword,
status: query.status,
tag: query.tag,
})
data.value = res.data.results
total.value = res.data.total
@@ -87,12 +102,13 @@ function search(value: string) {
function clear() {
query.keyword = ""
query.status = ""
query.tag = ""
}
onMounted(listContests)
watch(() => query.page, routerPush)
watch(
() => [query.limit, query.status],
() => [query.limit, query.status, query.tag],
() => {
query.page = 1
routerPush()
@@ -137,6 +153,9 @@ function rowProps(row: Contest) {
v-model:value="query.status"
/>
</n-form-item>
<n-form-item label="标签">
<n-select class="select" :options="tags" v-model:value="query.tag" />
</n-form-item>
<n-form-item>
<n-input
clearable

View File

@@ -279,6 +279,7 @@ export interface Contest extends BlankContest {
export interface BlankContest {
title: string
description: string
tag: string
start_time: string
end_time: string
rule_type: "ACM" | "OI"