refactor(project): Reorganize frontend and backend directories
This commit is contained in:
@@ -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)
|
||||
}
|
||||
}
|
||||
@@ -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}`)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user