refactor(api): 统一API路径配置并优化相关服务调用
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:
2026-02-27 10:07:03 +08:00
parent 97e4a135e1
commit c1a88ea4da
29 changed files with 392 additions and 225 deletions

View File

@@ -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',
});
}

View File

@@ -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);
}

View File

@@ -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');

View File

@@ -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);
}

View File

@@ -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 },
});
}
}

View File

@@ -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);