diff --git a/demo/IMAGE_TO_VIDEO_API_README.md b/demo/IMAGE_TO_VIDEO_API_README.md index 466c5dd..3cac636 100644 --- a/demo/IMAGE_TO_VIDEO_API_README.md +++ b/demo/IMAGE_TO_VIDEO_API_README.md @@ -286,3 +286,5 @@ grep "img2vid_abc123def456" logs/application.log ``` + + diff --git a/demo/POINTS_FREEZE_SYSTEM_README.md b/demo/POINTS_FREEZE_SYSTEM_README.md index 7cd77ed..8b832b2 100644 --- a/demo/POINTS_FREEZE_SYSTEM_README.md +++ b/demo/POINTS_FREEZE_SYSTEM_README.md @@ -287,3 +287,5 @@ public TaskQueue addTextToVideoTask(String username, String taskId) { 5. **监控告警**: 监控积分冻结系统的运行状态 + + diff --git a/demo/PasswordChecker.java b/demo/PasswordChecker.java index 862bc89..bbf579e 100644 --- a/demo/PasswordChecker.java +++ b/demo/PasswordChecker.java @@ -32,3 +32,5 @@ public class PasswordChecker { + + diff --git a/demo/TEXT_TO_VIDEO_API_README.md b/demo/TEXT_TO_VIDEO_API_README.md index 70399bc..2fe9b02 100644 --- a/demo/TEXT_TO_VIDEO_API_README.md +++ b/demo/TEXT_TO_VIDEO_API_README.md @@ -296,3 +296,5 @@ const startPolling = (taskId) => { 如有问题,请联系开发团队或查看系统日志获取详细错误信息。 + + diff --git a/demo/TEXT_TO_VIDEO_IMPLEMENTATION_SUMMARY.md b/demo/TEXT_TO_VIDEO_IMPLEMENTATION_SUMMARY.md index 0b1163c..8869d9c 100644 --- a/demo/TEXT_TO_VIDEO_IMPLEMENTATION_SUMMARY.md +++ b/demo/TEXT_TO_VIDEO_IMPLEMENTATION_SUMMARY.md @@ -279,3 +279,5 @@ POST /api/text-to-video/tasks/{id}/cancel # 取消任务 **文生视频API已成功实现并可以投入使用!** 🎉 + + diff --git a/demo/USER_WORKS_SYSTEM_README.md b/demo/USER_WORKS_SYSTEM_README.md index 3b50ac8..d2675cd 100644 --- a/demo/USER_WORKS_SYSTEM_README.md +++ b/demo/USER_WORKS_SYSTEM_README.md @@ -166,3 +166,5 @@ const updateWork = async (workId, updateData) => { 5. **用户体验**: 提供友好的作品管理界面 + + diff --git a/demo/frontend/README.md b/demo/frontend/README.md index e8f8acd..89075cf 100644 --- a/demo/frontend/README.md +++ b/demo/frontend/README.md @@ -432,3 +432,5 @@ MIT License + + diff --git a/demo/frontend/src/App-backup.vue b/demo/frontend/src/App-backup.vue index 4769192..866c7a5 100644 --- a/demo/frontend/src/App-backup.vue +++ b/demo/frontend/src/App-backup.vue @@ -28,3 +28,5 @@ console.log('App.vue 加载成功') + + diff --git a/demo/frontend/src/api/auth.js b/demo/frontend/src/api/auth.js index e91c17d..364067b 100644 --- a/demo/frontend/src/api/auth.js +++ b/demo/frontend/src/api/auth.js @@ -5,6 +5,11 @@ export const login = (credentials) => { return api.post('/auth/login', credentials) } +// 邮箱验证码登录 +export const loginWithEmail = (credentials) => { + return api.post('/auth/login/email', credentials) +} + export const register = (userData) => { return api.post('/auth/register', userData) } diff --git a/demo/frontend/src/api/cleanup.js b/demo/frontend/src/api/cleanup.js index 029bf5f..ce507a4 100644 --- a/demo/frontend/src/api/cleanup.js +++ b/demo/frontend/src/api/cleanup.js @@ -29,7 +29,7 @@ export const cleanupApi = { // 获取清理统计信息(原始fetch方式,用于测试) async getCleanupStatsRaw() { try { - const response = await fetch('/api/cleanup/cleanup-stats') + const response = await fetch('http://localhost:8080/api/cleanup/cleanup-stats') if (response.ok) { return await response.json() } else { @@ -44,7 +44,7 @@ export const cleanupApi = { // 执行完整清理(原始fetch方式,用于测试) async performFullCleanupRaw() { try { - const response = await fetch('/api/cleanup/full-cleanup', { + const response = await fetch('http://localhost:8080/api/cleanup/full-cleanup', { method: 'POST', headers: { 'Content-Type': 'application/json' diff --git a/demo/frontend/src/api/userWorks.js b/demo/frontend/src/api/userWorks.js new file mode 100644 index 0000000..c3cdc53 --- /dev/null +++ b/demo/frontend/src/api/userWorks.js @@ -0,0 +1,58 @@ +import request from './request' + +// 获取我的作品列表 +export const getMyWorks = (params = {}) => { + return request({ + url: '/works/my-works', + method: 'GET', + params: { + page: params.page || 0, + size: params.size || 10 + } + }) +} + +// 获取作品详情 +export const getWorkDetail = (workId) => { + return request({ + url: `/works/${workId}`, + method: 'GET' + }) +} + +// 删除作品 +export const deleteWork = (workId) => { + return request({ + url: `/works/${workId}`, + method: 'DELETE' + }) +} + +// 批量删除作品 +export const batchDeleteWorks = (workIds) => { + return request({ + url: '/works/batch-delete', + method: 'POST', + data: { + workIds: workIds + } + }) +} + +// 更新作品信息 +export const updateWork = (workId, data) => { + return request({ + url: `/works/${workId}`, + method: 'PUT', + data: data + }) +} + +// 获取作品统计信息 +export const getWorkStats = () => { + return request({ + url: '/works/stats', + method: 'GET' + }) +} + diff --git a/demo/frontend/src/components/Footer.vue b/demo/frontend/src/components/Footer.vue index d5ecad9..c163279 100644 --- a/demo/frontend/src/components/Footer.vue +++ b/demo/frontend/src/components/Footer.vue @@ -91,3 +91,5 @@ + + diff --git a/demo/frontend/src/components/PaymentModal.vue b/demo/frontend/src/components/PaymentModal.vue new file mode 100644 index 0000000..e6d50ba --- /dev/null +++ b/demo/frontend/src/components/PaymentModal.vue @@ -0,0 +1,502 @@ + + + + + diff --git a/demo/frontend/src/views/CleanupTest.vue b/demo/frontend/src/views/CleanupTest.vue index 5b21ef2..a9e39aa 100644 --- a/demo/frontend/src/views/CleanupTest.vue +++ b/demo/frontend/src/views/CleanupTest.vue @@ -167,7 +167,7 @@ const testGetStats = async () => { statsError.value = null try { - const response = await fetch('/api/cleanup/cleanup-stats', { + const response = await fetch('http://localhost:8080/api/cleanup/cleanup-stats', { headers: { 'Content-Type': 'application/json', ...getAuthHeaders() @@ -193,7 +193,7 @@ const testFullCleanup = async () => { cleanupError.value = null try { - const response = await fetch('/api/cleanup/full-cleanup', { + const response = await fetch('http://localhost:8080/api/cleanup/full-cleanup', { method: 'POST', headers: { 'Content-Type': 'application/json', @@ -252,7 +252,7 @@ const testQueueStatus = async () => { queueError.value = null try { - const response = await fetch('/api/diagnostic/queue-status') + const response = await fetch('http://localhost:8080/api/diagnostic/queue-status') if (response.ok) { queueResult.value = await response.json() ElMessage.success('获取队列状态成功') diff --git a/demo/frontend/src/views/ImageToVideo.vue b/demo/frontend/src/views/ImageToVideo.vue index 02099dd..e0ccc1c 100644 --- a/demo/frontend/src/views/ImageToVideo.vue +++ b/demo/frontend/src/views/ImageToVideo.vue @@ -201,11 +201,11 @@ const goToMyWorks = () => { } const goToTextToVideo = () => { - router.push('/text-to-video') + router.push('/text-to-video/create') } const goToStoryboardVideo = () => { - router.push('/storyboard-video') + router.push('/storyboard-video/create') } const goToCreate = (work) => { diff --git a/demo/frontend/src/views/Login.vue b/demo/frontend/src/views/Login.vue index cede834..4d7237f 100644 --- a/demo/frontend/src/views/Login.vue +++ b/demo/frontend/src/views/Login.vue @@ -148,7 +148,7 @@ const getEmailCode = async () => { try { // 调用后端API发送邮箱验证码 - const response = await fetch('/api/verification/email/send', { + const response = await fetch('http://localhost:8080/api/verification/email/send', { method: 'POST', headers: { 'Content-Type': 'application/json' @@ -176,7 +176,7 @@ const getEmailCode = async () => { // 开发模式:将验证码同步到后端 try { - await fetch('/api/verification/email/dev-set', { + await fetch('http://localhost:8080/api/verification/email/dev-set', { method: 'POST', headers: { 'Content-Type': 'application/json' @@ -234,7 +234,7 @@ const handleLogin = async () => { // 邮箱验证码登录 try { - const response = await fetch('/api/auth/login/email', { + const response = await fetch('http://localhost:8080/api/auth/login/email', { method: 'POST', headers: { 'Content-Type': 'application/json' diff --git a/demo/frontend/src/views/MyWorks.vue b/demo/frontend/src/views/MyWorks.vue index 549e2dd..9378483 100644 --- a/demo/frontend/src/views/MyWorks.vue +++ b/demo/frontend/src/views/MyWorks.vue @@ -315,6 +315,7 @@ import { ref, onMounted, computed } from 'vue' import { useRouter } from 'vue-router' import { ElMessage, ElMessageBox } from 'element-plus' import { Star, User, Compass, Document, VideoPlay, Picture, Film, Bell, Setting, Search } from '@element-plus/icons-vue' +import { getMyWorks } from '@/api/userWorks' const router = useRouter() @@ -343,12 +344,20 @@ const items = ref([]) const loadList = async () => { loading.value = true try { - const response = await api.get('/user-works') - const data = response.data.data || [] + const response = await getMyWorks({ + page: page.value - 1, // 后端使用0-based分页 + size: pageSize.value + }) - if (page.value === 1) items.value = [] - items.value = items.value.concat(data) - hasMore.value = data.length < pageSize.value + if (response.data.success) { + const data = response.data.data || [] + + if (page.value === 1) items.value = [] + items.value = items.value.concat(data) + hasMore.value = data.length === pageSize.value + } else { + throw new Error(response.data.message || '获取作品列表失败') + } } catch (error) { console.error('加载作品列表失败:', error) ElMessage.error('加载作品列表失败') @@ -512,18 +521,18 @@ const goToSubscription = () => { } const goToTextToVideo = () => { - console.log('导航到文生视频') - router.push('/text-to-video') + console.log('导航到文生视频创作') + router.push('/text-to-video/create') } const goToImageToVideo = () => { - console.log('导航到图生视频') - router.push('/image-to-video') + console.log('导航到图生视频创作') + router.push('/image-to-video/create') } const goToStoryboardVideo = () => { - console.log('导航到分镜视频') - router.push('/storyboard-video') + console.log('导航到分镜视频创作') + router.push('/storyboard-video/create') } // 重置筛选器 diff --git a/demo/frontend/src/views/Profile.vue b/demo/frontend/src/views/Profile.vue index 7b6cf46..3997bb3 100644 --- a/demo/frontend/src/views/Profile.vue +++ b/demo/frontend/src/views/Profile.vue @@ -179,15 +179,15 @@ const goToMyWorks = () => { } const goToTextToVideo = () => { - router.push('/text-to-video') + router.push('/text-to-video/create') } const goToImageToVideo = () => { - router.push('/image-to-video') + router.push('/image-to-video/create') } const goToStoryboardVideo = () => { - router.push('/storyboard-video') + router.push('/storyboard-video/create') } // 跳转到数据仪表盘 diff --git a/demo/frontend/src/views/StoryboardVideo.vue b/demo/frontend/src/views/StoryboardVideo.vue index ae09bbf..90b03af 100644 --- a/demo/frontend/src/views/StoryboardVideo.vue +++ b/demo/frontend/src/views/StoryboardVideo.vue @@ -201,11 +201,11 @@ const goToMyWorks = () => { } const goToTextToVideo = () => { - router.push('/text-to-video') + router.push('/text-to-video/create') } const goToImageToVideo = () => { - router.push('/image-to-video') + router.push('/image-to-video/create') } const goToCreate = (work) => { diff --git a/demo/frontend/src/views/Subscription.vue b/demo/frontend/src/views/Subscription.vue index 6d5a8e9..a21644c 100644 --- a/demo/frontend/src/views/Subscription.vue +++ b/demo/frontend/src/views/Subscription.vue @@ -129,7 +129,7 @@
$59/月
每月200积分
- +
@@ -154,7 +154,7 @@
$259/月
每月1000积分
- +
@@ -226,12 +226,25 @@
+ + +