refactor(project): Reorganize frontend and backend directories

This commit is contained in:
2026-03-18 10:45:15 +08:00
parent cc9eaf4cdf
commit 92a139e470
513 changed files with 28251 additions and 287 deletions
@@ -0,0 +1,62 @@
import request from '@/utils/request.ts'
import type {
LoginParams,
LoginResult,
RegisterParams,
CaptchaResult,
AuthUser
} from '@/types'
/**
* 认证相关 API
*/
export const authApi = {
/**
* 用户登录
*/
login(params: LoginParams): Promise<LoginResult> {
return request.post('/auth/login', params)
},
/**
* 用户注册
*/
register(params: RegisterParams): Promise<string> {
return request.post('/auth/register', params)
},
/**
* 获取验证码
*/
getCaptcha(): Promise<CaptchaResult> {
return request.get('/auth/captcha')
},
/**
* 刷新 Token
*/
refreshToken(refreshToken: string): Promise<LoginResult> {
return request.post('/auth/refresh', { refreshToken })
},
/**
* 用户登出
*/
logout(): Promise<void> {
return request.post('/auth/logout')
},
/**
* 获取当前用户信息
*/
getCurrentUser(): Promise<AuthUser> {
return request.get('/auth/current')
},
/**
* 根据用户ID获取用户名
*/
getUsername(userId: number): Promise<string> {
return request.get(`/auth/username/${userId}`)
}
}
@@ -0,0 +1,47 @@
import request from '@/utils/request.ts'
import type { Category, Tag, PageResult, PageParams } from '@/types'
/**
* 分类相关 API
*/
export const categoryApi = {
/**
* 获取分类树
*/
getCategoryTree(): Promise<Category[]> {
return request.get('/content/category/tree')
},
/**
* 获取分类列表
*/
getCategoryList(): Promise<Category[]> {
return request.get('/content/category/list')
}
}
/**
* 标签相关 API
*/
export const tagApi = {
/**
* 获取标签列表
*/
getTagList(): Promise<Tag[]> {
return request.get('/content/tag/list')
},
/**
* 分页获取标签
*/
getTagPage(params?: PageParams): Promise<PageResult<Tag>> {
return request.get('/content/tag/page', params)
},
/**
* 获取视频标签
*/
getVideoTags(videoId: number): Promise<Tag[]> {
return request.get(`/content/tag/video/${videoId}`)
}
}
@@ -0,0 +1,114 @@
import request from '@/utils/request.ts'
import type { Comment, CommentSendParams, CommentQueryParams, PageResult } from '@/types'
/**
* 评论相关 API
*/
export const commentApi = {
/**
* 发表评论
*/
addComment(params: CommentSendParams): Promise<Comment> {
return request.post('/comment', params)
},
/**
* 获取评论列表(公开接口)
*/
getCommentList(params: CommentQueryParams): Promise<PageResult<Comment>> {
return request.get('/comment/public/list', params)
},
/**
* 获取评论详情(公开接口)
*/
getCommentDetail(id: number): Promise<Comment> {
return request.get(`/comment/public/detail/${id}`)
},
/**
* 删除评论
*/
deleteComment(id: number): Promise<void> {
return request.delete(`/comment/${id}`)
},
/**
* 点赞评论
*/
likeComment(id: number): Promise<void> {
return request.post(`/comment/like/${id}`)
},
/**
* 取消点赞评论
*/
unlikeComment(id: number): Promise<void> {
return request.delete(`/comment/like/${id}`)
},
/**
* 置顶评论
*/
topComment(id: number): Promise<void> {
return request.post(`/comment/top/${id}`)
},
/**
* 取消置顶评论
*/
untopComment(id: number): Promise<void> {
return request.delete(`/comment/top/${id}`)
},
/**
* 获取评论统计信息(公开接口)
*/
getCommentStat(videoId: number): Promise<{ total: number; hotCount: number }> {
return request.get(`/comment/public/stat/${videoId}`)
},
// ==================== 回复相关 ====================
/**
* 添加回复
*/
addReply(params: { commentId: number; content: string; replyId?: number }): Promise<Comment> {
return request.post('/comment/reply', params)
},
/**
* 获取评论的回复列表(公开接口)
*/
getReplyList(commentId: number, params?: { page?: number; size?: number }): Promise<PageResult<Comment>> {
return request.get(`/comment/reply/public/list/${commentId}`, params)
},
/**
* 获取评论的热门回复(公开接口)
*/
getHotReplies(commentId: number, limit?: number): Promise<Comment[]> {
return request.get(`/comment/reply/public/hot/${commentId}`, { limit })
},
/**
* 删除回复
*/
deleteReply(id: number): Promise<void> {
return request.delete(`/comment/reply/${id}`)
},
/**
* 点赞回复
*/
likeReply(id: number): Promise<void> {
return request.post(`/comment/reply/like/${id}`)
},
/**
* 取消点赞回复
*/
unlikeReply(id: number): Promise<void> {
return request.delete(`/comment/reply/like/${id}`)
}
}
@@ -0,0 +1,28 @@
import request from '@/utils/request.ts'
import type { Danmaku, DanmakuSendParams } from '@/types'
/**
* 弹幕相关 API
*/
export const danmakuApi = {
/**
* 发送弹幕
*/
sendDanmaku(params: DanmakuSendParams): Promise<Danmaku> {
return request.post('/content/danmaku', params)
},
/**
* 获取视频指定时间段的弹幕
*/
getDanmakuByTime(videoId: number, startTime: number, endTime: number): Promise<Danmaku[]> {
return request.get('/content/danmaku/time', { videoId, startTime, endTime })
},
/**
* 获取视频所有弹幕
*/
getAllDanmaku(videoId: number): Promise<Danmaku[]> {
return request.get(`/content/danmaku/all/${videoId}`)
}
}
@@ -0,0 +1,42 @@
import request from '@/utils/request.ts'
import type { Favorite, FavoriteCreateParams, FavoriteVideoParams, VideoInfo, PageResult, PageParams } from '@/types'
/**
* 收藏夹相关 API
*/
export const favoriteApi = {
/**
* 获取用户收藏夹列表
*/
getFavoriteList(): Promise<Favorite[]> {
return request.get('/content/favorite/list')
},
/**
* 创建收藏夹
*/
createFavorite(params: FavoriteCreateParams): Promise<Favorite> {
return request.post('/content/favorite', params)
},
/**
* 更新收藏夹
*/
updateFavorite(params: Partial<Favorite> & { id: number }): Promise<void> {
return request.put('/content/favorite', params)
},
/**
* 删除收藏夹
*/
deleteFavorite(id: number): Promise<void> {
return request.delete(`/content/favorite/${id}`)
},
/**
* 获取收藏夹中的视频
*/
getFavoriteVideos(favoriteId: number, params?: PageParams): Promise<PageResult<VideoInfo>> {
return request.get(`/content/favorite/${favoriteId}/videos`, params)
}
}
@@ -0,0 +1,30 @@
import request from '@/utils/request.ts'
/**
* 文件上传 API
*/
export const uploadApi = {
/**
* 上传图片
*/
uploadImage(file: File, onProgress?: (percent: number) => void): Promise<string> {
return request.upload('/user/profile/avatar', file, onProgress)
},
/**
* 上传视频
*/
uploadVideo(file: File, onProgress?: (percent: number) => void): Promise<{ videoUrl: string; coverUrl: string }> {
return request.upload('/content/video/upload', file, onProgress)
}
}
// 导出所有 API
export * from './auth.ts'
export * from './user.ts'
export * from './video.ts'
export * from './comment.ts'
export * from './category.ts'
export * from './danmaku.ts'
export * from './favorite.ts'
export * from './recommend.ts'
@@ -0,0 +1,52 @@
import request from '@/utils/request.ts'
import type { VideoInfo, RecommendVideo } from '@/types'
/**
* 推荐相关 API
*/
export const recommendApi = {
/**
* 获取首页推荐
*/
getHomeRecommend(limit?: number): Promise<VideoInfo[]> {
return request.get('/recommend/home', { limit })
},
/**
* 获取热门推荐
*/
getHotRecommend(params?: { page?: number; size?: number }): Promise<VideoInfo[]> {
return request.get('/recommend/hot', params)
},
/**
* 获取相似视频推荐
*/
getSimilarVideos(videoId: number, limit?: number): Promise<VideoInfo[]> {
return request.get(`/recommend/similar/${videoId}`, { limit })
},
/**
* 获取标签视频推荐
*/
getTagVideos(tagId: number, params?: { page?: number; size?: number }): Promise<VideoInfo[]> {
return request.get(`/recommend/tag/${tagId}`, params)
},
/**
* 记录用户行为
*/
recordBehavior(params: {
videoId: number
actionType: 'view' | 'like' | 'coin' | 'favorite' | 'share' | 'comment'
}): Promise<void> {
return request.post('/recommend/behavior', params)
},
/**
* 更新用户兴趣
*/
updateInterest(params: { tagIds: number[] }): Promise<void> {
return request.post('/recommend/interest/update', params)
}
}
+183
View File
@@ -0,0 +1,183 @@
import request from '@/utils/request.ts'
import type {
UserInfo,
UserProfileUpdateParams,
UserFollow,
UserSetting,
Message,
MessageSendParams,
Notification,
PageParams,
PageResult
} from '@/types'
/**
* 用户相关 API
*/
export const userApi = {
// ==================== 用户资料 ====================
/**
* 获取当前用户资料
*/
getCurrentProfile(): Promise<UserInfo> {
return request.get('/user/profile/current')
},
/**
* 获取指定用户资料
*/
getPublicProfile(userId: number): Promise<UserInfo> {
return request.get(`/user/profile/public/${userId}`)
},
/**
* 更新用户资料
*/
updateProfile(params: UserProfileUpdateParams): Promise<void> {
return request.put('/user/profile', params)
},
/**
* 上传头像
*/
uploadAvatar(file: File, onProgress?: (percent: number) => void): Promise<string> {
return request.upload('/user/profile/avatar', file, onProgress)
},
/**
* 搜索用户
*/
searchUsers(keyword: string, params?: PageParams): Promise<PageResult<UserInfo>> {
return request.get('/user/profile/search', { keyword, ...params })
},
// ==================== 用户关注 ====================
/**
* 关注用户
*/
follow(followId: number): Promise<void> {
return request.post(`/user/follow/${followId}`)
},
/**
* 取消关注
*/
unfollow(followId: number): Promise<void> {
return request.delete(`/user/follow/${followId}`)
},
/**
* 获取关注列表
*/
getFollowing(userId: number, params?: PageParams): Promise<UserFollow[]> {
return request.get(`/user/follow/following/${userId}`, params)
},
/**
* 获取粉丝列表
*/
getFollowers(userId: number, params?: PageParams): Promise<UserFollow[]> {
return request.get(`/user/follow/followers/${userId}`, params)
},
/**
* 检查是否已关注
*/
checkFollow(followId: number): Promise<boolean> {
return request.get(`/user/follow/check/${followId}`)
},
// 兼容旧名称
followUser: function(followId: number): Promise<void> {
return this.follow(followId)
},
unfollowUser: function(followId: number): Promise<void> {
return this.unfollow(followId)
},
// ==================== 用户私信 ====================
/**
* 发送私信
*/
sendMessage(params: MessageSendParams): Promise<Message> {
return request.post('/user/message', params)
},
/**
* 获取私信会话列表
*/
getMessageList(params?: PageParams): Promise<Message[]> {
return request.get('/user/message/list', params)
},
/**
* 获取与指定用户的私信记录
*/
getMessageDetail(targetId: number, params?: PageParams): Promise<Message[]> {
return request.get(`/user/message/detail/${targetId}`, params)
},
/**
* 标记私信为已读
*/
markMessageRead(senderId: number): Promise<void> {
return request.put(`/user/message/read/${senderId}`)
},
/**
* 获取未读私信数量
*/
getUnreadMessageCount(): Promise<number> {
return request.get('/user/message/unread/count')
},
// ==================== 用户通知 ====================
/**
* 获取通知列表
*/
getNotifications(type?: number, params?: PageParams): Promise<Notification[]> {
return request.get('/user/notification/list', { type, ...params })
},
/**
* 标记所有通知为已读
*/
markAllNotificationsRead(): Promise<void> {
return request.put('/user/notification/read')
},
/**
* 标记指定通知为已读
*/
markNotificationRead(notificationId: number): Promise<void> {
return request.put(`/user/notification/read/${notificationId}`)
},
/**
* 获取未读通知数量
*/
getUnreadNotificationCount(): Promise<number> {
return request.get('/user/notification/unread/count')
},
// ==================== 用户设置 ====================
/**
* 获取用户设置
*/
getSettings(): Promise<UserSetting> {
return request.get('/user/setting')
},
/**
* 更新用户设置
*/
updateSettings(params: Partial<UserSetting>): Promise<void> {
return request.put('/user/setting', params)
}
}
@@ -0,0 +1,142 @@
import request from '@/utils/request.ts'
import type {
VideoInfo,
VideoCreateParams,
VideoUpdateParams,
VideoQueryParams,
VideoUploadParams,
PlayRecord,
PageResult
} from '@/types'
/**
* 视频相关 API
*/
export const videoApi = {
// ==================== 视频上传 ====================
/**
* 上传视频文件
*/
uploadVideo(params: VideoUploadParams): Promise<{ videoUrl: string; coverUrl: string }> {
return request.upload('/content/video/upload', params.file, params.onProgress)
},
/**
* 创建视频记录
*/
createVideo(params: VideoCreateParams): Promise<VideoInfo> {
return request.post('/content/video', params)
},
// ==================== 视频查询 ====================
/**
* 获取视频详情(公开接口)
*/
getVideoPublic(id: number): Promise<VideoInfo> {
return request.get(`/content/video/public/${id}`)
},
/**
* 获取视频列表(公开接口)
*/
getVideoPublicList(params?: VideoQueryParams): Promise<PageResult<VideoInfo>> {
return request.get('/content/video/public/list', params)
},
/**
* 获取视频详情(需登录)
*/
getVideo(id: number): Promise<VideoInfo> {
return request.get(`/content/video/${id}`)
},
/**
* 获取视频列表(需登录)
*/
getVideoList(params?: VideoQueryParams): Promise<PageResult<VideoInfo>> {
return request.get('/content/video/list', params)
},
/**
* 获取用户视频列表
*/
getUserVideos(userId: number, params?: VideoQueryParams): Promise<PageResult<VideoInfo>> {
return request.get(`/content/video/user/${userId}`, params)
},
// ==================== 视频管理 ====================
/**
* 更新视频信息
*/
updateVideo(params: VideoUpdateParams): Promise<void> {
return request.put('/content/video', params)
},
/**
* 删除视频
*/
deleteVideo(id: number): Promise<void> {
return request.delete(`/content/video/${id}`)
},
// ==================== 视频互动 ====================
/**
* 点赞视频
*/
likeVideo(videoId: number): Promise<void> {
return request.post(`/content/video/like/${videoId}`)
},
/**
* 取消点赞
*/
unlikeVideo(videoId: number): Promise<void> {
return request.delete(`/content/video/like/${videoId}`)
},
/**
* 投币
*/
coinVideo(videoId: number): Promise<void> {
return request.post(`/content/video/coin/${videoId}`)
},
/**
* 收藏视频
*/
favoriteVideo(videoId: number, favoriteId: number): Promise<void> {
return request.post('/content/video/favorite', { videoId, favoriteId })
},
/**
* 取消收藏
*/
unfavoriteVideo(videoId: number): Promise<void> {
return request.delete(`/content/video/favorite/${videoId}`)
},
/**
* 分享视频
*/
shareVideo(videoId: number): Promise<void> {
return request.post(`/content/video/share/${videoId}`)
},
/**
* 记录播放
*/
recordPlay(params: PlayRecord): Promise<void> {
return request.post('/content/video/play', params)
},
/**
* 增加评论数量(内部接口)
*/
incrementCommentCount(videoId: number, count: number): Promise<void> {
return request.post(`/content/video/count/comment/${videoId}/${count}`)
}
}