From c8fe571be19d5a6a10040107c6a8fc79dae6fe77 Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Wed, 21 Oct 2026 15:43:51 +0800 Subject: [PATCH 1/6] =?UTF-8?q?feat(admin):=20=E7=9F=AD=E5=89=A7=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E5=B1=95=E7=A4=BA=E5=B9=B6=E7=BC=96=E8=BE=91=E4=BA=92?= =?UTF-8?q?=E5=8A=A8=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/admin/drama.ts | 1 + src/api/admin/types.ts | 8 ++ src/styles/business/drama-management.css | 18 +++ .../contentManagement/DramaManagementView.vue | 107 +++++++++++++++++- 4 files changed, 132 insertions(+), 2 deletions(-) diff --git a/src/api/admin/drama.ts b/src/api/admin/drama.ts index 753bff4..885227d 100644 --- a/src/api/admin/drama.ts +++ b/src/api/admin/drama.ts @@ -16,6 +16,7 @@ export interface DramaPageParams { status?: string categoryId?: number isHot?: boolean + dramaTypes?: Array<'ANIME' | 'LIVE'> } export const pageDramasApi = (params: DramaPageParams) => { diff --git a/src/api/admin/types.ts b/src/api/admin/types.ts index 15780cb..632951a 100644 --- a/src/api/admin/types.ts +++ b/src/api/admin/types.ts @@ -25,6 +25,7 @@ export interface DramaItem { description?: string cover?: string language?: string + dramaType?: 'ANIME' | 'LIVE' episodes?: number freeEpisodes?: number unlockCoin?: number @@ -33,6 +34,9 @@ export interface DramaItem { status: string statusText: string views?: number + favoriteCount?: number + likeCount?: number + commentCount?: number sort?: number publishAt?: string createdAt?: string @@ -47,8 +51,12 @@ export interface DramaSaveData { description?: string cover?: string language?: string + dramaType?: 'ANIME' | 'LIVE' freeEpisodes?: number unlockCoin?: number + favoriteCount?: number + likeCount?: number + heat?: number isHot?: boolean sort?: number } diff --git a/src/styles/business/drama-management.css b/src/styles/business/drama-management.css index da70d90..4cb4cf9 100644 --- a/src/styles/business/drama-management.css +++ b/src/styles/business/drama-management.css @@ -147,6 +147,24 @@ width: 180px !important; } +.readonly-stat { + min-width: 180px; + height: 32px; + padding: 0 12px; + color: var(--el-text-color-secondary); + line-height: 32px; + background: var(--el-fill-color-lighter); + border: 1px solid var(--el-border-color-lighter); + border-radius: var(--el-border-radius-base); +} + +.readonly-stat-hint { + margin: 4px 0 0; + color: var(--el-text-color-placeholder); + font-size: 12px; + line-height: 1.4; +} + .cover-editor { display: flex; gap: 18px; diff --git a/src/views/contentManagement/DramaManagementView.vue b/src/views/contentManagement/DramaManagementView.vue index 9941efe..d914ec6 100644 --- a/src/views/contentManagement/DramaManagementView.vue +++ b/src/views/contentManagement/DramaManagementView.vue @@ -30,6 +30,7 @@ const categories = ref([]) const keyword = ref('') const statusFilter = ref(undefined) const categoryId = ref(undefined) +const dramaTypeFilter = ref(undefined) const hotFilter = ref(undefined) const pageIndex = ref(1) const pageSize = ref(10) @@ -41,13 +42,18 @@ const coverPercent = ref(0) const coverError = ref('') const coverFileName = ref('') const editingId = ref(null) +const editingCommentCount = ref(0) const formRef = ref() const form = reactive({ title: '', categoryId: undefined, + dramaType: 'LIVE', description: '', freeEpisodes: 3, unlockCoin: 0, + favoriteCount: 0, + likeCount: 0, + heat: 0, isHot: false, cover: '' }) @@ -57,7 +63,8 @@ const COVER_TYPES = ['image/jpeg', 'image/png', 'image/webp'] const formRules = { title: [{ required: true, message: '请输入短剧名称', trigger: 'blur' }], - categoryId: [{ required: true, message: '请选择短剧类型', trigger: 'change' }] + categoryId: [{ required: true, message: '请选择短剧类型', trigger: 'change' }], + dramaType: [{ required: true, message: '请选择内容类型', trigger: 'change' }] } const coverDisplayName = computed( @@ -78,6 +85,11 @@ const statusOptions = [ { code: 'offline', text: '已下线' } ] +const dramaTypeOptions = [ + { value: 'ANIME', label: '漫剧' }, + { value: 'LIVE', label: '真人剧' } +] + const actionMeta = { submit: { label: '提交审核', done: '已提交审核' }, approve: { label: '审核通过', done: '已通过审核' }, @@ -95,6 +107,7 @@ async function load() { keyword: keyword.value.trim() || undefined, status: statusFilter.value || undefined, categoryId: categoryId.value, + dramaTypes: dramaTypeFilter.value ? [dramaTypeFilter.value] : undefined, isHot: hotFilter.value }) list.value = res.data?.list || [] @@ -118,6 +131,7 @@ function resetFilters() { keyword.value = '' statusFilter.value = undefined categoryId.value = undefined + dramaTypeFilter.value = undefined hotFilter.value = undefined search() } @@ -143,14 +157,19 @@ function openCreate() { Object.assign(form, { title: '', categoryId: undefined, + dramaType: 'LIVE', description: '', freeEpisodes: 3, unlockCoin: 0, + favoriteCount: 0, + likeCount: 0, + heat: 0, isHot: false, cover: '' }) coverFileName.value = '' coverError.value = '' + editingCommentCount.value = 0 dialogVisible.value = true resetValidation() } @@ -160,18 +179,27 @@ function openEdit(row) { Object.assign(form, { title: row.title, categoryId: row.categoryId || undefined, + dramaType: row.dramaType || 'LIVE', description: row.description || '', freeEpisodes: row.freeEpisodes ?? 3, unlockCoin: row.unlockCoin ?? 0, + favoriteCount: row.favoriteCount ?? 0, + likeCount: row.likeCount ?? 0, + heat: row.views ?? 0, isHot: !!row.isHot, cover: row.cover || '' }) coverFileName.value = row.cover ? coverBasename(row.cover) : '' coverError.value = '' + editingCommentCount.value = row.commentCount ?? 0 dialogVisible.value = true resetValidation() } +function dramaTypeLabel(value) { + return dramaTypeOptions.find((item) => item.value === value)?.label || '真人剧' +} + async function saveDrama() { if (saving.value || uploadingCover.value) return try { @@ -344,6 +372,12 @@ onMounted(async () => { :key="item.id" :label="item.name" :value="item.id" /> { > + - + + +