update
Some checks failed
Deploy / deploy (build, debian, 22) (push) Has been cancelled
Deploy / deploy (build:staging, school, 8822) (push) Has been cancelled

This commit is contained in:
2026-03-18 18:40:15 +08:00
parent dd52e3e1f9
commit 4e95a2fad0
11 changed files with 41 additions and 422 deletions

View File

@@ -19,14 +19,6 @@
</template>
<template #header-extra>
<n-tag type="warning" size="small">{{ item.score }}</n-tag>
<n-tag
v-if="myScoreMap.get(item.display)"
type="success"
size="small"
style="margin-left: 4px"
>
得分 {{ myScoreMap.get(item.display)!.toFixed(1) }}
</n-tag>
</template>
</n-card>
</n-gi>
@@ -39,7 +31,7 @@ import { ref, onMounted } from "vue"
import { Icon } from "@iconify/vue"
import { marked } from "marked"
import { useRouter } from "vue-router"
import { Challenge, Submission } from "../api"
import { Challenge } from "../api"
import { taskTab, taskId, challengeDisplay } from "../store/task"
import { TASK_TYPE } from "../utils/const"
import type { ChallengeSlim } from "../utils/type"
@@ -48,16 +40,6 @@ const router = useRouter()
const challenges = ref<ChallengeSlim[]>([])
const currentChallenge = ref<ChallengeSlim | null>(null)
const content = ref("")
const myScoreMap = ref<Map<number, number>>(new Map())
async function loadMyScores() {
try {
const scores = await Submission.myScores()
myScoreMap.value = new Map(scores.map((s) => [s.task_display, s.score]))
} catch {
// 未登录时忽略
}
}
async function loadList() {
challenges.value = await Challenge.listDisplay()
@@ -90,10 +72,7 @@ function back() {
router.push({ name: "home-challenge-list" })
}
onMounted(async () => {
await loadList()
await loadMyScores()
})
onMounted(loadList)
</script>
<style scoped>
.container {

View File

@@ -45,12 +45,6 @@
>
<Icon :width="16" icon="lucide:list"></Icon>
</n-button>
<!-- <n-button text @click="$router.push({ name: 'leaderboard' })">
<Icon :width="16" icon="lucide:trophy" />
</n-button>
<n-button text v-if="isLoggedIn" @click="$router.push({ name: 'my-scores' })">
<Icon :width="16" icon="lucide:bar-chart-2" />
</n-button> -->
<n-button text v-if="roleSuper" @click="edit">
<Icon :width="16" icon="lucide:edit"></Icon>
</n-button>
@@ -70,7 +64,7 @@ import { step } from "../store/tutorial"
import { authed, roleSuper } from "../store/user"
import { taskTab, challengeDisplay } from "../store/task"
import { useRoute, useRouter } from "vue-router"
import { TASK_TYPE, STORAGE_KEY } from "../utils/const"
import { TASK_TYPE } from "../utils/const"
import Challenge from "./Challenge.vue"
import Tutorial from "./Tutorial.vue"
@@ -80,8 +74,6 @@ const tutorialRef = ref<InstanceType<typeof Tutorial>>()
defineEmits(["hide"])
const isLoggedIn = computed(() => localStorage.getItem(STORAGE_KEY.LOGIN) === "true")
const hideNav = computed(
() =>
taskTab.value !== TASK_TYPE.Tutorial ||

View File

@@ -31,6 +31,7 @@ const emit = defineEmits<{
select: [id: string]
delete: [row: SubmissionOut, parentId: string]
"show-chain": [conversationId: string]
nominate: [row: SubmissionOut]
}>()
const isChallenge = computed(() => props.row.task_type === TASK_TYPE.Challenge)
@@ -66,6 +67,25 @@ const subColumns = computed((): DataTableColumn<SubmissionOut>[] => [
])
},
},
{
title: "排名",
key: "nominated",
width: 60,
render: (r: SubmissionOut) => {
if (r.username !== user.username) {
return r.nominated ? h("span", { style: { color: "#f0a020" } }, "🏅") : null
}
return h(
NButton,
{
text: true,
title: r.nominated ? "已参与排名点击可重新提名" : "参与排名",
onClick: (e: Event) => { e.stopPropagation(); emit("nominate", r) },
},
() => (r.nominated ? "🏅" : ""),
)
},
},
...(isChallenge.value
? [{
title: "提示词",