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:
hailin 2025-12-24 17:21:48 -08:00
parent e6415f9217
commit 18f24d5f4b
5 changed files with 21 additions and 9 deletions

View File

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

View File

@ -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 {

View File

@ -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 {

View File

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

View File

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