From a47700a98024fb335e0386dfb0576445f2b2c560 Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Thu, 22 Oct 2026 22:18:05 +0800 Subject: [PATCH] =?UTF-8?q?feat(admin):=20=E6=96=B0=E5=A2=9E=E5=88=86?= =?UTF-8?q?=E7=B1=BB=E7=AE=A1=E7=90=86=E4=B8=8E=E5=89=A7=E5=8D=95=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/admin/dramaClassification.ts | 88 +++ src/api/admin/dramaPlaylistCategory.ts | 80 +++ .../contentManagement/CategoryDramaView.vue | 601 +++++++++++++++++ .../contentManagement/DramaPlaylistView.vue | 618 ++++++++++++++++++ 4 files changed, 1387 insertions(+) create mode 100644 src/api/admin/dramaClassification.ts create mode 100644 src/api/admin/dramaPlaylistCategory.ts create mode 100644 src/views/contentManagement/CategoryDramaView.vue create mode 100644 src/views/contentManagement/DramaPlaylistView.vue diff --git a/src/api/admin/dramaClassification.ts b/src/api/admin/dramaClassification.ts new file mode 100644 index 0000000..50f6b9d --- /dev/null +++ b/src/api/admin/dramaClassification.ts @@ -0,0 +1,88 @@ +// Author: fruit.com.cn + +import request from '@/axios' +import type { PageResult } from './types' + +export interface DramaClassificationItem { + id: number + name: string + sort: number + status: number + dramaCount: number + updatedAt?: string +} + +export interface DramaClassificationSaveData { + name: string + sort?: number + status?: number +} + +export interface ClassificationDramaItem { + id: number + title: string + cover: string + status: string + totalEpisodes: number + sort: number + updatedAt: string +} + +export interface ClassificationDramaPageParams { + keyword?: string + pageIndex?: number + pageSize?: number +} + +export const listClassificationsApi = () => { + return request.get({ url: '/admin/drama-classifications' }) +} + +export const createClassificationApi = (data: DramaClassificationSaveData) => { + return request.post({ url: '/admin/drama-classifications', data }) +} + +export const updateClassificationApi = (id: number, data: DramaClassificationSaveData) => { + return request.put({ url: `/admin/drama-classifications/${id}`, data }) +} + +export const deleteClassificationApi = (id: number) => { + return request.delete({ url: `/admin/drama-classifications/${id}` }) +} + +/** 分类下已关联的短剧 */ +export const listClassificationDramasApi = ( + id: number, + params: ClassificationDramaPageParams +) => { + return request.get>({ + url: `/admin/drama-classifications/${id}/dramas`, + params + }) +} + +/** 尚未关联到该分类的短剧(添加弹窗用) */ +export const listClassificationDramaCandidatesApi = ( + id: number, + params: ClassificationDramaPageParams +) => { + return request.get>({ + url: `/admin/drama-classifications/${id}/dramas/candidates`, + params + }) +} + +/** 批量关联短剧,返回实际新增数量 */ +export const bindClassificationDramasApi = (id: number, dramaIds: number[]) => { + return request.post({ + url: `/admin/drama-classifications/${id}/dramas`, + data: { dramaIds } + }) +} + +/** 从分类移除短剧 */ +export const unbindClassificationDramaApi = (id: number, dramaId: number) => { + return request.delete({ + url: `/admin/drama-classifications/${id}/dramas/${dramaId}` + }) +} diff --git a/src/api/admin/dramaPlaylistCategory.ts b/src/api/admin/dramaPlaylistCategory.ts new file mode 100644 index 0000000..45c87de --- /dev/null +++ b/src/api/admin/dramaPlaylistCategory.ts @@ -0,0 +1,80 @@ +// Author: fruit.com.cn + +import request from '@/axios' +import type { PageResult } from './types' +import type { ClassificationDramaItem } from './dramaClassification' + +export interface DramaPlaylistCategoryItem { + id: number + name: string + description: string + sort: number + status: number + dramaCount: number +} + +export interface DramaPlaylistCategorySaveData { + name: string + description?: string + sort?: number + status?: number +} + +export interface PlaylistCategoryDramaPageParams { + keyword?: string + pageIndex?: number + pageSize?: number +} + +export const listPlaylistCategoriesApi = () => { + return request.get({ url: '/admin/drama-playlist-categories' }) +} + +export const createPlaylistCategoryApi = (data: DramaPlaylistCategorySaveData) => { + return request.post({ url: '/admin/drama-playlist-categories', data }) +} + +export const updatePlaylistCategoryApi = (id: number, data: DramaPlaylistCategorySaveData) => { + return request.put({ url: `/admin/drama-playlist-categories/${id}`, data }) +} + +export const deletePlaylistCategoryApi = (id: number) => { + return request.delete({ url: `/admin/drama-playlist-categories/${id}` }) +} + +/** 分类下已关联的短剧 */ +export const listPlaylistCategoryDramasApi = ( + id: number, + params: PlaylistCategoryDramaPageParams +) => { + return request.get>({ + url: `/admin/drama-playlist-categories/${id}/dramas`, + params + }) +} + +/** 尚未关联到该分类的短剧(选择弹窗用) */ +export const listPlaylistCategoryDramaCandidatesApi = ( + id: number, + params: PlaylistCategoryDramaPageParams +) => { + return request.get>({ + url: `/admin/drama-playlist-categories/${id}/dramas/candidates`, + params + }) +} + +/** 批量关联短剧,返回实际新增数量 */ +export const bindPlaylistCategoryDramasApi = (id: number, dramaIds: number[]) => { + return request.post({ + url: `/admin/drama-playlist-categories/${id}/dramas`, + data: { dramaIds } + }) +} + +/** 从分类移除短剧 */ +export const unbindPlaylistCategoryDramaApi = (id: number, dramaId: number) => { + return request.delete({ + url: `/admin/drama-playlist-categories/${id}/dramas/${dramaId}` + }) +} diff --git a/src/views/contentManagement/CategoryDramaView.vue b/src/views/contentManagement/CategoryDramaView.vue new file mode 100644 index 0000000..05d7968 --- /dev/null +++ b/src/views/contentManagement/CategoryDramaView.vue @@ -0,0 +1,601 @@ + + + + + + + + diff --git a/src/views/contentManagement/DramaPlaylistView.vue b/src/views/contentManagement/DramaPlaylistView.vue new file mode 100644 index 0000000..2bf1fb7 --- /dev/null +++ b/src/views/contentManagement/DramaPlaylistView.vue @@ -0,0 +1,618 @@ + + + + + + + +