lrj
1 天以前 93eb6b470773bc49ea6e1a9d4cbd914eb95d525b
web/src/api/media.js
@@ -1,5 +1,7 @@
// 媒体查询 API
const GRAPHQL_ENDPOINT = 'http://localhost:8080/api/graphql';
import { graphqlRequest, API_CONFIG } from '../config/api.ts';
const GRAPHQL_ENDPOINT = API_CONFIG.GRAPHQL_ENDPOINT;
const MEDIAS_BY_TARGET_QUERY = `
  query MediasByTarget($targetType: Int!, $targetId: ID!) {
@@ -36,9 +38,17 @@
`;
export const getMediasByTarget = async (targetType, targetId) => {
  // 获取JWT token
  const { getToken } = await import('@/utils/auth');
  const token = getToken();
  const headers = { 'Content-Type': 'application/json' };
  if (token) {
    headers['Authorization'] = `Bearer ${token}`;
  }
  const res = await fetch(GRAPHQL_ENDPOINT, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    headers: headers,
    body: JSON.stringify({
      query: MEDIAS_BY_TARGET_QUERY,
      variables: { targetType, targetId }
@@ -52,9 +62,17 @@
};
export const saveMedia = async (input) => {
  // 获取JWT token
  const { getToken } = await import('@/utils/auth');
  const token = getToken();
  const headers = { 'Content-Type': 'application/json' };
  if (token) {
    headers['Authorization'] = `Bearer ${token}`;
  }
  const res = await fetch(GRAPHQL_ENDPOINT, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    headers: headers,
    body: JSON.stringify({
      query: SAVE_MEDIA_MUTATION,
      variables: { input }
@@ -72,9 +90,17 @@
  console.log('要删除的媒体ID:', id);
  console.log('GraphQL查询:', DELETE_MEDIA_MUTATION);
  
  // 获取JWT token
  const { getToken } = await import('@/utils/auth');
  const token = getToken();
  const headers = { 'Content-Type': 'application/json' };
  if (token) {
    headers['Authorization'] = `Bearer ${token}`;
  }
  const res = await fetch(GRAPHQL_ENDPOINT, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    headers: headers,
    body: JSON.stringify({
      query: DELETE_MEDIA_MUTATION,
      variables: { id: id.toString() }
@@ -99,8 +125,17 @@
  const formData = new FormData();
  formData.append('file', file);
  
  // 获取JWT token
  const { getToken } = await import('@/utils/auth');
  const token = getToken();
  const headers = {};
  if (token) {
    headers['Authorization'] = `Bearer ${token}`;
  }
  const response = await fetch('http://localhost:8080/api/upload/image', {
    method: 'POST',
    headers: headers,
    body: formData
  });
  
@@ -151,4 +186,35 @@
    console.error('视频处理失败:', error);
    throw new Error(`视频处理失败: ${error.message}`);
  }
};
// 新版保存媒体(SaveMediaV2):使用字符串 targetType 与 MediaSaveInput
// 注意:目前后端仅支持 targetType: "player"(学员头像 -> 6)与 "activity_player"(报名资料 -> 5)。
// 字段命名与旧版不同:fileName 替代 name;可选 thumbPath;mediaType: 1图片、2视频、3音频、4文档。
const SAVE_MEDIA_V2_MUTATION = `
  mutation SaveMediaV2($input: MediaSaveInput!) {
    saveMediaV2(input: $input) {
      success
      message
      mediaId
    }
  }
`;
// 统一的 V2 保存接口(返回 { success, message, mediaId }),示例:
// await saveMediaV2({ targetType: 'player', targetId: 123, path: 'avatar/xxx.jpg', fileName: 'avatar.jpg', fileExt: 'jpg', fileSize: 2048, mediaType: 1 })
export const saveMediaV2 = async (input) => {
  const res = await fetch(GRAPHQL_ENDPOINT, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({
      query: SAVE_MEDIA_V2_MUTATION,
      variables: { input }
    })
  });
  const result = await res.json();
  if (result.errors) {
    throw new Error(result.errors[0].message);
  }
  return result.data.saveMediaV2;
};