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 () => {
try {
const tags = await userTagService.getTags({ isAdvertisable: true, isEnabled: true });
setAvailableTags(tags);
const response = await userTagService.getTags({ isAdvertisable: true, isEnabled: true });
setAvailableTags(response.items);
} catch (err) {
console.error('Failed to load tags:', err);
}

View File

@ -53,12 +53,12 @@ export const AudienceSegmentsTab = () => {
const loadData = useCallback(async () => {
try {
setLoading(true);
const [segmentsData, tagsData] = await Promise.all([
const [segmentsResponse, tagsResponse] = await Promise.all([
audienceSegmentService.getSegments(),
userTagService.getTags({ isAdvertisable: true }),
]);
setSegments(segmentsData);
setTags(tagsData);
setSegments(segmentsResponse.items);
setTags(tagsResponse.items);
} catch (err) {
toast.error((err as Error).message || '加载失败');
} finally {

View File

@ -55,12 +55,12 @@ export const UserTagsTab = () => {
const loadData = useCallback(async () => {
try {
setLoading(true);
const [categoriesData, tagsData] = await Promise.all([
const [categoriesData, tagsResponse] = await Promise.all([
userTagService.getCategories(),
userTagService.getTags({ categoryId: activeCategory ?? undefined }),
]);
setCategories(categoriesData);
setTags(tagsData);
setTags(tagsResponse.items);
} catch (err) {
toast.error((err as Error).message || '加载失败');
} finally {

View File

@ -87,6 +87,12 @@ export interface ListSegmentsParams {
offset?: number;
}
/** 分页响应 */
export interface PaginatedResponse<T> {
items: T[];
total: number;
}
// =====================
// 选项常量
// =====================
@ -140,7 +146,7 @@ export const SEGMENT_FIELD_OPTIONS = [
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 });
},

View File

@ -116,6 +116,12 @@ export interface ListTagsParams {
offset?: number;
}
/** 分页响应 */
export interface PaginatedResponse<T> {
items: T[];
total: number;
}
/** 分配标签请求 */
export interface AssignTagRequest {
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 });
},