From ee649b81b104c7086ecbe33224ad74ff3b7d947e Mon Sep 17 00:00:00 2001 From: yuetsh <517252939@qq.com> Date: Tue, 13 Oct 2026 14:32:33 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E5=90=8E=E5=8F=B0=E6=88=90=E5=B0=B1):=20?= =?UTF-8?q?=E6=88=90=E5=B0=B1=E6=8C=89=E6=8C=87=E6=A0=87=E6=8E=92=E6=88=90?= =?UTF-8?q?=E9=98=B6=E6=A2=AF=EF=BC=8C=E4=B8=80=E7=BB=84=E4=B8=80=E8=A1=8C?= =?UTF-8?q?=E4=BB=8E=E4=BD=8E=E5=88=B0=E9=AB=98=EF=BC=8C=E6=AF=8F=E6=A1=A3?= =?UTF-8?q?=E5=86=99=E8=A7=A3=E9=94=81=E4=BA=BA=E6=95=B0=E5=92=8C=E5=8D=A0?= =?UTF-8?q?=E5=85=A8=E9=83=A8=E5=AD=A6=E7=94=9F=E7=9A=84=E6=AF=94=E4=BE=8B?= =?UTF-8?q?=EF=BC=8C=E4=B8=8B=E6=9E=B6=E7=9A=84=E5=8F=98=E6=B7=A1=EF=BC=9B?= =?UTF-8?q?=E7=82=B9=E4=B8=80=E6=A1=A3=E5=B0=B1=E7=BC=96=E8=BE=91=EF=BC=8C?= =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=8C=AA=E8=BF=9B=E7=BC=96=E8=BE=91=E6=A1=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- .../components/AchievementModal.vue | 33 ++- apps/web/src/admin/achievement/list.vue | 251 ++++++++++++------ 2 files changed, 199 insertions(+), 85 deletions(-) diff --git a/apps/web/src/admin/achievement/components/AchievementModal.vue b/apps/web/src/admin/achievement/components/AchievementModal.vue index 1fb98ce..0769239 100644 --- a/apps/web/src/admin/achievement/components/AchievementModal.vue +++ b/apps/web/src/admin/achievement/components/AchievementModal.vue @@ -6,6 +6,7 @@ import { updateAchievement, type AdminAchievement, type MetricOption, + deleteAchievement, } from "admin/api" import AchievementIcon from "shared/components/AchievementIcon.vue" import { RARITY_LABEL } from "utils/constants" @@ -20,6 +21,27 @@ const props = defineProps<{ editing: AdminAchievement | null }>() const emit = defineEmits<{ "update:show": [boolean]; saved: [] }>() +const dialog = useDialog() + +/** 删除放在编辑框左下角(列表改成阶梯之后,每一档上只留「点了就编辑」) */ +function confirmDelete() { + const target = props.editing + if (!target) return + dialog.warning({ + title: `删除「${target.name}」?`, + content: target.unlockCount + ? `${target.unlockCount} 人已经拿到了,删掉会连他们的记录一起删。只是不想再发,关掉「上架」就行。` + : "删掉就找不回来了。", + positiveText: "删除", + negativeText: "不删", + onPositiveClick: async () => { + await deleteAchievement(target.id) + message.success("删掉了") + emit("update:show", false) + emit("saved") + }, + }) +} const message = useMessage() const metrics = ref([]) @@ -42,9 +64,7 @@ function emptyForm() { const form = ref(emptyForm()) -const metricOptions = computed(() => - metrics.value.map((m) => ({ label: `${m.name}(${m.key})`, value: m.key })), -) +const metricOptions = computed(() => metrics.value.map((m) => ({ label: m.name, value: m.key }))) const metricHelp = computed( () => metrics.value.find((m) => m.key === form.value.metric)?.helpText ?? "", @@ -155,6 +175,9 @@ async function save() {