为什么:07 的接口五批都做完了,但创作者在界面上一个都点不到 —— 只能靠 curl。 这批把创作者中心做进后台管理(沿用 AppUsersView 那套 api 封装 + composable + 视图 + 样式与 console.css), 创作者用自己的后台账号登录就能完成"建草稿 → 编辑分集传片 → 提交审核 → 配置收费 → 看数据"的闭环。 - WorkspaceView:主体状态 / 我的作品(含最近一次提交的审核进度)/ 通知列表;新建草稿、按状态给出可提交的动作、撤回 - DramaEditView:作品信息(封面、预告片)、分集增删与上移下移、分片上传(复用 /admin/media)+ 断点续传 (会话存 localStorage,中断后「继续上传」接着传)、产物挂载、提交记录与撤回;非草稿/已下线状态整页转只读 - PriceConfigView:整剧免费集数与解锁金币 + 逐集免费/收费/试看秒数;已上线只读(需先申请下线) - DashboardView:作品 / 播放 / 互动 / 解锁收入四组指标,取不到的显示「暂无数据源」+ notes 口径说明 - 时间列统一 yyyy-MM-dd HH:mm:ss;表格列与后端字段一一对应,不在前端编字段 - media.ts 补上传进度接口;uploader 补 resumeUpload(先查服务端进度再续传)
225 lines
5.8 KiB
TypeScript
225 lines
5.8 KiB
TypeScript
import request from '@/axios'
|
|
import type { PageResult } from './types'
|
|
|
|
/** 创作者主体:登录账号绑定的创作者信息 */
|
|
export interface CreatorProfile {
|
|
id: number
|
|
code: string
|
|
name: string
|
|
/** INDIVIDUAL / COMPANY */
|
|
type: string
|
|
/** pending / approved / rejected / frozen */
|
|
status: string
|
|
statusText: string
|
|
auditNote: string
|
|
auditAt?: string
|
|
contactName: string
|
|
contactEmail: string
|
|
countryCode: string
|
|
dramaTotal: number
|
|
}
|
|
|
|
/** 我的作品 + 最近一次提交的审核进度 */
|
|
export interface CreatorDrama {
|
|
id: number
|
|
code: string
|
|
title: string
|
|
subtitle?: string
|
|
genre?: string
|
|
description?: string
|
|
cover: string
|
|
trailerUrl?: string
|
|
language?: string
|
|
status: string
|
|
statusText: string
|
|
episodes: number
|
|
views: number
|
|
updatedAt?: string
|
|
submissionId?: number | null
|
|
submissionType?: string | null
|
|
submissionStatus?: string | null
|
|
submissionStatusText?: string | null
|
|
reviewNote?: string | null
|
|
rejectCode?: string | null
|
|
submitAt?: string | null
|
|
reviewAt?: string | null
|
|
}
|
|
|
|
export interface CreatorNotice {
|
|
id: number
|
|
/** CREATOR(入驻审核)/ SUBMISSION(内容提交审核) */
|
|
bizType: string
|
|
title: string
|
|
content: string
|
|
result: string
|
|
time?: string
|
|
}
|
|
|
|
export interface CreatorSubmission {
|
|
id: number
|
|
creatorId: number
|
|
dramaId: number
|
|
/** CREATE / UPDATE / PUBLISH / OFFLINE */
|
|
type: string
|
|
/** DRAFT / SUBMITTED / REVIEWING / APPROVED / REJECTED / WITHDRAWN */
|
|
status: string
|
|
version: number
|
|
submitAt?: string
|
|
reviewAt?: string
|
|
reviewNote: string
|
|
rejectCode: string
|
|
}
|
|
|
|
export interface CreatorEpisode {
|
|
id: number
|
|
dramaId: number
|
|
number: number
|
|
title: string
|
|
duration: string
|
|
durationSec: number
|
|
cover: string
|
|
videoUrl: string
|
|
isFree: boolean
|
|
unlockCoin: number
|
|
status: string
|
|
statusText: string
|
|
views: number
|
|
sort: number
|
|
}
|
|
|
|
export interface CreatorDramaEditData {
|
|
title: string
|
|
subtitle?: string
|
|
categoryId?: number
|
|
genre?: string
|
|
description?: string
|
|
cover?: string
|
|
trailerUrl?: string
|
|
language?: string
|
|
}
|
|
|
|
export interface PriceEpisodeConfig {
|
|
episodeId: number
|
|
number: number
|
|
title: string
|
|
free: boolean
|
|
unlockCoin: number
|
|
previewSeconds: number
|
|
}
|
|
|
|
export interface PriceConfig {
|
|
dramaId: number
|
|
freeEpisodes: number
|
|
unlockCoin: number
|
|
episodeCount: number
|
|
changedCount: number
|
|
episodes: PriceEpisodeConfig[]
|
|
}
|
|
|
|
export interface CreatorDashboard {
|
|
generatedAt: string
|
|
drama: Record<string, number>
|
|
playback: Record<string, number>
|
|
interaction: Record<string, number>
|
|
/** paidOrderAmount 取不到时为 null */
|
|
revenue: Record<string, number | null>
|
|
/** 按天趋势:creator_stat_daily 无产出,恒为 null */
|
|
daily: null
|
|
notes: string[]
|
|
}
|
|
|
|
export const getCreatorProfileApi = () => {
|
|
return request.get<CreatorProfile>({ url: '/admin/creator-center/profile' })
|
|
}
|
|
|
|
export const pageMyDramasApi = (params: Record<string, unknown>) => {
|
|
return request.get<PageResult<CreatorDrama>>({ url: '/admin/creator-center/dramas/page', params })
|
|
}
|
|
|
|
export const getMyDramaApi = (id: number) => {
|
|
return request.get<CreatorDrama>({ url: `/admin/creator-center/dramas/${id}` })
|
|
}
|
|
|
|
export const listCreatorNoticesApi = () => {
|
|
return request.get<CreatorNotice[]>({ url: '/admin/creator-center/notices' })
|
|
}
|
|
|
|
export const getCreatorDashboardApi = () => {
|
|
return request.get<CreatorDashboard>({ url: '/admin/creator-center/dashboard' })
|
|
}
|
|
|
|
export const createDramaApi = (data: CreatorDramaEditData) => {
|
|
return request.post<number>({ url: '/admin/creator-center/dramas', data })
|
|
}
|
|
|
|
export const updateDramaApi = (id: number, data: CreatorDramaEditData) => {
|
|
return request.put<void>({ url: `/admin/creator-center/dramas/${id}`, data })
|
|
}
|
|
|
|
export const listEpisodesApi = (dramaId: number) => {
|
|
return request.get<CreatorEpisode[]>({ url: `/admin/creator-center/dramas/${dramaId}/episodes` })
|
|
}
|
|
|
|
export const addEpisodeApi = (dramaId: number, data: Record<string, unknown>) => {
|
|
return request.post<number>({ url: `/admin/creator-center/dramas/${dramaId}/episodes`, data })
|
|
}
|
|
|
|
export const updateEpisodeApi = (
|
|
dramaId: number,
|
|
episodeId: number,
|
|
data: Record<string, unknown>
|
|
) => {
|
|
return request.put<void>({
|
|
url: `/admin/creator-center/dramas/${dramaId}/episodes/${episodeId}`,
|
|
data
|
|
})
|
|
}
|
|
|
|
export const deleteEpisodeApi = (dramaId: number, episodeId: number) => {
|
|
return request.delete<void>({
|
|
url: `/admin/creator-center/dramas/${dramaId}/episodes/${episodeId}`
|
|
})
|
|
}
|
|
|
|
export const sortEpisodesApi = (dramaId: number, ids: number[]) => {
|
|
return request.put<void>({
|
|
url: `/admin/creator-center/dramas/${dramaId}/episodes/sort`,
|
|
data: { ids }
|
|
})
|
|
}
|
|
|
|
/** 把上传好的媒资挂到分集(产物必须是本人上传的) */
|
|
export const attachAssetApi = (dramaId: number, episodeId: number, assetId: number) => {
|
|
return request.post<void>({
|
|
url: `/admin/creator-center/dramas/${dramaId}/episodes/${episodeId}/attach`,
|
|
data: { assetId }
|
|
})
|
|
}
|
|
|
|
export const getPricesApi = (dramaId: number) => {
|
|
return request.get<PriceConfig>({ url: `/admin/creator-center/dramas/${dramaId}/prices` })
|
|
}
|
|
|
|
export const savePricesApi = (dramaId: number, data: Record<string, unknown>) => {
|
|
return request.put<PriceConfig>({ url: `/admin/creator-center/dramas/${dramaId}/prices`, data })
|
|
}
|
|
|
|
export const submitDramaApi = (dramaId: number, type: string) => {
|
|
return request.post<CreatorSubmission>({
|
|
url: `/admin/creator-center/dramas/${dramaId}/submit`,
|
|
data: { type }
|
|
})
|
|
}
|
|
|
|
export const withdrawSubmissionApi = (submissionId: number) => {
|
|
return request.post<CreatorSubmission>({
|
|
url: `/admin/creator-center/submissions/${submissionId}/withdraw`
|
|
})
|
|
}
|
|
|
|
export const listSubmissionsApi = (dramaId: number) => {
|
|
return request.get<CreatorSubmission[]>({
|
|
url: `/admin/creator-center/dramas/${dramaId}/submissions`
|
|
})
|
|
}
|