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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
![支付二维码]()
+
+
+
支付前请阅读《XX 付费服务协议》
+
+
+
+
+
+
请使用支付宝扫描上方二维码完成支付
+
支付完成后页面将自动更新
+
+
+
+
+
+
+
+
+
+
+
+
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积分
-
+
+
+
+