topfans/frontend/utils/api.js
2026-05-07 14:12:07 +08:00

628 lines
14 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// API 基础配置
// const baseURL = 'http://101.132.250.62:8080'
// const baseURL = 'http://192.168.110.60:8080'
const baseURL = 'http://localhost:8080'
// 是否使用模拟数据(开发调试时设为 true后端API准备好后改为 false
const USE_MOCK_API = false
// 模拟网络延迟
function mockDelay(ms = 800) {
return new Promise(resolve => setTimeout(resolve, ms))
}
// 请求封装
export function request(options) {
return new Promise((resolve, reject) => {
// 构建请求头
const headers = {
'Content-Type': 'application/json',
...options.header
}
// 判断是否为登录或注册接口
const isAuthRequest = options.url.includes('/api/v1/auth/login') || options.url.includes(
'/api/v1/auth/register')
// 如果不是登录/注册接口则自动添加JWT token
if (!isAuthRequest) {
const token = uni.getStorageSync('access_token')
if (token) {
headers['Authorization'] = `Bearer ${token}`
}
}
uni.request({
url: baseURL + options.url,
method: options.method || 'GET',
data: options.data || {},
header: headers,
timeout: 60000,
success: (res) => {
// 处理token过期HTTP 401未授权
if (res.statusCode === 401) {
// 清除本地存储的token和用户信息
uni.removeStorageSync('access_token')
uni.removeStorageSync('user')
// 跳转到登录页
uni.reLaunch({
url: '/pages/login/login'
})
reject(new Error('登录已过期,请重新登录'))
return
}
// 可以在这里统一处理响应
if (res.statusCode === 200 || res.statusCode === 202) {
// 检查业务状态码
if (res.data && res.data.code !== undefined) {
if (res.data.code === 200) {
resolve(res.data)
} else if (res.data.code === 401 || res.data.code === 400 || res.data
.code === 403) {
// 业务状态码401/400/403未授权/冻结/封号),清除缓存并跳转到登录页
uni.removeStorageSync('access_token')
uni.removeStorageSync('user')
// 保留错误消息用于显示
const errorMsg = res.data.message || '登录已过期,请重新登录'
uni.reLaunch({
url: '/pages/login/login?error=' + encodeURIComponent(
errorMsg)
})
reject(new Error(errorMsg))
return
} else {
// 其他业务错误,返回包含 message 的错误
reject(new Error(res.data.message || '请求失败'))
}
} else {
resolve(res.data)
}
} else {
// HTTP 错误,尝试从响应中获取 message
const errorMessage = res.data?.message || `请求失败 (${res.statusCode})`
reject(new Error(errorMessage))
}
},
fail: (err) => {
reject(err)
}
})
})
}
// 登录接口
export function loginApi(mobile, password) {
return request({
url: '/api/v1/auth/login',
method: 'POST',
data: {
mobile,
password
}
})
}
// 检查昵称是否已被注册
export function checkNicknameApi(nickname) {
return request({
url: '/api/v1/auth/check-nickname',
method: 'POST',
data: {
nickname
}
})
}
// 检查手机号是否已被注册
export function checkmobileApi(mobile) {
return request({
url: '/api/v1/auth/check-mobile',
method: 'POST',
data: {
mobile
}
})
}
// 注册接口
export function registerApi(mobile, password, star_id, nickname) {
return request({
url: '/api/v1/auth/register',
method: 'POST',
data: {
mobile,
password,
star_id,
nickname
}
})
}
// 更新用户信息接口
export function updateUserInfoApi(nickname) {
return request({
url: '/api/user/update',
method: 'POST',
data: {
nickname
}
})
}
// 获取随机用户列表(广场页面使用)
export function getRandomUsersApi(page = 1, pageSize) {
return request({
url: `/api/v1/social/users?page=${page}&page_size=${pageSize}`,
method: 'GET'
})
}
// 好友列表接口
export function friendListApi(page = 1, pageSize = 10) {
return request({
url: `/api/v1/social/friends?page=${page}&page_size=${pageSize}`,
method: 'GET'
})
}
// 获取用户信息接口从缓存或API
export function getUserProfileApi() {
return request({
url: '/api/v1/auth/me',
method: 'GET'
})
}
// 修改昵称接口
export function updateNicknameApi(nickname) {
return request({
url: '/api/v1/me/nickname',
method: 'PUT',
data: {
nickname
}
})
}
// 模拟注销账号接口
async function mockDeleteAccountApi() {
await mockDelay(600) // 模拟网络延迟
return {
code: 200,
message: '账号注销成功',
data: null
}
}
// 注销账号接口
export function deleteAccountApi() {
if (USE_MOCK_API) {
return mockDeleteAccountApi()
}
return request({
url: '/api/user/delete-account',
method: 'POST'
})
}
// 修改密码接口
export function updatePasswordApi(oldPassword, newPassword) {
return request({
url: '/api/v1/account/password',
method: 'POST',
data: {
old_password: oldPassword,
new_password: newPassword
}
})
}
// 搜索用户
export function searchUserApi(friendUserId) {
return request({
url: `/api/v1/social/search-user?friend_fan_profile_id=${friendUserId}`,
method: 'GET'
})
}
// 获取已发送的好友请求
export function getSentFriendRequestsApi(page = 1, pageSize = 10) {
return request({
url: `/api/v1/social/friend-requests?type=sent&status=pending&page=${page}&page_size=${pageSize}`,
method: 'GET'
})
}
// 发送好友请求(添加好友)
export function sendFriendRequestApi(friendUserId) {
return request({
url: '/api/v1/social/friend-requests',
method: 'POST',
data: {
friend_user_id: friendUserId
}
})
}
// 获取收到的好友请求
export function getReceivedFriendRequestsApi(page = 1, pageSize = 10) {
return request({
url: `/api/v1/social/friend-requests?type=received&status=pending&page=${page}&page_size=${pageSize}`,
method: 'GET'
})
}
// 处理好友请求(接受/拒绝)
export function handleFriendRequestApi(requestId, action) {
return request({
url: '/api/v1/social/friend-requests/handle',
method: 'POST',
data: {
request_id: requestId,
action: action
}
})
}
// 删除好友
export function deleteFriendApi(friendUserId) {
return request({
url: '/api/v1/social/friends',
method: 'DELETE',
data: {
friend_user_id: friendUserId
}
})
}
// 获取可选的粉丝身份列表
export function getFanIdentitiesApi() {
return request({
url: '/api/v1/fan-identities',
method: 'GET'
})
}
// 添加新的粉丝身份
export function addFanIdentityApi(starId, nickname) {
return request({
url: '/api/v1/my/fan-identities',
method: 'POST',
data: {
star_id: starId,
nickname: nickname
}
})
}
// 获取用户当前拥有的所有粉丝身份
export function getMyFanIdentitiesApi() {
return request({
url: '/api/v1/my/fan-identities',
method: 'GET'
})
}
// 切换粉丝身份
export function switchFanIdentityApi(newStarId) {
return request({
url: '/api/v1/my/fan-identities/switch',
method: 'POST',
data: {
new_star_id: newStarId
}
})
}
// 获取用户藏品列表
export function getMyAssetsApi(page = 1, pageSize = 20) {
return request({
url: `/api/v1/assets/me/items?page=${page}&page_size=${pageSize}`,
method: 'GET'
})
}
// 获取藏品详情
export function getAssetDetailApi(assetId) {
return request({
url: `/api/v1/assets/${assetId}`,
method: 'GET'
})
}
// 点赞藏品
export function likeAssetApi(assetId) {
return request({
url: `/api/v1/social/assets/${assetId}/like`,
method: 'POST'
})
}
// 取消点赞藏品
export function unlikeAssetApi(assetId) {
return request({
url: `/api/v1/social/assets/${assetId}/like`,
method: 'DELETE'
})
}
// 获取我的展馆槽位信息
export function getMyGalleriesApi() {
return request({
url: '/api/v1/mygalleries',
method: 'GET'
})
}
// 获取指定用户的展馆槽位信息
export function getUserGalleriesApi(targetUid) {
return request({
url: `/api/v1/galleries/${targetUid}`,
method: 'GET'
})
}
// 获取随机用户的展馆槽位信息
export function getRandomGalleryApi() {
return request({
url: '/api/v1/galleries/random',
method: 'GET'
})
}
// 放置藏品到展馆
export function placeAssetToGalleryApi(assetId, galleryOwnerId, slotId) {
return request({
url: '/api/v1/galleries/place',
method: 'POST',
data: {
asset_id: assetId,
gallery_owner_id: galleryOwnerId,
slot_id: slotId
}
})
}
// 下架藏品
export function removeAssetFromGalleryApi(slotId) {
return request({
url: `/api/v1/galleries/slots/${slotId}/asset`,
method: 'DELETE'
})
}
// 获取OSS上传签名
export function getOssSignatureApi(type) {
return request({
url: `/api/v1/assets/oss/signature?type=${type}`,
method: 'GET'
})
}
// 获取OSS预签名URL(用于读取图片)
export function getOssPresignedUrlApi(fileName, expires = 3600, type = 'avatar') {
return request({
url: `/api/v1/assets/oss/presigned-url?file_name=${encodeURIComponent(fileName)}&expires=${expires}&type=${type}`,
method: 'GET'
})
}
// 更新用户头像
export function updateAvatarApi(avatarUrl) {
return request({
url: '/api/v1/me/avatar',
method: 'PUT',
data: {
avatar_url: avatarUrl
}
})
}
// 创建铸造订单
export function createMintOrderApi(orderData) {
return request({
url: '/api/v1/assets/mints',
method: 'POST',
data: orderData
})
}
// 删除铸造订单
export function deleteMintOrderApi(orderId) {
return request({
url: `/api/v1/assets/mints/${orderId}`,
method: 'DELETE'
})
}
// 获取铸造订单详情
export function getMintOrderDetailApi(orderId) {
return request({
url: `/api/v1/assets/mints/${orderId}`,
method: 'GET'
})
}
// 图生图
export function imageGenerationApi(params) {
return request({
url: '/api/v1/assets/mints/image/generation',
method: 'POST',
data: params
})
}
// 获取热度排行榜
export function getHotRankingApi(dimension = 'total', starId = null, page = 1, pageSize = 10) {
let url = `/api/v1/rankings/hot?dimension=${dimension}&page=${page}&page_size=${pageSize}`
if (starId) {
url += `&star_id=${starId}`
}
return request({
url: url,
method: 'GET'
})
}
// 获取自制排行榜
export function getOriginalRankingApi(dimension = 'total', starId = null, page = 1, pageSize = 10) {
let url = `/api/v1/rankings/original?dimension=${dimension}&page=${page}&page_size=${pageSize}`
if (starId) {
url += `&star_id=${starId}`
}
return request({
url: url,
method: 'GET'
})
}
// ==================== 活动相关接口 ====================
// 获取活动列表
export function getActivityListApi(starId, page = 1, pageSize = 10) {
let url = `/api/v1/activities?star_id=${starId}&page=${page}&page_size=${pageSize}`
// if (status) {
// url += `&status=${status}`
// }
return request({
url: url,
method: 'GET'
})
}
// 获取活动详情
export function getActivityDetailApi(activityId) {
return request({
url: `/api/v1/activities/${activityId}`,
method: 'GET'
})
}
// 获取活动道具列表
export function getActivityItemsApi(activityId) {
return request({
url: `/api/v1/activities/${activityId}/items`,
method: 'GET'
})
}
// 获取活动进度
export function getActivityProgressApi(activityId) {
return request({
url: `/api/v1/activities/${activityId}/progress`,
method: 'GET'
})
}
// 购买活动道具
export function purchaseActivityItemApi(activityId, itemType, quantity = 1) {
return request({
url: `/api/v1/activities/${activityId}/purchase`,
method: 'POST',
data: {
item_type: itemType,
quantity: quantity
}
})
}
// 获取活动贡献点排名
export function getActivityRankingApi(activityId, starId = null, page = 1, pageSize = 10) {
let url = `/api/v1/activities/${activityId}/ranking?page=${page}&page_size=${pageSize}`
if (starId) {
url += `&star_id=${starId}`
}
return request({
url: url,
method: 'GET'
})
}
// ==================== 星册相关接口 ====================
// 获取星册首页数据
export function getStarbookHomeApi() {
return request({
url: '/api/v1/starbook/home',
method: 'GET'
})
}
// 获取星册藏品列表(分页)
export function getStarbookItemsApi(type, category, grade = null, page = 1, pageSize = 20) {
let url = `/api/v1/starbook/items?type=${type}&category=${category}&page=${page}&page_size=${pageSize}`
if (grade !== null) {
url += `&grade=${grade}`
}
return request({
url: url,
method: 'GET'
})
}
// ==================== 他人作品统计接口(暂不实现) ====================
// 获取他人点赞的作品列表(暂不实现)
export function getUserLikedAssetsApi(userId, page = 1, pageSize = 20) {
return Promise.reject(new Error('接口暂未开放'))
// 正式实现时启用:
// return request({
// url: `/api/v1/users/${userId}/liked-assets?page=${page}&page_size=${pageSize}`,
// method: 'GET'
// })
}
// 获取他人展出的作品列表(暂不实现)
export function getUserExhibitedAssetsApi(userId, page = 1, pageSize = 20) {
return Promise.reject(new Error('接口暂未开放'))
// 正式实现时启用:
// return request({
// url: `/api/v1/users/${userId}/exhibited-assets?page=${page}&page_size=${pageSize}`,
// method: 'GET'
// })
}
// ==================== 我的作品统计接口 ====================
// 获取我展出的作品列表
export function getMyExhibitedAssetsApi(page = 1, pageSize = 20) {
return request({
url: `/api/v1/me/exhibited-assets?page=${page}&page_size=${pageSize}`,
method: 'GET'
})
}
// 获取我点赞的作品列表
export function getMyLikedAssetsApi(page = 1, pageSize = 20) {
return request({
url: `/api/v1/me/liked-assets?page=${page}&page_size=${pageSize}`,
method: 'GET'
})
}
// ==================== 灵感瀑布相关接口 ====================
// 获取灵感瀑布藏品列表
export function getInspirationFlowApi(params) {
return request({
url: '/api/v1/inspiration-flow',
method: 'GET',
data: params
})
}
// 批量获取OSS预签名URL用于读取目录下的图片
export function getBatchOssPresignedUrlsApi(files, expires = 3600, type = 'asset') {
return request({
url: `/api/v1/assets/oss/batch-presigned-urls?files=${encodeURIComponent(JSON.stringify(files))}&expires=${expires}&type=${type}`,
method: 'GET'
})
}