From f43dde0924e84f968997d05ffbfa1e3fe7362781 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=88=90?= Date: Sun, 7 Sep 2025 15:59:05 +0800 Subject: [PATCH 1/4] 1 --- src/pages/login/index/index.tsx | 4 ++-- src/static/login/login_bg.jpg | Bin 0 -> 48933 bytes 2 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 src/static/login/login_bg.jpg diff --git a/src/pages/login/index/index.tsx b/src/pages/login/index/index.tsx index d00dbf0..4ef41be 100644 --- a/src/pages/login/index/index.tsx +++ b/src/pages/login/index/index.tsx @@ -117,9 +117,9 @@ const LoginPage: React.FC = () => { return ( - diff --git a/src/static/login/login_bg.jpg b/src/static/login/login_bg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..562655c369ac8fc90bc28caaaad51353e5b6293e GIT binary patch literal 48933 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 Date: Sun, 7 Sep 2025 16:27:36 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=9F=AD=E4=BF=A1?= =?UTF-8?q?=E7=99=BB=E9=99=86=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/UserInfo/index.scss | 1 - src/pages/login/index/index.tsx | 2 +- src/pages/login/verification/index.tsx | 7 ++----- src/pages/userInfo/myself/index.scss | 4 +--- 4 files changed, 4 insertions(+), 10 deletions(-) diff --git a/src/components/UserInfo/index.scss b/src/components/UserInfo/index.scss index e4bb1df..dceabfe 100644 --- a/src/components/UserInfo/index.scss +++ b/src/components/UserInfo/index.scss @@ -5,7 +5,6 @@ display: flex; flex-direction: column; gap: 16px; - margin-bottom: 16px; // 基本信息 .basic_info { diff --git a/src/pages/login/index/index.tsx b/src/pages/login/index/index.tsx index 4ef41be..53e7da1 100644 --- a/src/pages/login/index/index.tsx +++ b/src/pages/login/index/index.tsx @@ -49,7 +49,7 @@ const LoginPage: React.FC = () => { } else { Taro.redirectTo({ url: '/pages/list/index' }); } - }, 200); + }, 10); } else { Taro.showToast({ title: response.message, diff --git a/src/pages/login/verification/index.tsx b/src/pages/login/verification/index.tsx index b78e6a0..795a070 100644 --- a/src/pages/login/verification/index.tsx +++ b/src/pages/login/verification/index.tsx @@ -12,7 +12,7 @@ const VerificationPage: React.FC = () => { const [is_loading, setIsLoading] = useState(false); const [code_input_focus, setCodeInputFocus] = useState(false); - const { params: { redirect } } = useRouter(); + // 计算登录按钮是否应该启用 const can_login = phone.length === 11 && verification_code.length === 6 && !is_loading; @@ -120,18 +120,15 @@ const VerificationPage: React.FC = () => { try { // 调用登录服务 + debugger; const result = await phone_auth_login({ phone, verification_code }); if (result.success) { setTimeout(() => { - if (redirect) { - Taro.redirectTo({ url: decodeURIComponent(redirect) }); - } else { Taro.redirectTo({ url: '/pages/list/index' }); - } }, 200); } else { Taro.showToast({ diff --git a/src/pages/userInfo/myself/index.scss b/src/pages/userInfo/myself/index.scss index 3ed4ad0..24f74f8 100644 --- a/src/pages/userInfo/myself/index.scss +++ b/src/pages/userInfo/myself/index.scss @@ -17,14 +17,13 @@ margin-top: 0; box-sizing: border-box; overflow-y: auto; - padding: 15px 15px 15px; + padding: 0px 15px 15px 15px ; // 用户信息区域 .user_info_section { display: flex; flex-direction: column; gap: 16px; - margin-bottom: 16px; margin-top: 98px; // 加载状态 @@ -146,7 +145,6 @@ // 球局类型标签页 .game_tabs_section { - margin-bottom: 16px; .tab_container { display: flex; From 45f85a8572a5b82d0051c26c414e7b2c77054477 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=88=90?= Date: Sun, 7 Sep 2025 18:22:07 +0800 Subject: [PATCH 3/4] 1 --- src/components/UserInfo/index.scss | 1 + src/components/UserInfo/index.tsx | 31 ++- src/config/api.ts | 5 +- src/config/env.ts | 20 +- src/pages/userInfo/API_INTEGRATION.md | 211 ------------------- src/pages/userInfo/AVATAR_UPLOAD.md | 240 ---------------------- src/pages/userInfo/INTEGRATION_SUMMARY.md | 160 --------------- src/pages/userInfo/README.md | 97 --------- src/pages/userInfo/myself/index.tsx | 13 +- src/services/userService.ts | 142 ++----------- src/static/userInfo/female.svg | 5 + src/static/userInfo/male.svg | 5 + 12 files changed, 72 insertions(+), 858 deletions(-) delete mode 100644 src/pages/userInfo/API_INTEGRATION.md delete mode 100644 src/pages/userInfo/AVATAR_UPLOAD.md delete mode 100644 src/pages/userInfo/INTEGRATION_SUMMARY.md delete mode 100644 src/pages/userInfo/README.md create mode 100644 src/static/userInfo/female.svg create mode 100644 src/static/userInfo/male.svg diff --git a/src/components/UserInfo/index.scss b/src/components/UserInfo/index.scss index dceabfe..dfe55a1 100644 --- a/src/components/UserInfo/index.scss +++ b/src/components/UserInfo/index.scss @@ -219,6 +219,7 @@ background: #FFFFFF; border: 0.5px solid rgba(0, 0, 0, 0.16); border-radius: 999px; + box-sizing: border-box; .tag_icon { width: 12px; diff --git a/src/components/UserInfo/index.tsx b/src/components/UserInfo/index.tsx index e742fe4..52ced52 100644 --- a/src/components/UserInfo/index.tsx +++ b/src/components/UserInfo/index.tsx @@ -15,7 +15,6 @@ export interface UserInfo { hosted: number; participated: number; }; - tags: string[]; bio: string; location: string; occupation: string; @@ -126,18 +125,34 @@ export const UserInfoCard: React.FC = ({ {/* 标签和简介 */} + + + {user_info.gender === "0" && ( + + )} + {user_info.gender === "1" && ( + + )} + + + + {user_info.ntrp_level || '未设置'} + + + {user_info.occupation || '未设置'} + - {user_info.location} - - - {user_info.occupation} - - - {user_info.ntrp_level} + {user_info.location || '未设置'} {user_info.bio} diff --git a/src/config/api.ts b/src/config/api.ts index 2bab3c6..d09d2be 100644 --- a/src/config/api.ts +++ b/src/config/api.ts @@ -1,7 +1,8 @@ -// API配置 +import envConfig from './env'// API配置 + export const API_CONFIG = { // 基础URL - BASE_URL: process.env.NODE_ENV === 'development' ? 'http://localhost:3000' : 'https://api.example.com', + BASE_URL: envConfig.apiBaseURL, // 用户相关接口 USER: { diff --git a/src/config/env.ts b/src/config/env.ts index 5f645b3..b9d6b00 100644 --- a/src/config/env.ts +++ b/src/config/env.ts @@ -17,8 +17,8 @@ const envConfigs: Record = { // 开发环境 development: { name: '开发环境', - apiBaseURL: 'https://sit.light120.com', - // apiBaseURL: 'http://localhost:9098', + // apiBaseURL: 'https://sit.light120.com', + apiBaseURL: 'http://localhost:9098', timeout: 15000, enableLog: true, enableMock: true @@ -27,8 +27,8 @@ const envConfigs: Record = { // 测试环境 test: { name: '测试环境', - apiBaseURL: 'https://sit.light120.com', - // apiBaseURL: 'http://localhost:9098', + // apiBaseURL: 'https://sit.light120.com', + apiBaseURL: 'http://localhost:9098', timeout: 12000, enableLog: true, enableMock: false @@ -48,18 +48,18 @@ const envConfigs: Record = { export const getCurrentEnv = (): EnvType => { // 在小程序环境中,使用默认逻辑判断环境 // 可以根据实际需要配置不同的判断逻辑 - + // 可以根据实际部署情况添加更多判断逻辑 // 比如通过 Taro.getEnv() 获取当前平台环境 const currentEnv = Taro.getEnv() - + // 在开发调试时,可以通过修改这里的逻辑来切换环境 // 默认在小程序中使用生产环境配置 // if (currentEnv === Taro.ENV_TYPE.WEAPP) { // // 微信小程序环境 // return 'production' // } - + // 默认返回开发环境(便于调试) return 'development' } @@ -97,9 +97,9 @@ export const getEnvInfo = () => { env: getCurrentEnv(), config, taroEnv: Taro.getEnv(), - platform: Taro.getEnv() === Taro.ENV_TYPE.WEAPP ? '微信小程序' : - Taro.getEnv() === Taro.ENV_TYPE.H5 ? 'H5' : - Taro.getEnv() === Taro.ENV_TYPE.RN ? 'React Native' : '未知' + platform: Taro.getEnv() === Taro.ENV_TYPE.WEAPP ? '微信小程序' : + Taro.getEnv() === Taro.ENV_TYPE.H5 ? 'H5' : + Taro.getEnv() === Taro.ENV_TYPE.RN ? 'React Native' : '未知' } } diff --git a/src/pages/userInfo/API_INTEGRATION.md b/src/pages/userInfo/API_INTEGRATION.md deleted file mode 100644 index 98bea9b..0000000 --- a/src/pages/userInfo/API_INTEGRATION.md +++ /dev/null @@ -1,211 +0,0 @@ -# API接口集成说明 - -## 已集成的接口 - -### 1. 用户详情接口 `/user/detail` - -**请求方式**: POST -**请求参数**: -```json -{ - "user_id": "string" // 可选,不传则获取当前用户信息 -} -``` - -**响应格式**: -```json -{ - "code": 0, - "message": "string", - "data": { - "openid": "", - "user_code": "", - "unionid": "", - "session_key": "", - "nickname": "张三", - "avatar_url": "https://example.com/avatar.jpg", - "gender": "", - "country": "", - "province": "", - "city": "", - "language": "", - "phone": "13800138000", - "is_subscribed": "0", - "latitude": "0", - "longitude": "0", - "subscribe_time": "2024-06-15 14:00:00", - "last_login_time": "2024-06-15 14:00:00" - } -} -``` - -### 2. 用户信息更新接口 `/user/update` - -**请求方式**: POST -**请求参数**: -```json -{ - "nickname": "string", - "avatar_url": "string", - "gender": "string", - "phone": "string", - "latitude": 31.2304, - "longitude": 121.4737, - "city": "string", - "province": "string", - "country": "string" -} -``` - -**响应格式**: -```json -{ - "code": 0, - "message": "string", - "data": {} -} -``` - -### 3. 头像上传接口 `/gallery/upload` - -**请求方式**: POST (multipart/form-data) -**请求参数**: -- `file`: 图片文件 - -**响应格式**: -```json -{ - "code": 0, - "message": "请求成功!", - "data": { - "create_time": "2025-09-06 19:41:18", - "last_modify_time": "2025-09-06 19:41:18", - "duration": "0", - "thumbnail_url": "", - "view_count": "0", - "download_count": "0", - "is_delete": 0, - "id": 67, - "user_id": 1, - "resource_type": "image", - "file_name": "front/ball/images/f1bd8f63-a1e0-4750-9656-1e8405753416.jpg", - "original_name": "微信图片_20250505175522.jpg", - "file_path": "http://bimwe.oss-cn-shanghai.aliyuncs.com/front/ball/images/f1bd8f63-a1e0-4750-9656-1e8405753416.jpg", - "file_url": "http://bimwe.oss-cn-shanghai.aliyuncs.com/front/ball/images/f1bd8f63-a1e0-4750-9656-1e8405753416.jpg", - "file_size": 264506, - "mime_type": "image/jpeg", - "description": "用户图像", - "tags": "用户图像", - "is_public": "1", - "width": 0, - "height": 0, - "uploadInfo": { - "success": true, - "name": "front/ball/images/f1bd8f63-a1e0-4750-9656-1e8405753416.jpg", - "path": "http://bimwe.oss-cn-shanghai.aliyuncs.com/front/ball/images/f1bd8f63-a1e0-4750-9656-1e8405753416.jpg", - "ossPath": "http://bimwe.oss-cn-shanghai.aliyuncs.com/front/ball/images/f1bd8f63-a1e0-4750-9656-1e8405753416.jpg", - "fileType": "image/jpeg", - "fileSize": 264506, - "originalName": "微信图片_20250505175522.jpg", - "suffix": "jpg", - "storagePath": "front/ball/images/f1bd8f63-a1e0-4750-9656-1e8405753416.jpg" - } - } -} -``` - -**说明**: 上传成功后,使用 `data.file_url` 字段作为头像URL。 - -## 使用方式 - -### 在页面中调用 - -```typescript -import { UserService } from '@/services/userService'; - -// 获取用户信息 -const userInfo = await UserService.get_user_info('user_id'); - -// 更新用户信息 -await UserService.save_user_info({ - nickname: '新昵称', - phone: '13800138000', - gender: '男' -}); - -// 上传头像 -const avatarUrl = await UserService.upload_avatar('/path/to/image.jpg'); -``` - -### API配置 - -API配置位于 `src/config/api.ts`,可以根据环境自动切换接口地址: - -```typescript -export const API_CONFIG = { - BASE_URL: process.env.NODE_ENV === 'development' - ? 'http://localhost:3000' - : 'https://api.example.com', - // ... -}; -``` - -## 错误处理 - -所有API调用都包含完整的错误处理: - -1. **网络错误**: 自动捕获并显示友好提示 -2. **业务错误**: 根据返回的 `code` 和 `message` 处理 -3. **超时处理**: 10秒超时设置 -4. **降级处理**: API失败时返回默认数据 - -## 数据映射 - -### 用户信息映射 - -API返回的用户数据会自动映射到前端组件使用的格式: - -```typescript -// API数据 -> 前端组件数据 -{ - user_code -> id, - nickname -> nickname, - avatar_url -> avatar, - subscribe_time -> join_date, - city -> location, - // ... -} -``` - -## 注意事项 - -1. **位置信息**: 更新用户信息时会自动获取当前位置 -2. **头像处理**: 上传失败时自动使用默认头像 -3. **表单验证**: 编辑资料页面包含完整的表单验证 -4. **类型安全**: 所有接口都有完整的TypeScript类型定义 - -## 扩展接口 - -如需添加新的用户相关接口,可以在 `UserService` 中添加新方法: - -```typescript -static async new_api_method(params: any): Promise { - try { - const response = await Taro.request({ - url: `${API_CONFIG.BASE_URL}/new/endpoint`, - method: 'POST', - data: params, - ...REQUEST_CONFIG - }); - - if (response.data.code === 0) { - return response.data.data; - } else { - throw new Error(response.data.message); - } - } catch (error) { - console.error('API调用失败:', error); - throw error; - } -} -``` \ No newline at end of file diff --git a/src/pages/userInfo/AVATAR_UPLOAD.md b/src/pages/userInfo/AVATAR_UPLOAD.md deleted file mode 100644 index e7a5917..0000000 --- a/src/pages/userInfo/AVATAR_UPLOAD.md +++ /dev/null @@ -1,240 +0,0 @@ -# 头像上传功能说明 - -## 接口更新 - -### 新的上传接口 `/gallery/upload` - -**接口地址**: `/gallery/upload` -**请求方式**: POST (multipart/form-data) -**功能**: 上传图片文件到阿里云OSS - -### 请求参数 - -| 参数名 | 类型 | 必填 | 说明 | -|--------|------|------|------| -| file | File | 是 | 图片文件 | - -### 响应格式 - -```json -{ - "code": 0, - "message": "请求成功!", - "data": { - "create_time": "2025-09-06 19:41:18", - "last_modify_time": "2025-09-06 19:41:18", - "duration": "0", - "thumbnail_url": "", - "view_count": "0", - "download_count": "0", - "is_delete": 0, - "id": 67, - "user_id": 1, - "resource_type": "image", - "file_name": "front/ball/images/f1bd8f63-a1e0-4750-9656-1e8405753416.jpg", - "original_name": "微信图片_20250505175522.jpg", - "file_path": "http://bimwe.oss-cn-shanghai.aliyuncs.com/front/ball/images/f1bd8f63-a1e0-4750-9656-1e8405753416.jpg", - "file_url": "http://bimwe.oss-cn-shanghai.aliyuncs.com/front/ball/images/f1bd8f63-a1e0-4750-9656-1e8405753416.jpg", - "file_size": 264506, - "mime_type": "image/jpeg", - "description": "用户图像", - "tags": "用户图像", - "is_public": "1", - "width": 0, - "height": 0, - "uploadInfo": { - "success": true, - "name": "front/ball/images/f1bd8f63-a1e0-4750-9656-1e8405753416.jpg", - "path": "http://bimwe.oss-cn-shanghai.aliyuncs.com/front/ball/images/f1bd8f63-a1e0-4750-9656-1e8405753416.jpg", - "ossPath": "http://bimwe.oss-cn-shanghai.aliyuncs.com/front/ball/images/f1bd8f63-a1e0-4750-9656-1e8405753416.jpg", - "fileType": "image/jpeg", - "fileSize": 264506, - "originalName": "微信图片_20250505175522.jpg", - "suffix": "jpg", - "storagePath": "front/ball/images/f1bd8f63-a1e0-4750-9656-1e8405753416.jpg" - } - } -} -``` - -## 关键字段说明 - -### 主要字段 -- `file_url`: 图片的完整访问URL,用于前端显示 -- `file_path`: 与file_url相同,图片的完整访问URL -- `file_size`: 文件大小(字节) -- `mime_type`: 文件MIME类型 -- `original_name`: 原始文件名 - -### 上传信息字段 -- `uploadInfo.success`: 上传是否成功 -- `uploadInfo.ossPath`: OSS存储路径 -- `uploadInfo.fileType`: 文件类型 -- `uploadInfo.fileSize`: 文件大小 -- `uploadInfo.suffix`: 文件后缀 - -## 前端实现 - -### TypeScript接口定义 - -```typescript -interface UploadResponseData { - create_time: string; - last_modify_time: string; - duration: string; - thumbnail_url: string; - view_count: string; - download_count: string; - is_delete: number; - id: number; - user_id: number; - resource_type: string; - file_name: string; - original_name: string; - file_path: string; - file_url: string; - file_size: number; - mime_type: string; - description: string; - tags: string; - is_public: string; - width: number; - height: number; - uploadInfo: { - success: boolean; - name: string; - path: string; - ossPath: string; - fileType: string; - fileSize: number; - originalName: string; - suffix: string; - storagePath: string; - }; -} -``` - -### 上传方法实现 - -```typescript -static async upload_avatar(file_path: string): Promise { - try { - const uploadResponse = await Taro.uploadFile({ - url: `${API_CONFIG.BASE_URL}${API_CONFIG.UPLOAD.AVATAR}`, - filePath: file_path, - name: 'file' - }); - - const result = JSON.parse(uploadResponse.data) as ApiResponse; - if (result.code === 0) { - // 使用file_url字段作为头像URL - return result.data.file_url; - } else { - throw new Error(result.message || '头像上传失败'); - } - } catch (error) { - console.error('头像上传失败:', error); - // 上传失败时返回默认头像 - return require('../../static/userInfo/default_avatar.svg'); - } -} -``` - -## 使用方式 - -### 在编辑资料页面中使用 - -```typescript -// 处理头像上传 -const handle_avatar_upload = () => { - Taro.chooseImage({ - count: 1, - sizeType: ['compressed'], - sourceType: ['album', 'camera'], - success: async (res) => { - const tempFilePath = res.tempFilePaths[0]; - try { - const avatar_url = await UserService.upload_avatar(tempFilePath); - setUserInfo(prev => ({ ...prev, avatar: avatar_url })); - Taro.showToast({ - title: '头像上传成功', - icon: 'success' - }); - } catch (error) { - console.error('头像上传失败:', error); - Taro.showToast({ - title: '头像上传失败', - icon: 'none' - }); - } - } - }); -}; -``` - -## 功能特点 - -### 1. OSS存储 -- 图片直接上传到阿里云OSS -- 支持CDN加速访问 -- 自动生成唯一文件名 - -### 2. 文件信息完整 -- 记录文件大小、类型、原始名称 -- 支持文件描述和标签 -- 记录上传时间和修改时间 - -### 3. 错误处理 -- 上传失败时自动使用默认头像 -- 完整的错误日志记录 -- 用户友好的错误提示 - -### 4. 类型安全 -- 完整的TypeScript类型定义 -- 编译时类型检查 -- 智能代码提示 - -## 注意事项 - -1. **文件大小限制**: 建议限制上传文件大小,避免过大文件 -2. **文件类型验证**: 只允许上传图片格式文件 -3. **网络处理**: 上传过程中需要处理网络异常情况 -4. **用户体验**: 上传过程中显示加载状态 -5. **缓存策略**: 上传成功后更新本地缓存 - -## 扩展功能 - -### 图片压缩 -```typescript -// 可以在上传前进行图片压缩 -const compressImage = (filePath: string) => { - return Taro.compressImage({ - src: filePath, - quality: 80 - }); -}; -``` - -### 进度显示 -```typescript -// 显示上传进度 -const uploadWithProgress = (filePath: string) => { - return Taro.uploadFile({ - url: `${API_CONFIG.BASE_URL}${API_CONFIG.UPLOAD.AVATAR}`, - filePath: filePath, - name: 'file', - success: (res) => { - // 处理成功 - }, - fail: (err) => { - // 处理失败 - } - }); -}; -``` - ---- - -**更新时间**: 2024年12月19日 -**接口版本**: v1.0 -**存储方式**: 阿里云OSS \ No newline at end of file diff --git a/src/pages/userInfo/INTEGRATION_SUMMARY.md b/src/pages/userInfo/INTEGRATION_SUMMARY.md deleted file mode 100644 index 9eb55d9..0000000 --- a/src/pages/userInfo/INTEGRATION_SUMMARY.md +++ /dev/null @@ -1,160 +0,0 @@ -# 个人页面API接口集成完成 - -## ✅ 已完成的工作 - -### 1. API接口集成 -- **用户详情接口** (`/user/detail`) - 获取用户信息 -- **用户更新接口** (`/user/update`) - 更新用户详细信息 -- **头像上传接口** (`/gallery/upload`) - 上传用户头像到OSS - -### 2. 服务层优化 -- 创建了 `UserService` 类,统一管理用户相关API调用 -- 添加了完整的TypeScript类型定义 -- 实现了错误处理和降级机制 -- 支持位置信息自动获取 - -### 3. 配置管理 -- 创建了 `API_CONFIG` 配置文件 -- 支持开发/生产环境自动切换 -- 统一的请求配置和超时设置 - -### 4. 编辑资料页面增强 -- 新增手机号输入字段 -- 新增性别选择器(男/女) -- 保留NTRP等级选择器 -- 完整的表单验证 - -### 5. 数据映射 -- API数据格式自动映射到前端组件格式 -- 支持默认值处理 -- 时间格式转换 - -## 🔧 技术特点 - -### API调用方式 -```typescript -// 获取用户信息 -const userInfo = await UserService.get_user_info('user_id'); - -// 更新用户信息 -await UserService.save_user_info({ - nickname: '新昵称', - phone: '13800138000', - gender: '男', - location: '上海' -}); - -// 上传头像 -const avatarUrl = await UserService.upload_avatar('/path/to/image.jpg'); -``` - -### 错误处理 -- 网络错误自动捕获 -- 业务错误友好提示 -- API失败时降级到默认数据 -- 完整的日志记录 - -### 类型安全 -- 完整的TypeScript接口定义 -- API请求/响应类型约束 -- 组件属性类型检查 - -## 📱 功能亮点 - -### 1. 智能数据获取 -- 根据参数自动判断获取当前用户或指定用户信息 -- 支持用户ID参数传递 -- 自动处理数据格式转换 - -### 2. 位置服务集成 -- 更新用户信息时自动获取当前位置 -- 支持经纬度坐标传递 -- 城市信息自动填充 - -### 3. 文件上传优化 -- 支持图片压缩上传 -- 上传失败时自动使用默认头像 -- 进度提示和错误处理 - -### 4. 表单体验优化 -- 实时表单验证 -- 字符计数显示 -- 选择器交互优化 - -## 🚀 使用方式 - -### 页面导航 -```typescript -// 访问个人页面 -Taro.navigateTo({ - url: '/pages/userInfo/myself/index' -}); - -// 访问他人页面 -Taro.navigateTo({ - url: `/pages/userInfo/other/index?userid=${user_id}` -}); - -// 访问编辑资料页面 -Taro.navigateTo({ - url: '/pages/userInfo/edit/index' -}); -``` - -### API配置 -```typescript -// 开发环境 -API_CONFIG.BASE_URL = 'http://localhost:3000' - -// 生产环境 -API_CONFIG.BASE_URL = 'https://api.example.com' -``` - -## 📋 接口规范 - -### 请求格式 -- 所有接口使用POST方法 -- 请求头: `Content-Type: application/json` -- 超时设置: 10秒 - -### 响应格式 -```json -{ - "code": 0, // 0表示成功,非0表示失败 - "message": "string", // 错误信息 - "data": {} // 响应数据 -} -``` - -### 错误码处理 -- `code: 0` - 请求成功 -- `code: 非0` - 业务错误,显示message -- 网络错误 - 显示"网络连接失败" - -## 🔄 数据流 - -1. **页面加载** → 调用 `UserService.get_user_info()` -2. **用户操作** → 调用相应的API方法 -3. **数据更新** → 自动刷新页面状态 -4. **错误处理** → 显示友好提示信息 - -## 📝 注意事项 - -1. **权限处理**: 需要确保用户已登录才能调用API -2. **缓存策略**: 建议添加用户信息缓存机制 -3. **图片处理**: 头像上传需要后端支持文件上传 -4. **位置权限**: 需要用户授权位置信息访问 - -## 🎯 下一步优化 - -1. 添加用户信息缓存机制 -2. 实现离线数据支持 -3. 优化图片上传体验 -4. 添加更多用户统计信息接口 -5. 实现用户关注/粉丝功能 - ---- - -**集成完成时间**: 2024年12月19日 -**API版本**: v1.0 -**兼容性**: 支持所有Taro框架版本 \ No newline at end of file diff --git a/src/pages/userInfo/README.md b/src/pages/userInfo/README.md deleted file mode 100644 index 9bc7d9c..0000000 --- a/src/pages/userInfo/README.md +++ /dev/null @@ -1,97 +0,0 @@ -# 个人页面功能说明 - -## 功能概述 - -个人页面模块包含三个主要功能页面: - -1. **个人页面** (`/pages/userInfo/myself/index`) - 当前用户的主页 -2. **他人页面** (`/pages/userInfo/other/index`) - 其他用户的主页 -3. **编辑资料** (`/pages/userInfo/edit/index`) - 编辑个人资料 - -## 主要功能 - -### 个人页面 (myself) -- 显示当前用户的基本信息(头像、昵称、加入时间) -- 显示统计数据(关注、球友、主办、参加) -- 显示个人标签和简介 -- 提供编辑和分享功能 -- 显示球局订单和收藏快捷入口 -- 展示用户主办的球局和参与的球局 - -### 他人页面 (other) -- 显示其他用户的基本信息 -- 提供关注/取消关注功能 -- 提供发送消息功能 -- 展示该用户主办的球局和参与的球局 -- 支持点击参与者头像查看其他用户主页 - -### 编辑资料 (edit) -- 支持更换头像 -- 编辑昵称、个人简介、所在地区、职业 -- NTRP等级选择 -- 表单验证和保存功能 - -## 技术特点 - -### 组件化设计 -- `UserInfoCard` - 用户信息卡片组件 -- `GameCard` - 球局卡片组件 -- `GameTabs` - 球局标签页组件 - -### 服务层 -- `UserService` - 用户相关API服务 - - `get_user_info()` - 获取用户信息 - - `get_user_games()` - 获取用户球局记录 - - `toggle_follow()` - 关注/取消关注 - - `save_user_info()` - 保存用户信息 - - `upload_avatar()` - 上传头像 - -### 页面导航 -- 支持通过 `userid` 参数区分个人页面和他人页面 -- 页面间导航逻辑完善 -- 参数传递和状态管理 - -## 使用方式 - -### 访问个人页面 -```javascript -Taro.navigateTo({ - url: '/pages/userInfo/myself/index' -}); -``` - -### 访问他人页面 -```javascript -Taro.navigateTo({ - url: `/pages/userInfo/other/index?userid=${user_id}` -}); -``` - -### 访问编辑资料页面 -```javascript -Taro.navigateTo({ - url: '/pages/userInfo/edit/index' -}); -``` - -## 样式特点 - -- 使用渐变背景设计 -- 卡片式布局 -- 响应式交互效果 -- 统一的视觉风格 -- 符合小程序设计规范 - -## 数据流 - -1. 页面加载时从 `UserService` 获取数据 -2. 用户操作通过回调函数处理 -3. 状态更新后重新渲染组件 -4. 支持异步操作和错误处理 - -## 扩展性 - -- 组件可复用性强 -- 服务层易于扩展 -- 支持更多用户功能扩展 -- 便于维护和测试 \ No newline at end of file diff --git a/src/pages/userInfo/myself/index.tsx b/src/pages/userInfo/myself/index.tsx index 77380ea..87689a2 100644 --- a/src/pages/userInfo/myself/index.tsx +++ b/src/pages/userInfo/myself/index.tsx @@ -12,7 +12,7 @@ import { withAuth } from '@/components'; const MyselfPage: React.FC = () => { // 获取页面参数 const instance = Taro.getCurrentInstance(); - const user_id = instance.router?.params?.userid; + const user_id = instance.router?.params?.userid || ''; // 判断是否为当前用户 const is_current_user = !user_id; @@ -29,7 +29,6 @@ const MyselfPage: React.FC = () => { hosted: 0, participated: 0 }, - tags: ['加载中...'], bio: '加载中...', location: '加载中...', occupation: '加载中...', @@ -58,9 +57,9 @@ const MyselfPage: React.FC = () => { // 获取球局记录 let games_data; if (active_tab === 'hosted') { - games_data = await UserService.get_hosted_games(user_id || '1'); + games_data = await UserService.get_hosted_games(user_id); } else { - games_data = await UserService.get_participated_games(user_id || '1'); + games_data = await UserService.get_participated_games(user_id); } set_game_records(games_data); @@ -93,9 +92,9 @@ const MyselfPage: React.FC = () => { try { let games_data; if (active_tab === 'hosted') { - games_data = await UserService.get_hosted_games(user_id || '1'); + games_data = await UserService.get_hosted_games(user_id); } else { - games_data = await UserService.get_participated_games(user_id || '1'); + games_data = await UserService.get_participated_games(user_id); } set_game_records(games_data); } catch (error) { @@ -106,7 +105,7 @@ const MyselfPage: React.FC = () => { // 处理关注/取消关注 const handle_follow = async () => { try { - const new_following_state = await UserService.toggle_follow(user_id || '1', is_following); + const new_following_state = await UserService.toggle_follow(user_id, is_following); setIsFollowing(new_following_state); Taro.showToast({ diff --git a/src/services/userService.ts b/src/services/userService.ts index ae6c860..7ab035e 100644 --- a/src/services/userService.ts +++ b/src/services/userService.ts @@ -247,32 +247,28 @@ export class UserService { static async get_user_info(user_id?: string): Promise { try { const response = await httpService.post(API_CONFIG.USER.DETAIL, user_id ? { user_id } : {}, { - needAuth: false, + showLoading: false }); if (response.code === 0) { const userData = response.data; return { - id: userData.user_code || user_id || '1', - nickname: userData.nickname || '用户', - avatar: userData.avatar_url || require('../static/userInfo/default_avatar.svg'), - join_date: userData.subscribe_time ? `${new Date(userData.subscribe_time).getFullYear()}年${new Date(userData.subscribe_time).getMonth() + 1}月加入` : '未知时间加入', + id: userData.user_code || user_id || '', + nickname: userData.nickname || '', + avatar: userData.avatar_url || '', + join_date: userData.subscribe_time ? `${new Date(userData.subscribe_time).getFullYear()}年${new Date(userData.subscribe_time).getMonth() + 1}月加入` : '', stats: { following: userData.stats?.following_count || 0, friends: userData.stats?.followers_count || 0, hosted: userData.stats?.hosted_games_count || 0, participated: userData.stats?.participated_games_count || 0 }, - tags: [ - userData.city || '未知地区', - userData.province || '未知省份', - 'NTRP 3.0' // 默认等级,需要其他接口获取 - ], - bio: '这个人很懒,什么都没有写...', - location: userData.city || '未知地区', - occupation: '未知职业', // 需要其他接口获取 - ntrp_level: 'NTRP 3.0', // 需要其他接口获取 + + bio: '', + location:userData.province + userData.city || '', + occupation: '', + ntrp_level: '', phone: userData.phone || '', gender: userData.gender || '' }; @@ -282,25 +278,7 @@ export class UserService { } catch (error) { console.error('获取用户信息失败:', error); // 返回默认用户信息 - return { - id: user_id || '1', - nickname: '用户', - avatar: require('../static/userInfo/default_avatar.svg'), - join_date: '未知时间加入', - stats: { - following: 0, - friends: 0, - hosted: 0, - participated: 0 - }, - tags: ['未知地区', '未知职业', 'NTRP 3.0'], - bio: '这个人很懒,什么都没有写...', - location: '未知地区', - occupation: '未知职业', - ntrp_level: 'NTRP 3.0', - phone: '', - gender: '' - }; + return {} as UserInfo } } @@ -310,7 +288,7 @@ export class UserService { const response = await httpService.post(API_CONFIG.USER.HOSTED_GAMES, { user_id }, { - needAuth: false, + showLoading: false }); @@ -323,41 +301,7 @@ export class UserService { } catch (error) { console.error('获取主办球局失败:', error); // 返回符合ListContainer data格式的模拟数据 - return [ - { - id: 1, - title: '女生轻松双打', - dateTime: '明天(周五) 下午5点', - location: '仁恒河滨花园网球场', - distance: '3.5km', - registeredCount: 2, - maxCount: 4, - skillLevel: '2.0-2.5', - matchType: '双打', - images: [ - require('../static/userInfo/game1.svg'), - require('../static/userInfo/game2.svg'), - 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: '室外' - } - ]; + return [] } } @@ -367,7 +311,7 @@ export class UserService { const response = await httpService.post(API_CONFIG.USER.PARTICIPATED_GAMES, { user_id }, { - needAuth: false, + showLoading: false }); @@ -380,56 +324,8 @@ export class UserService { } catch (error) { console.error('获取参与球局失败:', error); // 返回符合ListContainer data格式的模拟数据 - return [ - { - id: 2, - title: '周末双打练习', - dateTime: '后天(周六) 上午10点', - location: '上海网球中心', - distance: '5.2km', - registeredCount: 6, - maxCount: 8, - skillLevel: '3.0-3.5', - matchType: '双打', - images: [ - require('../static/userInfo/game2.svg'), - 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: '室内' - } - ]; + return []; + } } @@ -447,7 +343,7 @@ export class UserService { try { const endpoint = is_following ? API_CONFIG.USER.UNFOLLOW : API_CONFIG.USER.FOLLOW; const response = await httpService.post(endpoint, { user_id }, { - needAuth: false, + showLoading: true, loadingText: is_following ? '取消关注中...' : '关注中...' }); @@ -484,7 +380,7 @@ export class UserService { }; const response = await httpService.post(API_CONFIG.USER.UPDATE, updateParams, { - needAuth: false, + showLoading: true, loadingText: '保存中...' }); @@ -508,7 +404,7 @@ export class UserService { page, limit }, { - needAuth: false, + showLoading: false }); diff --git a/src/static/userInfo/female.svg b/src/static/userInfo/female.svg new file mode 100644 index 0000000..b6e6f14 --- /dev/null +++ b/src/static/userInfo/female.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/static/userInfo/male.svg b/src/static/userInfo/male.svg new file mode 100644 index 0000000..127367e --- /dev/null +++ b/src/static/userInfo/male.svg @@ -0,0 +1,5 @@ + + + + + From fa0dc5bbd74d08e494fc869cf95948c9d1522c10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=88=90?= Date: Sun, 7 Sep 2025 20:12:54 +0800 Subject: [PATCH 4/4] 1 --- src/components/EditModal/EditModal.scss | 23 ++- src/components/EditModal/index.tsx | 31 +++- src/components/UserInfo/index.tsx | 4 +- src/pages/userInfo/edit/index.tsx | 216 +++++++++++++++++------- src/services/userService.ts | 18 +- 5 files changed, 217 insertions(+), 75 deletions(-) diff --git a/src/components/EditModal/EditModal.scss b/src/components/EditModal/EditModal.scss index aae757b..a5f11fd 100644 --- a/src/components/EditModal/EditModal.scss +++ b/src/components/EditModal/EditModal.scss @@ -82,10 +82,11 @@ // 内容区域 .modal_content { - padding: 0px 16px 20px; + padding: 16px 20px; display: flex; flex-direction: column; gap: 20px; + box-sizing: border-box; .input_container { display: flex; @@ -96,7 +97,13 @@ border-radius: 12px; padding: 10px 16px; box-shadow: 0px 4px 36px 0px rgba(0, 0, 0, 0.06); - min-height: 120px; + + + // 名字输入时的容器样式 + &:has(.nickname_input) { + min-height: 40px; + padding: 10px 16px; + } .text_input { flex: 1; @@ -109,11 +116,21 @@ background: transparent; outline: none; resize: none; - min-height: 80px; + + min-height: 120px; &::placeholder { color: rgba(60, 60, 67, 0.3); } + + // 名字输入特殊样式 + &.nickname_input { + min-height: 80px; + min-height: 20px; + height: 20px; + line-height: 20px; + padding: 0; + } } .char_count { diff --git a/src/components/EditModal/index.tsx b/src/components/EditModal/index.tsx index 0f97ce9..3fb59b6 100644 --- a/src/components/EditModal/index.tsx +++ b/src/components/EditModal/index.tsx @@ -1,11 +1,12 @@ import React, { useState, useEffect } from 'react'; -import { View, Text, Textarea, Button } from '@tarojs/components'; +import { View, Text, Textarea, Input, Picker } from '@tarojs/components'; import Taro from '@tarojs/taro'; import './EditModal.scss'; interface EditModalProps { visible: boolean; title: string; + type: string; placeholder: string; initialValue: string; maxLength: number; @@ -17,6 +18,7 @@ interface EditModalProps { const EditModal: React.FC = ({ visible, title, + type, placeholder, initialValue, maxLength, @@ -82,17 +84,34 @@ const EditModal: React.FC = ({ {/* 文本输入区域 */} -