Merge branch 'main' into feat/video
This commit is contained in:
commit
5d91dbd5c4
2 files changed
+19
-15
No files matched your search
@@ -53,6 +53,10 @@ async function fetchCategories() {
|
||||
try {
|
||||
const res = await request.get('/admin/help-categories', { params: { page: 1, page_size: 100, parent_id: -1 } })
|
||||
categories.value = res.data?.data?.list || []
|
||||
if (categories.value.length > 0 && !categoryFilter.value) {
|
||||
categoryFilter.value = categories.value[0].id
|
||||
fetchList()
|
||||
}
|
||||
} catch {}
|
||||
}
|
||||
|
||||
@@ -61,7 +65,7 @@ async function fetchList() {
|
||||
try {
|
||||
const params: any = { page: pagination.current, page_size: pagination.pageSize }
|
||||
if (statusFilter.value) params.status = statusFilter.value
|
||||
if (categoryFilter.value) params.category_id = categoryFilter.value
|
||||
if (categoryFilter.value != null) params.category_id = categoryFilter.value
|
||||
const res = await request.get('/admin/help-articles', { params })
|
||||
const data = res.data?.data
|
||||
articles.value = data?.list || []
|
||||
@@ -75,7 +79,7 @@ const editingId = ref<number | null>(null)
|
||||
const formLoading = ref(false)
|
||||
const detailLoading = ref(false)
|
||||
const form = reactive({
|
||||
category_id: 0,
|
||||
category_id: undefined as number | undefined,
|
||||
title: '',
|
||||
slug: '',
|
||||
content: '',
|
||||
@@ -86,7 +90,7 @@ const form = reactive({
|
||||
})
|
||||
const keywordInput = ref('')
|
||||
|
||||
function resetForm() { Object.assign(form, { category_id: 0, title: '', slug: '', content: '', summary: '', status: 'draft', sort_order: 0, keywords: [] }); keywordInput.value = '' }
|
||||
function resetForm() { Object.assign(form, { category_id: undefined, title: '', slug: '', content: '', summary: '', status: 'draft', sort_order: 0, keywords: [] }); keywordInput.value = '' }
|
||||
|
||||
function openCreate() { editingId.value = null; resetForm(); showDrawer.value = true }
|
||||
|
||||
@@ -133,7 +137,7 @@ async function deleteArticle(row: any) {
|
||||
}})
|
||||
}
|
||||
|
||||
onMounted(() => { fetchCategories(); fetchList() })
|
||||
onMounted(() => { fetchCategories() })
|
||||
</script>
|
||||
|
||||
<template>
|
||||
@@ -166,8 +170,8 @@ onMounted(() => { fetchCategories(); fetchList() })
|
||||
<AFormItem label="标题" required><AInput v-model="form.title" placeholder="文章标题" /></AFormItem>
|
||||
<AFormItem label="Slug" required><AInput v-model="form.slug" placeholder="url-friendly-identifier" /></AFormItem>
|
||||
<div class="flex gap-4">
|
||||
<AFormItem label="分类" required class="flex-1">
|
||||
<ASelect v-model="form.category_id" :options="categories.map((c: any) => ({ value: c.id, label: c.name }))" placeholder="选择分类" />
|
||||
<AFormItem label="分类" required class="flex-1 min-w-[160px]">
|
||||
<ASelect v-model="form.category_id" :options="categories.map((c: any) => ({ value: c.id, label: c.name }))" placeholder="选择分类" allow-clear />
|
||||
</AFormItem>
|
||||
<AFormItem label="状态" class="w-40">
|
||||
<ASelect v-model="form.status" :options="[{ label: '草稿', value: 'draft' }, { label: '已发布', value: 'published' }]" />
|
||||
|
||||
@@ -35,7 +35,7 @@ const form = reactive({
|
||||
email: '',
|
||||
password: '',
|
||||
role: 'admin',
|
||||
status: 1,
|
||||
status: 'active',
|
||||
})
|
||||
|
||||
const roleOptions = [
|
||||
@@ -44,8 +44,8 @@ const roleOptions = [
|
||||
]
|
||||
|
||||
const statusOptions = [
|
||||
{ label: '启用', value: 1 },
|
||||
{ label: '禁用', value: 0 },
|
||||
{ label: '启用', value: 'active' },
|
||||
{ label: '禁用', value: 'disabled' },
|
||||
]
|
||||
|
||||
const columns: TableColumnData[] = [
|
||||
@@ -67,8 +67,8 @@ const columns: TableColumnData[] = [
|
||||
dataIndex: 'status',
|
||||
width: 80,
|
||||
render({ record }) {
|
||||
const color = record.status === 1 ? 'green' : undefined
|
||||
const label = record.status === 1 ? '启用' : '禁用'
|
||||
const color = record.status === 'active' ? 'green' : undefined
|
||||
const label = record.status === 'active' ? '启用' : '禁用'
|
||||
return h(Tag, { color, size: 'small' }, () => label)
|
||||
},
|
||||
},
|
||||
@@ -82,9 +82,9 @@ const columns: TableColumnData[] = [
|
||||
return h(Space, { size: 4 }, () => [
|
||||
h(Button, { size: 'small', type: 'primary', onClick: () => openEdit(record) }, () => '编辑'),
|
||||
h(Popconfirm, {
|
||||
content: `确定${record.status === 1 ? '禁用' : '启用'}该用户?`,
|
||||
content: `确定${record.status === 'active' ? '禁用' : '启用'}该用户?`,
|
||||
onOk: () => toggleStatus(record),
|
||||
}, () => h(Button, { size: 'small' }, () => record.status === 1 ? '禁用' : '启用')),
|
||||
}, () => h(Button, { size: 'small' }, () => record.status === 'active' ? '禁用' : '启用')),
|
||||
h(Button, { size: 'small', onClick: () => openResetPassword(record) }, () => '重置密码'),
|
||||
h(Popconfirm, {
|
||||
content: '确定删除该用户?此操作不可撤销。',
|
||||
@@ -118,7 +118,7 @@ function openCreate() {
|
||||
form.email = ''
|
||||
form.password = ''
|
||||
form.role = 'admin'
|
||||
form.status = 1
|
||||
form.status = 'active'
|
||||
showModal.value = true
|
||||
}
|
||||
|
||||
@@ -161,7 +161,7 @@ async function handleSubmit(done: () => void) {
|
||||
|
||||
async function toggleStatus(row: any) {
|
||||
try {
|
||||
await request.put(`/admin/users/${row.id}/status`, { status: row.status === 1 ? 0 : 1 })
|
||||
await request.put(`/admin/users/${row.id}/status`, { status: row.status === 'active' ? 'disabled' : 'active' })
|
||||
Message.success('状态更新成功')
|
||||
fetchData()
|
||||
} catch {
|
||||
|
||||
Reference in new issue
Block a user