diff --git a/apps/web/src/api/bgm.ts b/apps/web/src/api/bgm.ts deleted file mode 100644 index f56af3a54..000000000 --- a/apps/web/src/api/bgm.ts +++ /dev/null @@ -1,68 +0,0 @@ -/** - * BGM 预设音乐 API - * 对接后端 BGM 混音能力:预设列表查询(按风格分类 + 关键词搜索) - */ -import apiClient from "./client" - -/* ──────────── 类型 ──────────── */ - -/** BGM 风格分类 */ -export type BgmCategory = "轻快" | "治愈" | "科技" | "电商" - -/** BGM 预设项 */ -export interface BgmPreset { - id: string - name: string - category: BgmCategory - /** 音频文件 URL */ - url: string - /** 时长(秒) */ - duration: number - /** 关键词标签 */ - tags: string[] - /** 封面图 URL */ - cover_url?: string -} - -/** BGM 预设列表查询参数 */ -export interface BgmPresetsQuery { - category?: BgmCategory | string - keyword?: string -} - -/** BGM 混音配置(嵌入模板) */ -export interface BgmMixConfig { - /** 是否启用 BGM */ - enabled: boolean - /** 选中的 BGM ID */ - music_id: string - /** BGM 音量 0-100 */ - volume: number - /** 淡入时长(秒) 0-3 */ - fade_in: number - /** 淡出时长(秒) 0-3 */ - fade_out: number - /** 人声闪避(sidechain) */ - voice_dodge: boolean -} - -/** 默认 BGM 混音配置 */ -export const DEFAULT_BGM_MIX_CONFIG: BgmMixConfig = { - enabled: false, - music_id: "", - volume: 50, - fade_in: 0.5, - fade_out: 0.5, - voice_dodge: true, -} - -/* ──────────── API ──────────── */ - -/** 获取 BGM 预设列表 */ -export const getBgmPresets = async (params?: BgmPresetsQuery): Promise => { - const searchParams: Record = {} - if (params?.category) searchParams.category = params.category - if (params?.keyword) searchParams.keyword = params.keyword - const res = await apiClient.get("/bgm/presets", { params: searchParams }) - return res.data?.data ?? res.data ?? [] -} diff --git a/apps/web/src/api/bgm/bgm.ts b/apps/web/src/api/bgm/bgm.ts new file mode 100644 index 000000000..d9dc58e62 --- /dev/null +++ b/apps/web/src/api/bgm/bgm.ts @@ -0,0 +1,14 @@ +/** + * BGM 预设音乐 API 函数 + */ +import apiClient from "../client" +import type { BgmPreset, BgmPresetsQuery } from "./types" + +/** 获取 BGM 预设列表 */ +export const getBgmPresets = async (params?: BgmPresetsQuery): Promise => { + const searchParams: Record = {} + if (params?.category) searchParams.category = params.category + if (params?.keyword) searchParams.keyword = params.keyword + const res = await apiClient.get("/bgm/presets", { params: searchParams }) + return res.data?.data ?? res.data ?? [] +} diff --git a/apps/web/src/api/bgm/constants.ts b/apps/web/src/api/bgm/constants.ts new file mode 100644 index 000000000..8b3c8cb55 --- /dev/null +++ b/apps/web/src/api/bgm/constants.ts @@ -0,0 +1,14 @@ +/** + * BGM 相关常量 + */ +import type { BgmMixConfig } from "./types" + +/** 默认 BGM 混音配置 */ +export const DEFAULT_BGM_MIX_CONFIG: BgmMixConfig = { + enabled: false, + music_id: "", + volume: 50, + fade_in: 0.5, + fade_out: 0.5, + voice_dodge: true, +} diff --git a/apps/web/src/api/bgm/index.ts b/apps/web/src/api/bgm/index.ts new file mode 100644 index 000000000..ad23ca565 --- /dev/null +++ b/apps/web/src/api/bgm/index.ts @@ -0,0 +1,13 @@ +/** + * BGM API — 目录化入口 + * 保持与原 bgm.ts 相同导出,向后兼容 + */ + +// 类型 +export type { BgmCategory, BgmPreset, BgmPresetsQuery, BgmMixConfig } from "./types" + +// 常量 +export { DEFAULT_BGM_MIX_CONFIG } from "./constants" + +// API 函数 +export { getBgmPresets } from "./bgm" diff --git a/apps/web/src/api/bgm/types.ts b/apps/web/src/api/bgm/types.ts new file mode 100644 index 000000000..4a14bac17 --- /dev/null +++ b/apps/web/src/api/bgm/types.ts @@ -0,0 +1,43 @@ +/** + * BGM 相关类型定义 + */ + +/** BGM 风格分类 */ +export type BgmCategory = "轻快" | "治愈" | "科技" | "电商" + +/** BGM 预设项 */ +export interface BgmPreset { + id: string + name: string + category: BgmCategory + /** 音频文件 URL */ + url: string + /** 时长(秒) */ + duration: number + /** 关键词标签 */ + tags: string[] + /** 封面图 URL */ + cover_url?: string +} + +/** BGM 预设列表查询参数 */ +export interface BgmPresetsQuery { + category?: BgmCategory | string + keyword?: string +} + +/** BGM 混音配置(嵌入模板) */ +export interface BgmMixConfig { + /** 是否启用 BGM */ + enabled: boolean + /** 选中的 BGM ID */ + music_id: string + /** BGM 音量 0-100 */ + volume: number + /** 淡入时长(秒) 0-3 */ + fade_in: number + /** 淡出时长(秒) 0-3 */ + fade_out: number + /** 人声闪避(sidechain) */ + voice_dodge: boolean +} diff --git a/apps/web/src/api/projects/index.ts b/apps/web/src/api/projects/index.ts new file mode 100644 index 000000000..83c85af3f --- /dev/null +++ b/apps/web/src/api/projects/index.ts @@ -0,0 +1,13 @@ +/** + * 项目 API — 目录化入口 + * 保持与原 projects.ts 相同导出,向后兼容 + */ + +// 类型 +export type { ProjectItem, BackendProjectResponse, BackendListProjectsResponse } from "./types" + +// 工具函数 +export { toProjectItem } from "./utils" + +// API 函数 +export { getProjects, createProject, getOrCreateDefaultProject } from "./projects" diff --git a/apps/web/src/api/projects.ts b/apps/web/src/api/projects/projects.ts similarity index 64% rename from apps/web/src/api/projects.ts rename to apps/web/src/api/projects/projects.ts index 45fca2901..a5fd66568 100644 --- a/apps/web/src/api/projects.ts +++ b/apps/web/src/api/projects/projects.ts @@ -1,32 +1,10 @@ /** - * 项目相关 API + * 项目相关 API 函数 * 素材库需要 project_id,前端自动管理默认项目 */ -import apiClient from "./client" - -export interface ProjectItem { - id: string - name: string - description: string -} - -/** 后端 ProjectResponse 只返回 id, name, description */ -interface BackendProjectResponse { - id: string - name: string - description: string -} - -/** 后端 ListProjectsResponse 返回 { items: [...] } */ -interface BackendListProjectsResponse { - items: BackendProjectResponse[] -} - -const toProjectItem = (item: BackendProjectResponse): ProjectItem => ({ - id: item.id, - name: item.name, - description: item.description, -}) +import apiClient from "../client" +import type { BackendListProjectsResponse, BackendProjectResponse, ProjectItem } from "./types" +import { toProjectItem } from "./utils" /** 获取当前用户的项目列表 */ export const getProjects = async (): Promise => { diff --git a/apps/web/src/api/projects/types.ts b/apps/web/src/api/projects/types.ts new file mode 100644 index 000000000..f2236016b --- /dev/null +++ b/apps/web/src/api/projects/types.ts @@ -0,0 +1,21 @@ +/** + * 项目相关类型定义 + */ + +export interface ProjectItem { + id: string + name: string + description: string +} + +/** 后端 ProjectResponse 只返回 id, name, description */ +export interface BackendProjectResponse { + id: string + name: string + description: string +} + +/** 后端 ListProjectsResponse 返回 { items: [...] } */ +export interface BackendListProjectsResponse { + items: BackendProjectResponse[] +} diff --git a/apps/web/src/api/projects/utils.ts b/apps/web/src/api/projects/utils.ts new file mode 100644 index 000000000..342e88637 --- /dev/null +++ b/apps/web/src/api/projects/utils.ts @@ -0,0 +1,10 @@ +/** + * 项目相关工具函数 + */ +import type { BackendProjectResponse, ProjectItem } from "./types" + +export const toProjectItem = (item: BackendProjectResponse): ProjectItem => ({ + id: item.id, + name: item.name, + description: item.description, +}) diff --git a/apps/web/src/api/tags/index.ts b/apps/web/src/api/tags/index.ts new file mode 100644 index 000000000..cb84c7b0d --- /dev/null +++ b/apps/web/src/api/tags/index.ts @@ -0,0 +1,10 @@ +/** + * 标签 API — 目录化入口 + * 保持与原 tags.ts 相同导出,向后兼容 + */ + +// 类型 +export type { TagItem } from "./types" + +// API 函数 +export { getTags, createTag, deleteTag, tagAsset, untagAsset } from "./tags" diff --git a/apps/web/src/api/tags.ts b/apps/web/src/api/tags/tags.ts similarity index 86% rename from apps/web/src/api/tags.ts rename to apps/web/src/api/tags/tags.ts index 4e6c812d0..b5e1f442f 100644 --- a/apps/web/src/api/tags.ts +++ b/apps/web/src/api/tags/tags.ts @@ -1,15 +1,9 @@ /** - * 标签 CRUD API + * 标签 CRUD API 函数 * P3 标签体系:对接后端标签表 */ -import apiClient from "./client" - -export interface TagItem { - id: string - name: string - created_at?: string - usage_count?: number -} +import apiClient from "../client" +import type { TagItem } from "./types" /** 获取当前用户所有标签 */ export const getTags = async (): Promise => { diff --git a/apps/web/src/api/tags/types.ts b/apps/web/src/api/tags/types.ts new file mode 100644 index 000000000..7dc38bdf0 --- /dev/null +++ b/apps/web/src/api/tags/types.ts @@ -0,0 +1,10 @@ +/** + * 标签相关类型定义 + */ + +export interface TagItem { + id: string + name: string + created_at?: string + usage_count?: number +}