-
-
-
-
-
-
+
+
+
热门精选
+
发现值得反复观看的优质内容
+
围绕技术分享、知识学习与生活记录构建内容分发首页,提供推荐、热门与分类浏览体验。
+
+
+
{{ videos.length || 12 }}精选视频
+
{{ categories.length || 5 }}内容分区
+
24h热度更新
+
+
@@ -42,7 +48,7 @@
+
+
diff --git a/frontend/video-frontend-web/src/views/user/followers.vue b/frontend/video-frontend-web/src/views/user/followers.vue
index 3b9ad97..7a8e56a 100644
--- a/frontend/video-frontend-web/src/views/user/followers.vue
+++ b/frontend/video-frontend-web/src/views/user/followers.vue
@@ -35,8 +35,9 @@
import { ref, onMounted } from 'vue'
import { useRouter, useRoute } from 'vue-router'
import { showToast, showSuccessToast } from 'vant'
-import { userApi, type UserFollow } from '@/api/user.ts'
+import { userApi } from '@/api/user.ts'
import { useUserStore } from '@/stores/user.ts'
+import type { UserFollow } from '@/types'
const router = useRouter()
const route = useRoute()
@@ -46,8 +47,6 @@ const userId = Number(route.params.id)
const users = ref
([])
const loading = ref(false)
const finished = ref(false)
-const currentPage = ref(1)
-
const defaultAvatar = 'data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"%3E%3Ccircle cx="50" cy="50" r="50" fill="%23e0e0e0"/%3E%3Ctext x="50%25" y="50%25" fill="%23999" text-anchor="middle" dy=".3em"%3EU%3C/text%3E%3C/svg%3E'
const loadUsers = async () => {
diff --git a/frontend/video-frontend-web/src/views/user/following.vue b/frontend/video-frontend-web/src/views/user/following.vue
index b46edad..75a0d47 100644
--- a/frontend/video-frontend-web/src/views/user/following.vue
+++ b/frontend/video-frontend-web/src/views/user/following.vue
@@ -35,7 +35,8 @@
import { ref, onMounted } from 'vue'
import { useRouter, useRoute } from 'vue-router'
import { showToast, showSuccessToast } from 'vant'
-import { userApi, type UserFollow } from '@/api/user.ts'
+import { userApi } from '@/api/user.ts'
+import type { UserFollow } from '@/types'
const router = useRouter()
const route = useRoute()
@@ -86,7 +87,9 @@ onMounted(() => {
diff --git a/frontend/video-frontend-web/src/views/user/history.vue b/frontend/video-frontend-web/src/views/user/history.vue
index 41470da..b9114e7 100644
--- a/frontend/video-frontend-web/src/views/user/history.vue
+++ b/frontend/video-frontend-web/src/views/user/history.vue
@@ -39,6 +39,7 @@ import { ref, onMounted } from 'vue'
import { useRouter } from 'vue-router'
import { showToast, showConfirmDialog } from 'vant'
import { formatDuration } from '@/utils'
+import { mockVideos } from '@/mock/data'
interface HistoryItem {
videoId: number
@@ -60,7 +61,13 @@ const loadVideos = async (isRefresh = false) => {
finished.value = false
}
loading.value = true
- // TODO: 实际从API获取播放历史
+ videos.value = mockVideos.slice(0, 4).map((item, index) => ({
+ videoId: item.id,
+ title: item.title,
+ coverUrl: item.coverUrl,
+ progress: Math.max(60, Math.floor(item.duration * (0.2 + index * 0.12))),
+ duration: item.duration
+ }))
finished.value = true
loading.value = false
refreshing.value = false
diff --git a/frontend/video-frontend-web/src/views/user/my-videos.vue b/frontend/video-frontend-web/src/views/user/my-videos.vue
index 0d7f37e..7463f00 100644
--- a/frontend/video-frontend-web/src/views/user/my-videos.vue
+++ b/frontend/video-frontend-web/src/views/user/my-videos.vue
@@ -58,14 +58,14 @@ const finished = ref(false)
const refreshing = ref(false)
const currentPage = ref(1)
-const getStatusType = (status: number) => {
- const types: Record = {
+const getStatusType = (status: number): 'warning' | 'success' | 'danger' | 'primary' => {
+ const types: Record = {
0: 'warning',
1: 'success',
2: 'danger',
- 3: 'default'
+ 3: 'primary'
}
- return types[status] || 'default'
+ return types[status] || 'primary'
}
const getStatusText = (status: number) => {
@@ -89,7 +89,7 @@ const loadVideos = async (isRefresh = false) => {
loading.value = true
try {
- const res = await videoApi.getUserVideos(userStore.userId, { page: currentPage.value, size: 20 })
+ const res = await videoApi.getUserVideos(userStore.userId, { pageNum: currentPage.value, pageSize: 20 })
if (isRefresh) {
videos.value = res.records
} else {
diff --git a/frontend/video-frontend-web/src/views/user/notification.vue b/frontend/video-frontend-web/src/views/user/notification.vue
new file mode 100644
index 0000000..fd1cd3a
--- /dev/null
+++ b/frontend/video-frontend-web/src/views/user/notification.vue
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 保存设置
+
+
+
+
+
+
+
diff --git a/frontend/video-frontend-web/src/views/user/privacy.vue b/frontend/video-frontend-web/src/views/user/privacy.vue
new file mode 100644
index 0000000..2ab0e0d
--- /dev/null
+++ b/frontend/video-frontend-web/src/views/user/privacy.vue
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 保存设置
+
+
+
+
+
+
+
diff --git a/frontend/video-frontend-web/src/views/user/profile-edit.vue b/frontend/video-frontend-web/src/views/user/profile-edit.vue
index da7a62d..8305d3f 100644
--- a/frontend/video-frontend-web/src/views/user/profile-edit.vue
+++ b/frontend/video-frontend-web/src/views/user/profile-edit.vue
@@ -42,10 +42,8 @@ import { ref, reactive, onMounted } from 'vue'
import { useRouter } from 'vue-router'
import { showToast, showSuccessToast } from 'vant'
import { userApi } from '@/api/user.ts'
-import { useUserStore } from '@/stores/user.ts'
const router = useRouter()
-const userStore = useUserStore()
const saving = ref(false)
const showBirthdayPicker = ref(false)
@@ -137,11 +135,16 @@ onMounted(() => {
diff --git a/frontend/video-frontend-web/src/views/user/profile.vue b/frontend/video-frontend-web/src/views/user/profile.vue
index 4aa898a..fd8d668 100644
--- a/frontend/video-frontend-web/src/views/user/profile.vue
+++ b/frontend/video-frontend-web/src/views/user/profile.vue
@@ -1,65 +1,74 @@