From 9830cd4b2d4f6d0ce9c6a462c60cbcb3f3e8ee94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=88=90?= Date: Sun, 7 Sep 2025 10:21:27 +0800 Subject: [PATCH] 1 --- src/pages/userInfo/edit/index.scss | 46 +----- src/pages/userInfo/edit/index.tsx | 15 +- src/services/userService.ts | 216 +++++++++++++++++++++++++++- src/static/userInfo/icon_upload.svg | 9 ++ 4 files changed, 223 insertions(+), 63 deletions(-) create mode 100644 src/static/userInfo/icon_upload.svg diff --git a/src/pages/userInfo/edit/index.scss b/src/pages/userInfo/edit/index.scss index 3a29229..59f2e3f 100644 --- a/src/pages/userInfo/edit/index.scss +++ b/src/pages/userInfo/edit/index.scss @@ -17,52 +17,7 @@ overflow-y: auto; padding: 15px; - // 头部操作栏 - .header_section { - display: flex; - align-items: center; - justify-content: space-between; - padding: 10px 0 20px; - margin-bottom: 20px; - .back_button { - width: 40px; - height: 40px; - background: transparent; - border: none; - display: flex; - align-items: center; - justify-content: center; - cursor: pointer; - - .back_icon { - width: 24px; - height: 24px; - } - } - - .page_title { - font-family: 'PingFang SC'; - font-weight: 600; - font-size: 18px; - line-height: 1.4em; - color: #000000; - } - - .save_button { - background: transparent; - border: none; - cursor: pointer; - - .save_text { - font-family: 'PingFang SC'; - font-weight: 600; - font-size: 16px; - line-height: 1.4em; - color: #000000; - } - } - } // 头像编辑区域 .avatar_section { @@ -71,6 +26,7 @@ align-items: center; gap: 12px; margin-bottom: 30px; + margin-top: 98px; .avatar_container { position: relative; diff --git a/src/pages/userInfo/edit/index.tsx b/src/pages/userInfo/edit/index.tsx index 6b1abce..e260dd0 100644 --- a/src/pages/userInfo/edit/index.tsx +++ b/src/pages/userInfo/edit/index.tsx @@ -152,19 +152,6 @@ const EditProfilePage: React.FC = () => { ) : ( <> - {/* 头部操作栏 */} - - - 编辑资料 - - {/* 头像编辑区域 */} @@ -173,7 +160,7 @@ const EditProfilePage: React.FC = () => { diff --git a/src/services/userService.ts b/src/services/userService.ts index 573da71..ae6c860 100644 --- a/src/services/userService.ts +++ b/src/services/userService.ts @@ -83,8 +83,166 @@ interface UploadResponseData { }; } +// 后端球局数据接口 +interface BackendGameData { + id: number; + title: string; + description: string; + game_type?: string; + play_type: string; + publisher_id?: string; + venue_id?: string; + max_players?: number; + current_players?: number; + price: string; + price_mode: string; + court_type: string; + court_surface: string; + gender_limit?: string; + skill_level_min: string; + skill_level_max: string; + start_time: string; + end_time: string; + location_name: string | null; + location: string; + latitude?: number; + longitude?: number; + image_list?: string[]; + description_tag?: string[]; + venue_description_tag?: string[]; + venue_image_list?: Array<{ id: string; url: string }>; + participant_count: number; + max_participants: number; + participant_info?: { + id: number; + status: string; + payment_status: string; + joined_at: string; + deposit_amount: number; + join_message: string; + skill_level: string; + contact_info: string; + }; + venue_dtl?: { + id: number; + name: string; + address: string; + latitude: string; + longitude: string; + venue_type: string; + surface_type: string; + }; +} + // 用户服务类 export class UserService { + // 数据转换函数:将后端数据转换为ListContainer期望的格式 + private static transform_game_data(backend_data: BackendGameData[]): any[] { + return backend_data.map(game => { + // 处理时间格式 + const start_time = new Date(game.start_time); + const date_time = this.format_date_time(start_time); + + // 处理技能等级 + const skill_level = this.format_skill_level(game.skill_level_min, game.skill_level_max); + + // 处理图片数组 - 兼容两种数据格式 + let images: string[] = []; + if (game.image_list && game.image_list.length > 0) { + images = game.image_list.filter(img => img && img.trim() !== ''); + } else if (game.venue_image_list && game.venue_image_list.length > 0) { + images = game.venue_image_list + .filter(img => img && img.url && img.url.trim() !== '') + .map(img => img.url); + } + + // 处理距离 - 优先使用venue_dtl中的坐标,其次使用game中的坐标 + let latitude = game.latitude || 0; + let longitude = game.longitude || 0; + if (game.venue_dtl) { + latitude = parseFloat(game.venue_dtl.latitude) || latitude; + longitude = parseFloat(game.venue_dtl.longitude) || longitude; + } + const distance = this.calculate_distance(latitude, longitude); + + // 处理地点信息 - 优先使用venue_dtl中的信息 + let location = game.location_name || game.location || '未知地点'; + if (game.venue_dtl && game.venue_dtl.name) { + location = game.venue_dtl.name; + } + + // 处理人数统计 - 兼容不同的字段名 + const registered_count = game.current_players || game.participant_count || 0; + const max_count = game.max_players || game.max_participants || 0; + + return { + id: game.id, + title: game.title || '未命名球局', + dateTime: date_time, + location: location, + distance: distance, + registeredCount: registered_count, + maxCount: max_count, + skillLevel: skill_level, + matchType: game.play_type || '不限', + images: images, + shinei: game.court_type || '未知' + }; + }); + } + + // 格式化时间显示 + private static format_date_time(start_time: Date): string { + const now = new Date(); + const today = new Date(now.getFullYear(), now.getMonth(), now.getDate()); + const tomorrow = new Date(today.getTime() + 24 * 60 * 60 * 1000); + const day_after_tomorrow = new Date(today.getTime() + 2 * 24 * 60 * 60 * 1000); + + const start_date = new Date(start_time.getFullYear(), start_time.getMonth(), start_time.getDate()); + + let date_str = ''; + if (start_date.getTime() === today.getTime()) { + date_str = '今天'; + } else if (start_date.getTime() === tomorrow.getTime()) { + date_str = '明天'; + } else if (start_date.getTime() === day_after_tomorrow.getTime()) { + date_str = '后天'; + } else { + const weekdays = ['周日', '周一', '周二', '周三', '周四', '周五', '周六']; + date_str = weekdays[start_time.getDay()]; + } + + const time_str = `${start_time.getHours().toString().padStart(2, '0')}:${start_time.getMinutes().toString().padStart(2, '0')}`; + return `${date_str} ${time_str}`; + } + + // 格式化技能等级 + private static format_skill_level(min: string, max: string): string { + const min_num = parseInt(min) || 0; + const max_num = parseInt(max) || 0; + + if (min_num === 0 && max_num === 0) { + return '不限'; + } + + if (min_num === max_num) { + return `${min_num}.0`; + } + + return `${min_num}.0-${max_num}.0`; + } + + // 计算距离(模拟实现,实际需要根据用户位置计算) + private static calculate_distance(latitude: number, longitude: number): string { + if (latitude === 0 && longitude === 0) { + return '未知距离'; + } + + // 这里应该根据用户当前位置计算实际距离 + // 暂时返回模拟距离 + const distances = ['1.2km', '2.5km', '3.8km', '5.1km', '7.3km']; + return distances[Math.floor(Math.random() * distances.length)]; + } // 获取用户信息 static async get_user_info(user_id?: string): Promise { try { @@ -157,13 +315,14 @@ export class UserService { }); if (response.code === 0) { - return response.data.rows || []; + // 使用数据转换函数将后端数据转换为ListContainer期望的格式 + return this.transform_game_data(response.data.rows || []); } else { throw new Error(response.message || '获取主办球局失败'); } } catch (error) { console.error('获取主办球局失败:', error); - // 返回模拟数据 + // 返回符合ListContainer data格式的模拟数据 return [ { id: 1, @@ -181,6 +340,22 @@ export class UserService { require('../static/userInfo/game3.svg') ], shinei: '室外' + }, + { + id: 5, + title: '新手友好局', + dateTime: '周日 下午2点', + location: '徐汇网球中心', + distance: '1.8km', + registeredCount: 4, + maxCount: 6, + skillLevel: '1.5-2.0', + matchType: '双打', + images: [ + require('../static/userInfo/game1.svg'), + require('../static/userInfo/game2.svg') + ], + shinei: '室外' } ]; } @@ -197,13 +372,14 @@ export class UserService { }); if (response.code === 0) { - return response.data.rows || []; + // 使用数据转换函数将后端数据转换为ListContainer期望的格式 + return this.transform_game_data(response.data.rows || []); } else { throw new Error(response.message || '获取参与球局失败'); } } catch (error) { console.error('获取参与球局失败:', error); - // 返回模拟数据 + // 返回符合ListContainer data格式的模拟数据 return [ { id: 2, @@ -220,6 +396,38 @@ export class UserService { require('../static/userInfo/game3.svg') ], shinei: '室内' + }, + { + id: 3, + title: '晨练单打', + dateTime: '明天(周五) 早上7点', + location: '浦东网球俱乐部', + distance: '2.8km', + registeredCount: 1, + maxCount: 2, + skillLevel: '2.5-3.0', + matchType: '单打', + images: [ + require('../static/userInfo/game1.svg') + ], + shinei: '室外' + }, + { + id: 4, + title: '夜场混双', + dateTime: '今晚 晚上8点', + location: '虹桥网球中心', + distance: '4.1km', + registeredCount: 3, + maxCount: 4, + skillLevel: '3.5-4.0', + matchType: '混双', + images: [ + require('../static/userInfo/game1.svg'), + require('../static/userInfo/game2.svg'), + require('../static/userInfo/game3.svg') + ], + shinei: '室内' } ]; } diff --git a/src/static/userInfo/icon_upload.svg b/src/static/userInfo/icon_upload.svg new file mode 100644 index 0000000..616ca7c --- /dev/null +++ b/src/static/userInfo/icon_upload.svg @@ -0,0 +1,9 @@ + + + + + + + + +