285 lines
5.8 KiB
JavaScript
285 lines
5.8 KiB
JavaScript
/**
|
||
* API 使用示例
|
||
* 展示如何在页面中使用统一的API配置
|
||
*/
|
||
|
||
import { API_BASE, API_ENDPOINTS, buildURL, request, uploadFile, downloadFile } from '@/config/api.js';
|
||
|
||
export default {
|
||
data() {
|
||
return {
|
||
API_BASE, // 导入API基础地址
|
||
videos: [],
|
||
loading: false
|
||
}
|
||
},
|
||
|
||
methods: {
|
||
/**
|
||
* 示例1: 获取视频列表(GET请求)
|
||
*/
|
||
async loadVideos() {
|
||
this.loading = true;
|
||
try {
|
||
// 方式1: 使用request方法
|
||
const result = await request({
|
||
url: API_ENDPOINTS.revival.getList,
|
||
method: 'GET'
|
||
});
|
||
|
||
if (result.success) {
|
||
this.videos = result.data;
|
||
}
|
||
|
||
// 方式2: 使用uni.request(传统方式)
|
||
uni.request({
|
||
url: buildURL(API_ENDPOINTS.revival.getList),
|
||
method: 'GET',
|
||
success: (res) => {
|
||
if (res.data.success) {
|
||
this.videos = res.data.data;
|
||
}
|
||
}
|
||
});
|
||
} catch (error) {
|
||
console.error('加载失败:', error);
|
||
uni.showToast({
|
||
title: '加载失败',
|
||
icon: 'none'
|
||
});
|
||
} finally {
|
||
this.loading = false;
|
||
}
|
||
},
|
||
|
||
/**
|
||
* 示例2: 发送对话(POST请求)
|
||
*/
|
||
async sendMessage(message) {
|
||
try {
|
||
const result = await request({
|
||
url: API_ENDPOINTS.conversation.send,
|
||
method: 'POST',
|
||
data: {
|
||
message: message,
|
||
voiceId: this.selectedVoiceId,
|
||
conversationId: this.conversationId
|
||
}
|
||
});
|
||
|
||
if (result.success) {
|
||
// 播放AI回复音频
|
||
const audioUrl = buildURL(API_ENDPOINTS.conversation.getAudio(result.audioFile));
|
||
this.playAudio(audioUrl);
|
||
}
|
||
} catch (error) {
|
||
console.error('发送失败:', error);
|
||
}
|
||
},
|
||
|
||
/**
|
||
* 示例3: 上传文件(创建视频)
|
||
*/
|
||
async uploadPhoto() {
|
||
try {
|
||
// 选择照片
|
||
const [err, res] = await uni.chooseImage({
|
||
count: 1,
|
||
sizeType: ['compressed']
|
||
});
|
||
|
||
if (err) return;
|
||
|
||
const tempFilePath = res.tempFilePaths[0];
|
||
|
||
// 上传照片并生成视频
|
||
const result = await uploadFile({
|
||
url: API_ENDPOINTS.revival.createVideo,
|
||
filePath: tempFilePath,
|
||
name: 'photo',
|
||
formData: {
|
||
voiceId: this.selectedVoiceId,
|
||
text: this.inputText,
|
||
name: this.videoName
|
||
}
|
||
});
|
||
|
||
if (result.success) {
|
||
uni.showToast({
|
||
title: '生成成功',
|
||
icon: 'success'
|
||
});
|
||
// 刷新列表
|
||
this.loadVideos();
|
||
}
|
||
} catch (error) {
|
||
console.error('上传失败:', error);
|
||
uni.showToast({
|
||
title: '上传失败',
|
||
icon: 'none'
|
||
});
|
||
}
|
||
},
|
||
|
||
/**
|
||
* 示例4: 下载视频
|
||
*/
|
||
async downloadVideo(videoUrl) {
|
||
try {
|
||
uni.showLoading({
|
||
title: '下载中...'
|
||
});
|
||
|
||
const tempFilePath = await downloadFile({
|
||
url: videoUrl
|
||
});
|
||
|
||
uni.hideLoading();
|
||
|
||
// 保存到相册
|
||
uni.saveVideoToPhotosAlbum({
|
||
filePath: tempFilePath,
|
||
success: () => {
|
||
uni.showToast({
|
||
title: '保存成功',
|
||
icon: 'success'
|
||
});
|
||
}
|
||
});
|
||
} catch (error) {
|
||
uni.hideLoading();
|
||
console.error('下载失败:', error);
|
||
uni.showToast({
|
||
title: '下载失败',
|
||
icon: 'none'
|
||
});
|
||
}
|
||
},
|
||
|
||
/**
|
||
* 示例5: 删除视频
|
||
*/
|
||
async deleteVideo(videoId) {
|
||
try {
|
||
const result = await request({
|
||
url: API_ENDPOINTS.revival.deleteVideo(videoId),
|
||
method: 'DELETE'
|
||
});
|
||
|
||
if (result.success) {
|
||
uni.showToast({
|
||
title: '删除成功',
|
||
icon: 'success'
|
||
});
|
||
// 刷新列表
|
||
this.loadVideos();
|
||
}
|
||
} catch (error) {
|
||
console.error('删除失败:', error);
|
||
uni.showToast({
|
||
title: '删除失败',
|
||
icon: 'none'
|
||
});
|
||
}
|
||
},
|
||
|
||
/**
|
||
* 示例6: 构建静态资源URL
|
||
*/
|
||
getResourceUrls() {
|
||
// 视频URL
|
||
const videoUrl = buildURL(API_ENDPOINTS.static.video('revival_test_123.mp4'));
|
||
// 结果: http://115.190.167.176:20002/static/videos/revival_test_123.mp4
|
||
|
||
// 图片URL
|
||
const imageUrl = buildURL(API_ENDPOINTS.static.image('avatar.jpg'));
|
||
// 结果: http://115.190.167.176:20002/static/images/avatar.jpg
|
||
|
||
// 音频URL
|
||
const audioUrl = buildURL(API_ENDPOINTS.conversation.getAudio('tts_123.mp3'));
|
||
// 结果: http://115.190.167.176:20002/api/conversation/audio/tts_123.mp3
|
||
|
||
return {
|
||
videoUrl,
|
||
imageUrl,
|
||
audioUrl
|
||
};
|
||
},
|
||
|
||
/**
|
||
* 示例7: 错误处理
|
||
*/
|
||
async loadDataWithErrorHandling() {
|
||
try {
|
||
const result = await request({
|
||
url: API_ENDPOINTS.revival.getList,
|
||
method: 'GET',
|
||
timeout: 10000 // 10秒超时
|
||
});
|
||
|
||
if (result.success) {
|
||
this.videos = result.data;
|
||
} else {
|
||
throw new Error(result.message || '请求失败');
|
||
}
|
||
} catch (error) {
|
||
console.error('加载失败:', error);
|
||
|
||
// 根据错误类型显示不同提示
|
||
if (error.errMsg && error.errMsg.includes('timeout')) {
|
||
uni.showToast({
|
||
title: '请求超时,请检查网络',
|
||
icon: 'none'
|
||
});
|
||
} else if (error.errMsg && error.errMsg.includes('fail')) {
|
||
uni.showToast({
|
||
title: '网络连接失败',
|
||
icon: 'none'
|
||
});
|
||
} else {
|
||
uni.showToast({
|
||
title: error.message || '加载失败',
|
||
icon: 'none'
|
||
});
|
||
}
|
||
}
|
||
},
|
||
|
||
/**
|
||
* 示例8: 并发请求
|
||
*/
|
||
async loadMultipleData() {
|
||
try {
|
||
uni.showLoading({
|
||
title: '加载中...'
|
||
});
|
||
|
||
// 同时请求多个接口
|
||
const [videosResult, voicesResult] = await Promise.all([
|
||
request({
|
||
url: API_ENDPOINTS.revival.getList,
|
||
method: 'GET'
|
||
}),
|
||
request({
|
||
url: API_ENDPOINTS.voice.getList,
|
||
method: 'GET'
|
||
})
|
||
]);
|
||
|
||
if (videosResult.success) {
|
||
this.videos = videosResult.data;
|
||
}
|
||
|
||
if (voicesResult.success) {
|
||
this.voices = voicesResult.data;
|
||
}
|
||
|
||
uni.hideLoading();
|
||
} catch (error) {
|
||
uni.hideLoading();
|
||
console.error('加载失败:', error);
|
||
}
|
||
}
|
||
}
|
||
};
|