import React, { useState, useEffect } from 'react' import { View, Text, Image, Input, Button as TaroButton } from '@tarojs/components' import Taro from '@tarojs/taro' import BottomButton from '@/components/common/BottomButton' import { useUser } from '@/hooks/useUser' import { updateUser } from '@/api/system/user' import type { User } from '@/api/system/user/model' import { TenantId } from '@/config/app' definePageConfig({ navigationBarTitleText: '个人信息', }) const genderOptions = ['保密', '男', '女'] const ProfilePage: React.FC = () => { const { user, refreshUser } = useUser() const [form, setForm] = useState>({}) const [loading, setLoading] = useState(false) const [showGenderSheet, setShowGenderSheet] = useState(false) useEffect(() => { if (user) { setForm({ userId: (user as any)?.userId || (user as any)?.id, nickname: (user as any)?.nickname || '', avatar: (user as any)?.avatar || '', gender: (user as any)?.gender ?? 0, phone: (user as any)?.phone || '', }) } }, [user]) // 微信头像选择回调(open-type="chooseAvatar") const handleWechatAvatar = (e: any) => { const { avatarUrl } = e.detail if (!avatarUrl) return Taro.showLoading({ title: '上传中...' }) Taro.uploadFile({ url: 'https://server.websoft.top/api/oss/upload', filePath: avatarUrl, name: 'file', header: { 'content-type': 'application/json', TenantId, }, success: (uploadRes) => { const data = JSON.parse(uploadRes.data) if (data.code === 0 && data.data?.url) { setForm(prev => ({ ...prev, avatar: data.data.url })) Taro.showToast({ title: '上传成功', icon: 'success' }) } else { Taro.showToast({ title: data.message || '上传失败', icon: 'none' }) } }, fail: () => { Taro.showToast({ title: '上传失败', icon: 'none' }) }, complete: () => { Taro.hideLoading() }, }) } // 选择性别 const handleGenderSelect = (index: number) => { setForm(prev => ({ ...prev, gender: index })) setShowGenderSheet(false) } // 保存 const handleSave = async () => { if (!form.nickname?.trim()) { Taro.showToast({ title: '昵称不能为空', icon: 'none' }) return } setLoading(true) try { await updateUser(form as User) await refreshUser() Taro.showToast({ title: '保存成功', icon: 'success' }) } catch (error) { console.error('保存失败:', error) Taro.showToast({ title: '保存失败', icon: 'none' }) } finally { setLoading(false) } } const displayId = (user as any)?.userId || (user as any)?.id || '' const registerTime = (user as any)?.createTime || (user as any)?.createdAt || '' return ( {/* 头像 - 使用 Taro 原生 Button 支持 open-type="chooseAvatar" */} 头像 {form.avatar ? ( ) : ( 头像 )} {'>'} {/* 昵称 - 支持获取微信昵称 */} 昵称 setForm(prev => ({ ...prev, nickname: e.detail.value }))} maxlength={20} type='nickname' /> {/* 性别 */} setShowGenderSheet(true)}> 性别 {genderOptions[form.gender ?? 0]} {'>'} {/* 手机号 - 不可编辑 */} 手机号 {form.phone || '未绑定'} {/* 用户ID */} 用户ID {displayId || '未设置'} {/* 注册时间 */} 注册时间 {registerTime || '未知'} {/* 保存按钮 */} {/* 性别选择弹窗 */} {showGenderSheet && ( setShowGenderSheet(false)} /> 选择性别 {genderOptions.map((label, index) => ( handleGenderSelect(index)} > {label} {(form.gender ?? 0) === index && } ))} setShowGenderSheet(false)}> 取消 )} ) } export default ProfilePage