refactor(api): 统一API路径配置并优化相关服务调用
All checks were successful
test/timeline-frontend/pipeline/head This commit looks good
All checks were successful
test/timeline-frontend/pipeline/head This commit looks good
feat: 添加API URL全局配置文件 fix: 修复SSR环境下的窗口对象检查 perf: 优化代理配置路径匹配顺序 style: 移除无用注释和未使用的类型声明
This commit is contained in:
@@ -1,19 +1,20 @@
|
||||
import { request } from '@umijs/max';
|
||||
import type { CurrentUser, FriendUser, HistoryMessage, ListItemDataType, MessageItem, UserInfo } from './data.d';
|
||||
import { CommonResponse } from '@/types/common';
|
||||
import { AUTH_API, STORY_API } from '@/services/config/apiUrls';
|
||||
|
||||
export async function queryCurrent(): Promise<{ data: CurrentUser }> {
|
||||
return request('/user-api/info');
|
||||
return request(AUTH_API.INFO);
|
||||
}
|
||||
export async function searchUsername(params: {username: string}) : Promise<{data: UserInfo[]}> {
|
||||
return request('/user-api/search', {
|
||||
return request(AUTH_API.FRIEND_SEARCH, {
|
||||
params: params,
|
||||
method: "GET"
|
||||
})
|
||||
}
|
||||
|
||||
export async function addFriend(userId: string) : Promise<CommonResponse<String>> {
|
||||
return request('/user-api/friend/request', {
|
||||
return request(AUTH_API.FRIEND_REQUEST, {
|
||||
data: {
|
||||
friendId: userId,
|
||||
},
|
||||
@@ -21,29 +22,29 @@ export async function addFriend(userId: string) : Promise<CommonResponse<String>
|
||||
})
|
||||
}
|
||||
export async function queryFriendList(): Promise<CommonResponse<FriendUser[]>> {
|
||||
return request('/user-api/friend/list');
|
||||
return request(AUTH_API.FRIEND_LIST);
|
||||
}
|
||||
|
||||
export async function acceptFriendRequest(friendId: string): Promise<CommonResponse<string>> {
|
||||
return request('/user-api/friend/accept', {
|
||||
return request(AUTH_API.FRIEND_ACCEPT, {
|
||||
method: 'POST',
|
||||
data: { friendId },
|
||||
});
|
||||
}
|
||||
|
||||
export async function rejectFriendRequest(friendId: string): Promise<CommonResponse<string>> {
|
||||
return request('/user-api/friend/reject', {
|
||||
return request(AUTH_API.FRIEND_REJECT, {
|
||||
method: 'POST',
|
||||
data: { friendId },
|
||||
});
|
||||
}
|
||||
export async function queryHistoryMessages(): Promise<CommonResponse<HistoryMessage[]>> {
|
||||
return request('/user-api/message/history/friend', {
|
||||
return request(AUTH_API.MESSAGE_HISTORY, {
|
||||
method: 'GET',
|
||||
});
|
||||
}
|
||||
export async function queryFriendDynamic(): Promise<CommonResponse<HistoryMessage[]>> {
|
||||
return request('/api/story/activity/authorized-items', {
|
||||
return request(STORY_API.ACTIVITY_AUTHORIZED_ITEMS, {
|
||||
method: 'GET',
|
||||
});
|
||||
}
|
||||
|
||||
@@ -1,24 +1,25 @@
|
||||
import { request } from '@umijs/max';
|
||||
import type { CurrentUser, GeographicItemType } from './data';
|
||||
import { CommonResponse } from '@/types/common';
|
||||
import { AUTH_API, GEO_API, COMMON_API } from '@/services/config/apiUrls';
|
||||
|
||||
export async function queryCurrent(): Promise<{ data: CurrentUser }> {
|
||||
return request('/user-api/info');
|
||||
return request(AUTH_API.INFO);
|
||||
}
|
||||
export async function updateCurrentUser(params: CurrentUser): Promise<{data: CommonResponse<string>}> {
|
||||
return request('/user-api/info', {
|
||||
return request(AUTH_API.INFO, {
|
||||
method: 'PUT',
|
||||
data: params,
|
||||
})
|
||||
}
|
||||
export async function queryProvince(): Promise<{ data: GeographicItemType[] }> {
|
||||
return request('/api/geographic/province');
|
||||
return request(GEO_API.PROVINCE);
|
||||
}
|
||||
|
||||
export async function queryCity(province: string): Promise<{ data: GeographicItemType[] }> {
|
||||
return request(`/api/geographic/city/${province}`);
|
||||
return request(GEO_API.CITY(province));
|
||||
}
|
||||
|
||||
export async function query() {
|
||||
return request('/api/users');
|
||||
return request(COMMON_API.USERS);
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
import React, { useState, useEffect } from 'react';
|
||||
import { Button, message, Spin, Empty, Checkbox } from 'antd';
|
||||
import { useModel, request } from '@umijs/max';
|
||||
import { USER_API } from '@/services/config/apiUrls';
|
||||
import styles from '../index.less';
|
||||
|
||||
interface PhotoSelectorProps {
|
||||
@@ -42,16 +43,16 @@ const PhotoSelector: React.FC<PhotoSelectorProps> = ({
|
||||
setLoading(true);
|
||||
try {
|
||||
// Fetch user's photos from gallery
|
||||
const response = await request('/api/v1/gallery/photos', {
|
||||
const response = await request(USER_API.GALLERY_PHOTOS, {
|
||||
method: 'GET',
|
||||
params: { pageSize: 100 },
|
||||
});
|
||||
|
||||
|
||||
// Filter out photos already in the album
|
||||
const availablePhotos = response.items?.filter(
|
||||
(photo: Photo) => !existingPhotoIds.includes(photo.id)
|
||||
) || [];
|
||||
|
||||
|
||||
setPhotos(availablePhotos);
|
||||
} catch (error) {
|
||||
message.error('Failed to load photos');
|
||||
|
||||
@@ -2,6 +2,7 @@ import React, { useState, useRef, useEffect } from 'react';
|
||||
import { PlayCircleOutlined, PauseCircleOutlined, FullscreenOutlined, FullscreenExitOutlined } from '@ant-design/icons';
|
||||
import { Spin } from 'antd';
|
||||
import { request } from '@umijs/max';
|
||||
import { FILE_API } from '@/services/config/apiUrls';
|
||||
|
||||
interface TimelineVideoProps {
|
||||
videoInstanceId: string;
|
||||
@@ -21,7 +22,7 @@ const TimelineVideo: React.FC<TimelineVideoProps> = ({ videoInstanceId, thumbnai
|
||||
useEffect(() => {
|
||||
const fetchVideoUrl = async () => {
|
||||
try {
|
||||
const response = await request(`/file/get-video-url/${videoInstanceId}`, { method: 'GET' });
|
||||
const response = await request(FILE_API.VIDEO_URL(videoInstanceId), { method: 'GET' });
|
||||
if (response.code === 200 && response.data) {
|
||||
setVideoSrc(response.data);
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import { request } from '@umijs/max';
|
||||
import {StoryItem, StoryItemTimeQueryParams, StoryType} from './data.d';
|
||||
import {CommonListResponse, CommonResponse} from "@/types/common";
|
||||
import { STORY_API, FILE_API } from '@/services/config/apiUrls';
|
||||
|
||||
type ParamsType = {
|
||||
count?: number;
|
||||
@@ -13,19 +14,19 @@ type ParamsType = {
|
||||
export async function queryTimelineList(
|
||||
params: ParamsType,
|
||||
): Promise<{ data: StoryType[] }> {
|
||||
return await request('/api/story/list', {
|
||||
return await request(STORY_API.LIST, {
|
||||
params,
|
||||
});
|
||||
}
|
||||
|
||||
export async function deleteStory(params: ParamsType): Promise<{ data: { list: StoryType[] } }> {
|
||||
return request(`/api/story/${params.instanceId}`, {
|
||||
return request(STORY_API.DETAIL(params.instanceId!), {
|
||||
method: 'DELETE',
|
||||
});
|
||||
}
|
||||
|
||||
export async function addStory(params: ParamsType): Promise<{ data: { list: StoryType[] } }> {
|
||||
return request('/api/story/add', {
|
||||
return request(STORY_API.ADD, {
|
||||
method: 'POST',
|
||||
data: {
|
||||
...params,
|
||||
@@ -35,7 +36,7 @@ export async function addStory(params: ParamsType): Promise<{ data: { list: Stor
|
||||
}
|
||||
|
||||
export async function updateStory(params: ParamsType): Promise<{ data: { list: StoryType[] } }> {
|
||||
return await request(`/api/story/${params.instanceId}`, {
|
||||
return await request(STORY_API.DETAIL(params.instanceId!), {
|
||||
method: 'PUT',
|
||||
data: {
|
||||
...params,
|
||||
@@ -44,12 +45,12 @@ export async function updateStory(params: ParamsType): Promise<{ data: { list: S
|
||||
});
|
||||
}
|
||||
export async function queryStoryDetail(itemId: string): Promise<{ data: StoryType }> {
|
||||
return request(`/api/story/${itemId}`, {
|
||||
return request(STORY_API.DETAIL(itemId), {
|
||||
method: 'GET',
|
||||
});
|
||||
}
|
||||
export async function addStoryItem(params: FormData): Promise<any> {
|
||||
return request(`/api/story/item`, {
|
||||
return request(STORY_API.ITEM, {
|
||||
method: 'POST',
|
||||
data: params,
|
||||
requestType: 'form',
|
||||
@@ -57,7 +58,7 @@ export async function addStoryItem(params: FormData): Promise<any> {
|
||||
});
|
||||
}
|
||||
export async function updateStoryItem(params: FormData): Promise<any> {
|
||||
return request(`/api/story/item`, {
|
||||
return request(STORY_API.ITEM, {
|
||||
method: 'PUT',
|
||||
data: params,
|
||||
requestType: 'form',
|
||||
@@ -66,43 +67,43 @@ export async function updateStoryItem(params: FormData): Promise<any> {
|
||||
}
|
||||
|
||||
export async function queryStoryItem(params: ParamsType): Promise<{ data: CommonListResponse<StoryItem> }> {
|
||||
return request(`/api/story/item/list`, {
|
||||
return request(STORY_API.ITEM_LIST, {
|
||||
method: 'GET',
|
||||
params: params,
|
||||
});
|
||||
}
|
||||
|
||||
export async function queryStoryItemDetail(itemId: string): Promise<{ data: StoryItem }> {
|
||||
return request(`/api/story/item/${itemId}`, {
|
||||
return request(STORY_API.ITEM_DETAIL(itemId), {
|
||||
method: 'GET',
|
||||
});
|
||||
}
|
||||
export async function countStoryItem(storyInstanceId: string): Promise<{ data: StoryItem }> {
|
||||
return request(`/api/story/item/count/${storyInstanceId}`, {
|
||||
return request(STORY_API.ITEM_COUNT(storyInstanceId), {
|
||||
method: 'GET',
|
||||
});
|
||||
}
|
||||
|
||||
export async function queryStoryItemImages(itemId: string): Promise<{ data: string[] }> {
|
||||
return request(`/api/story/item/images/${itemId}`, {
|
||||
return request(STORY_API.ITEM_IMAGES(itemId), {
|
||||
method: 'GET',
|
||||
});
|
||||
}
|
||||
export async function removeStoryItem(instanceId: string): Promise<CommonResponse<void>> {
|
||||
return request(`/api/story/item/${instanceId}`, {
|
||||
return request(STORY_API.ITEM_DETAIL(instanceId), {
|
||||
method: 'DELETE',
|
||||
});
|
||||
}
|
||||
|
||||
export async function searchStoryItems(params: { keyword: string; pageNum: number; pageSize: number }) {
|
||||
return request('/api/story/item/search', {
|
||||
return request(STORY_API.ITEM_SEARCH, {
|
||||
method: 'GET',
|
||||
params,
|
||||
});
|
||||
}
|
||||
|
||||
export async function fetchImage(imageInstanceId: string): Promise<any> {
|
||||
return request(`/file/image/${imageInstanceId}`, {
|
||||
return request(FILE_API.IMAGE(imageInstanceId), {
|
||||
method: 'GET',
|
||||
responseType: 'blob',
|
||||
getResponse: true,
|
||||
@@ -110,59 +111,59 @@ export async function fetchImage(imageInstanceId: string): Promise<any> {
|
||||
}
|
||||
|
||||
export async function authorizeStoryPermission(params: {userId: string, storyInstanceId: string, permissionType: number}) {
|
||||
return request('/api/story/permission/authorize', {
|
||||
return request(STORY_API.PERMISSION_AUTHORIZE, {
|
||||
method: 'POST',
|
||||
data: params,
|
||||
});
|
||||
}
|
||||
|
||||
export async function getStoryPermissions(storyId: string) {
|
||||
return request(`/api/story/permission/story/${storyId}`, {
|
||||
return request(STORY_API.PERMISSION_STORY(storyId), {
|
||||
method: 'GET',
|
||||
});
|
||||
}
|
||||
|
||||
export async function inviteUser(params: {userId: string, storyInstanceId: string, permissionType: number}) {
|
||||
return request('/api/story/permission/invite', {
|
||||
return request(STORY_API.PERMISSION_INVITE, {
|
||||
method: 'POST',
|
||||
data: params,
|
||||
});
|
||||
}
|
||||
|
||||
export async function acceptInvite(inviteId: string) {
|
||||
return request(`/api/story/permission/invite/${inviteId}/accept`, {
|
||||
return request(STORY_API.PERMISSION_INVITE_ACCEPT(inviteId), {
|
||||
method: 'PUT',
|
||||
});
|
||||
}
|
||||
|
||||
export async function rejectInvite(inviteId: string) {
|
||||
return request(`/api/story/permission/invite/${inviteId}/reject`, {
|
||||
return request(STORY_API.PERMISSION_INVITE_REJECT(inviteId), {
|
||||
method: 'PUT',
|
||||
});
|
||||
}
|
||||
|
||||
export async function updatePermission(params: {permissionId: string, permissionType: number}) {
|
||||
return request('/api/story/permission', {
|
||||
return request(STORY_API.PERMISSION, {
|
||||
method: 'PUT',
|
||||
data: params
|
||||
});
|
||||
}
|
||||
|
||||
export async function removePermission(permissionId: string) {
|
||||
return request(`/api/story/permission/${permissionId}`, {
|
||||
return request(`${STORY_API.PERMISSION}/${permissionId}`, {
|
||||
method: 'DELETE'
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新时间线节点排序
|
||||
*
|
||||
*
|
||||
* 功能描述:
|
||||
* 批量更新节点的排序值,用于拖拽排序后保存结果。
|
||||
*
|
||||
*
|
||||
* @param orderData - 排序数据数组,包含节点ID和新排序值
|
||||
* @returns API响应
|
||||
*
|
||||
*
|
||||
* @example
|
||||
* const orderData = [
|
||||
* { instanceId: 'item-1', sortOrder: 0 },
|
||||
@@ -173,7 +174,7 @@ export async function removePermission(permissionId: string) {
|
||||
export async function updateStoryItemOrder(
|
||||
orderData: Array<{ instanceId: string; sortOrder: number }>
|
||||
): Promise<CommonResponse<void>> {
|
||||
return request('/api/story/item/order', {
|
||||
return request(`${STORY_API.ITEM}/order`, {
|
||||
method: 'PUT',
|
||||
data: { items: orderData },
|
||||
});
|
||||
@@ -181,21 +182,21 @@ export async function updateStoryItemOrder(
|
||||
|
||||
/**
|
||||
* 批量删除时间线节点
|
||||
*
|
||||
*
|
||||
* 功能描述:
|
||||
* 根据节点ID列表批量删除时间线节点。
|
||||
* 删除操作为软删除,数据可恢复。
|
||||
*
|
||||
*
|
||||
* @param instanceIds - 要删除的节点ID数组
|
||||
* @returns API响应
|
||||
*
|
||||
*
|
||||
* @example
|
||||
* await batchDeleteStoryItems(['item-1', 'item-2', 'item-3']);
|
||||
*/
|
||||
export async function batchDeleteStoryItems(
|
||||
instanceIds: string[]
|
||||
): Promise<CommonResponse<void>> {
|
||||
return request('/api/story/item/batch-delete', {
|
||||
return request(`${STORY_API.ITEM}/batch-delete`, {
|
||||
method: 'POST',
|
||||
data: { instanceIds },
|
||||
});
|
||||
@@ -203,10 +204,10 @@ export async function batchDeleteStoryItems(
|
||||
|
||||
/**
|
||||
* 批量修改时间线节点时间
|
||||
*
|
||||
*
|
||||
* 功能描述:
|
||||
* 批量修改多个节点的时间信息。
|
||||
*
|
||||
*
|
||||
* @param instanceIds - 要修改的节点ID数组
|
||||
* @param storyItemTime - 新的时间值
|
||||
* @returns API响应
|
||||
@@ -215,8 +216,8 @@ export async function batchUpdateStoryItemTime(
|
||||
instanceIds: string[],
|
||||
storyItemTime: string
|
||||
): Promise<CommonResponse<void>> {
|
||||
return request('/api/story/item/batch-time', {
|
||||
return request(`${STORY_API.ITEM}/batch-time`, {
|
||||
method: 'PUT',
|
||||
data: { instanceIds, storyItemTime },
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import { getFakeCaptcha } from '@/services/ant-design-pro/login';
|
||||
import { loginUser } from '@/services/user/api';
|
||||
import type { UserLoginParams, UserLoginResult } from '@/services/user/typing';
|
||||
import { CommonResponse } from '@/types/common';
|
||||
import {
|
||||
AlipayCircleOutlined,
|
||||
@@ -133,9 +134,9 @@ const Login: React.FC = () => {
|
||||
currentUser: response.data,
|
||||
}));
|
||||
const urlParams = new URL(window.location.href).searchParams;
|
||||
// 修复:直接使用 redirect 参数,如果不存在则跳转到首页
|
||||
// 修复:使用 history.push 进行跳转,避免页面刷新导致状态丢失
|
||||
const redirect = urlParams.get('redirect');
|
||||
window.location.href = redirect || '/';
|
||||
history.push(redirect || '/');
|
||||
return;
|
||||
}
|
||||
console.log(response.message);
|
||||
|
||||
Reference in New Issue
Block a user