- 新增 GET /api/v1/me/liked-assets 接口 - 新增 GET /api/v1/me/exhibited-assets 接口 - 新增 GetMyLikedAssets 和 GetMyExhibitedAssets RPC 方法 - 新增 ExhibitedAssetItemDTO 和 GetMyExhibitedAssetsResponseDTO - 前端新增 getUserLikedAssetsApi 和 getUserExhibitedAssetsApi(暂不实现) Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
591 lines
13 KiB
JavaScript
591 lines
13 KiB
JavaScript
// 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'
|
||
// })
|
||
} |