Skip to content

Commit ebd8a43

Browse files
yyyCodeclaude
andcommitted
feat(article): add hide/publish buttons, delete confirm dialog, Chinese status labels
Co-Authored-By: Claude <noreply@anthropic.com>
1 parent 63e0210 commit ebd8a43

1 file changed

Lines changed: 38 additions & 2 deletions

File tree

vue/src/views/ConsoleArticleManageView.vue

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,12 @@
2525
<div v-for="a in listItems" :key="a.id" class="manage-item" @click="goEdit(a.id)">
2626
<div class="manage-item-main">
2727
<div class="manage-item-title">{{ a.title || '未命名' }}</div>
28-
<div class="manage-item-meta">{{ a.status }} · {{ formatDate(a.publishedAt) }}</div>
28+
<div class="manage-item-meta">{{ statusLabel(a.status) }} · {{ formatDate(a.publishedAt) }}</div>
2929
</div>
3030
<div class="manage-item-actions" @click.stop>
3131
<button class="btn" style="padding: 6px 10px" @click="goEdit(a.id)">编辑</button>
32+
<button v-if="a.status === 'PUBLISHED'" class="btn" style="padding: 6px 10px" @click="hideArticle(a.id)">隐藏</button>
33+
<button v-if="a.status === 'HIDDEN'" class="btn" style="padding: 6px 10px" @click="republish(a.id)">发布</button>
3234
<button class="btn" style="padding: 6px 10px" @click="remove(a.id)">删除</button>
3335
</div>
3436
</div>
@@ -43,7 +45,7 @@
4345
<script setup>
4446
import { computed, onMounted, ref } from 'vue'
4547
import { useRouter } from 'vue-router'
46-
import { deleteMyArticle, fetchMyArticles } from '../api/admin'
48+
import { deleteMyArticle, fetchMyArticles, publishArticle, unpublishArticle } from '../api/admin'
4749
4850
const router = useRouter()
4951
@@ -63,6 +65,11 @@ function formatDate(v) {
6365
}
6466
}
6567
68+
function statusLabel(s) {
69+
const map = { DRAFT: '草稿', SCHEDULED: '已预约', PUBLISHED: '已发布', HIDDEN: '已隐藏' }
70+
return map[s] || s
71+
}
72+
6673
async function loadArticles() {
6774
loadingArticles.value = true
6875
try {
@@ -90,6 +97,9 @@ function goEdit(id) {
9097
async function remove(id) {
9198
articleError.value = ''
9299
articleSuccess.value = ''
100+
if (!window.confirm('确定要永久删除这篇文章吗?此操作不可撤销。')) {
101+
return
102+
}
93103
try {
94104
await deleteMyArticle(id)
95105
await loadArticles()
@@ -103,6 +113,32 @@ async function remove(id) {
103113
}
104114
}
105115
116+
async function hideArticle(id) {
117+
articleError.value = ''
118+
articleSuccess.value = ''
119+
try {
120+
await unpublishArticle(id)
121+
await loadArticles()
122+
articleSuccess.value = '已隐藏'
123+
} catch (e) {
124+
articleError.value = e?.message || '隐藏失败'
125+
articleSuccess.value = ''
126+
}
127+
}
128+
129+
async function republish(id) {
130+
articleError.value = ''
131+
articleSuccess.value = ''
132+
try {
133+
await publishArticle(id)
134+
await loadArticles()
135+
articleSuccess.value = '已发布'
136+
} catch (e) {
137+
articleError.value = e?.message || '发布失败'
138+
articleSuccess.value = ''
139+
}
140+
}
141+
106142
onMounted(() => {
107143
loadArticles()
108144
})

0 commit comments

Comments
 (0)