fix(frontend): 修复API响应格式解析问题
- 修复userTagService.getTags返回分页响应{items, total}的解析
- 修复audienceSegmentService.getSegments返回分页响应的解析
- 更新组件正确提取items数组
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
e6415f9217
commit
18f24d5f4b
|
|
@ -108,8 +108,8 @@ export default function NotificationsPage() {
|
||||||
// 加载可用标签
|
// 加载可用标签
|
||||||
const loadTags = useCallback(async () => {
|
const loadTags = useCallback(async () => {
|
||||||
try {
|
try {
|
||||||
const tags = await userTagService.getTags({ isAdvertisable: true, isEnabled: true });
|
const response = await userTagService.getTags({ isAdvertisable: true, isEnabled: true });
|
||||||
setAvailableTags(tags);
|
setAvailableTags(response.items);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.error('Failed to load tags:', err);
|
console.error('Failed to load tags:', err);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -53,12 +53,12 @@ export const AudienceSegmentsTab = () => {
|
||||||
const loadData = useCallback(async () => {
|
const loadData = useCallback(async () => {
|
||||||
try {
|
try {
|
||||||
setLoading(true);
|
setLoading(true);
|
||||||
const [segmentsData, tagsData] = await Promise.all([
|
const [segmentsResponse, tagsResponse] = await Promise.all([
|
||||||
audienceSegmentService.getSegments(),
|
audienceSegmentService.getSegments(),
|
||||||
userTagService.getTags({ isAdvertisable: true }),
|
userTagService.getTags({ isAdvertisable: true }),
|
||||||
]);
|
]);
|
||||||
setSegments(segmentsData);
|
setSegments(segmentsResponse.items);
|
||||||
setTags(tagsData);
|
setTags(tagsResponse.items);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
toast.error((err as Error).message || '加载失败');
|
toast.error((err as Error).message || '加载失败');
|
||||||
} finally {
|
} finally {
|
||||||
|
|
|
||||||
|
|
@ -55,12 +55,12 @@ export const UserTagsTab = () => {
|
||||||
const loadData = useCallback(async () => {
|
const loadData = useCallback(async () => {
|
||||||
try {
|
try {
|
||||||
setLoading(true);
|
setLoading(true);
|
||||||
const [categoriesData, tagsData] = await Promise.all([
|
const [categoriesData, tagsResponse] = await Promise.all([
|
||||||
userTagService.getCategories(),
|
userTagService.getCategories(),
|
||||||
userTagService.getTags({ categoryId: activeCategory ?? undefined }),
|
userTagService.getTags({ categoryId: activeCategory ?? undefined }),
|
||||||
]);
|
]);
|
||||||
setCategories(categoriesData);
|
setCategories(categoriesData);
|
||||||
setTags(tagsData);
|
setTags(tagsResponse.items);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
toast.error((err as Error).message || '加载失败');
|
toast.error((err as Error).message || '加载失败');
|
||||||
} finally {
|
} finally {
|
||||||
|
|
|
||||||
|
|
@ -87,6 +87,12 @@ export interface ListSegmentsParams {
|
||||||
offset?: number;
|
offset?: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** 分页响应 */
|
||||||
|
export interface PaginatedResponse<T> {
|
||||||
|
items: T[];
|
||||||
|
total: number;
|
||||||
|
}
|
||||||
|
|
||||||
// =====================
|
// =====================
|
||||||
// 选项常量
|
// 选项常量
|
||||||
// =====================
|
// =====================
|
||||||
|
|
@ -140,7 +146,7 @@ export const SEGMENT_FIELD_OPTIONS = [
|
||||||
|
|
||||||
export const audienceSegmentService = {
|
export const audienceSegmentService = {
|
||||||
/** 获取人群包列表 */
|
/** 获取人群包列表 */
|
||||||
async getSegments(params: ListSegmentsParams = {}): Promise<AudienceSegment[]> {
|
async getSegments(params: ListSegmentsParams = {}): Promise<PaginatedResponse<AudienceSegment>> {
|
||||||
return apiClient.get(API_ENDPOINTS.AUDIENCE_SEGMENTS.LIST, { params });
|
return apiClient.get(API_ENDPOINTS.AUDIENCE_SEGMENTS.LIST, { params });
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -116,6 +116,12 @@ export interface ListTagsParams {
|
||||||
offset?: number;
|
offset?: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** 分页响应 */
|
||||||
|
export interface PaginatedResponse<T> {
|
||||||
|
items: T[];
|
||||||
|
total: number;
|
||||||
|
}
|
||||||
|
|
||||||
/** 分配标签请求 */
|
/** 分配标签请求 */
|
||||||
export interface AssignTagRequest {
|
export interface AssignTagRequest {
|
||||||
accountSequence: string;
|
accountSequence: string;
|
||||||
|
|
@ -198,7 +204,7 @@ export const userTagService = {
|
||||||
// =====================
|
// =====================
|
||||||
|
|
||||||
/** 获取标签列表 */
|
/** 获取标签列表 */
|
||||||
async getTags(params: ListTagsParams = {}): Promise<UserTag[]> {
|
async getTags(params: ListTagsParams = {}): Promise<PaginatedResponse<UserTag>> {
|
||||||
return apiClient.get(API_ENDPOINTS.USER_TAGS.LIST, { params });
|
return apiClient.get(API_ENDPOINTS.USER_TAGS.LIST, { params });
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue