Merge branch 'main' into feat/video

This commit is contained in:
qian committed 2026-05-19 19:54:59 +08:00
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' }]" />
+9 -9
View File
@@ -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 {