优化个人页

This commit is contained in:
2025-10-17 16:24:07 +08:00
parent 8f688378e1
commit f3ab0020d3
7 changed files with 549 additions and 429 deletions

View File

@@ -3,53 +3,36 @@ import { View, Text, Image, ScrollView, Button } from "@tarojs/components";
import { PopupPicker } from "@/components/Picker/index";
import Taro from "@tarojs/taro";
import "./index.scss";
import { UserInfo } from "@/components/UserInfo";
import { UserService, PickerOption } from "@/services/userService";
import { clear_login_state } from "@/services/loginService";
import { convert_db_gender_to_display } from "@/utils/genderUtils";
import { EditModal } from "@/components";
import img from "@/config/images";
import CommonDialog from "@/components/CommonDialog";
import { useUserActions, useUserInfo } from "@/store/userStore";
import { UserInfoType } from "@/services/userService";
const EditProfilePage: React.FC = () => {
// 用户信息状态
const [user_info, setUserInfo] = useState<UserInfo>({
id: "1",
nickname: "加载中...",
avatar: require("@/static/userInfo/default_avatar.svg"),
join_date: "加载中...",
stats: {
following: 0,
friends: 0,
hosted: 0,
participated: 0,
},
personal_profile: "加载中...",
occupation: "加载中...",
ntrp_level: "NTRP 3.0",
phone: "",
gender: "",
country: "",
province: "",
city: "",
});
const { updateUserInfo } = useUserActions();
// 直接从store获取用户信息确保响应式更新
const user_info = useUserInfo();
// 表单状态
// 表单状态基于store中的用户信息初始化
const [form_data, setFormData] = useState({
nickname: "",
personal_profile: "",
occupation: "",
ntrp_level: "4.0",
phone: "",
gender: "",
birthday: "2000-01-01",
country: "",
province: "",
city: "",
nickname: (user_info as UserInfoType)?.nickname || "",
personal_profile: (user_info as UserInfoType)?.personal_profile || "",
occupation: (user_info as UserInfoType)?.occupation || "",
ntrp_level: (user_info as UserInfoType)?.ntrp_level || "4.0",
phone: (user_info as UserInfoType)?.phone || "",
gender: (user_info as UserInfoType)?.gender || "",
birthday: (user_info as UserInfoType)?.birthday || "2000-01-01",
country: (user_info as UserInfoType)?.country || "",
province: (user_info as UserInfoType)?.province || "",
city: (user_info as UserInfoType)?.city || "",
});
// 加载状态
const [loading, setLoading] = useState(true);
const [loading, setLoading] = useState(false);
const [showLogoutDialog, setShowLogoutDialog] = useState(false);
// 编辑弹窗状态
@@ -68,11 +51,28 @@ const EditProfilePage: React.FC = () => {
// 城市数据
const [cities, setCities] = useState<PickerOption[]>([]);
// 监听store中的用户信息变化同步到表单状态
useEffect(() => {
if (user_info && Object.keys(user_info).length > 0) {
setFormData({
nickname: (user_info as UserInfoType)?.nickname || "",
personal_profile: (user_info as UserInfoType)?.personal_profile || "",
occupation: (user_info as UserInfoType)?.occupation || "",
ntrp_level: (user_info as UserInfoType)?.ntrp_level || "4.0",
phone: (user_info as UserInfoType)?.phone || "",
gender: (user_info as UserInfoType)?.gender || "",
birthday: (user_info as UserInfoType)?.birthday || "2000-01-01",
country: (user_info as UserInfoType)?.country || "",
province: (user_info as UserInfoType)?.province || "",
city: (user_info as UserInfoType)?.city || "",
});
}
}, [user_info]);
// 页面加载时初始化数据
useEffect(() => {
load_user_info();
getProfessions();
getCities();
getProfessions();
}, []);
const getProfessions = async () => {
@@ -93,34 +93,34 @@ const EditProfilePage: React.FC = () => {
};
// 加载用户信息
const load_user_info = async () => {
try {
setLoading(true);
const user_data = await UserService.get_user_info();
setUserInfo(user_data);
setFormData({
nickname: user_data.nickname || "",
personal_profile: user_data.personal_profile || "",
occupation: user_data.occupation || "",
ntrp_level: user_data.ntrp_level || "NTRP 4.0",
phone: user_data.phone || "",
gender: user_data.gender || "",
birthday: user_data.birthday || "",
country: user_data.country || "",
province: user_data.province || "",
city: user_data.city || "",
});
} catch (error) {
console.error("加载用户信息失败:", error);
Taro.showToast({
title: "加载用户信息失败",
icon: "error",
duration: 2000,
});
} finally {
setLoading(false);
}
};
// const load_user_info = async () => {
// try {
// setLoading(true);
// const user_data = await UserService.get_user_info();
// setUserInfo(user_data);
// setFormData({
// nickname: user_data.nickname || "",
// personal_profile: user_data.personal_profile || "",
// occupation: user_data.occupation || "",
// ntrp_level: user_data.ntrp_level || "NTRP 4.0",
// phone: user_data.phone || "",
// gender: user_data.gender || "",
// birthday: user_data.birthday || "",
// country: user_data.country || "",
// province: user_data.province || "",
// city: user_data.city || "",
// });
// } catch (error) {
// console.error("加载用户信息失败:", error);
// Taro.showToast({
// title: "加载用户信息失败",
// icon: "error",
// duration: 2000,
// });
// } finally {
// setLoading(false);
// }
// };
// 处理头像上传
const handle_avatar_upload = () => {
@@ -184,11 +184,10 @@ const EditProfilePage: React.FC = () => {
try {
// 调用更新用户信息接口,只传递修改的字段
const update_data = { [editing_field]: value };
await UserService.update_user_info(update_data);
await updateUserInfo(update_data);
// 更新本地状态
// 更新表单状态store会自动更新
setFormData((prev) => ({ ...prev, [editing_field]: value }));
setUserInfo((prev) => ({ ...prev, [editing_field]: value }));
// 关闭弹窗
setEditModalVisible(false);
@@ -224,20 +223,18 @@ const EditProfilePage: React.FC = () => {
field !== null &&
!Array.isArray(field)
) {
await UserService.update_user_info({ ...field });
// 更新本地状态
await updateUserInfo({ ...field });
// 更新表单状态store会自动更新
setFormData((prev) => ({ ...prev, ...field }));
setUserInfo((prev) => ({ ...prev, ...field }));
} else {
// 调用更新用户信息接口,只传递修改的字段
const update_data = { [field as string]: value };
await UserService.update_user_info(update_data);
await updateUserInfo(update_data);
// 更新本地状态
// 更新表单状态store会自动更新
setFormData((prev) => ({ ...prev, [field as string]: value }));
setUserInfo((prev) => ({ ...prev, [field as string]: value }));
}
// 显示成功提示
Taro.showToast({
title: "保存成功",
@@ -364,7 +361,7 @@ const EditProfilePage: React.FC = () => {
<View className="avatar_container" onClick={handle_avatar_upload}>
<Image
className="avatar"
src={user_info.avatar}
src={(user_info as UserInfoType)?.avatar_url || ""}
mode="aspectFill"
/>
<View className="avatar_overlay">
@@ -393,7 +390,7 @@ const EditProfilePage: React.FC = () => {
</View>
<View className="item_right">
<Text className="item_value">
{form_data.nickname || "188的王晨"}
{form_data.nickname || ""}
</Text>
<Image
className="arrow_icon"
@@ -648,6 +645,8 @@ const EditProfilePage: React.FC = () => {
{/* 生日选择弹窗 */}
{birthday_picker_visible && (
<PopupPicker
minYear={1970}
maxYear={new Date().getFullYear()}
showHeader={true}
title="选择生日"
confirmText="保存"
@@ -693,7 +692,7 @@ const EditProfilePage: React.FC = () => {
],
]}
type="ntrp"
img={user_info.avatar}
img={(user_info as UserInfoType)?.avatar_url}
visible={ntrp_picker_visible}
setvisible={setNtrpPickerVisible}
value={[form_data.ntrp_level]}