소스 검색

个人信息修改

sunshibo 3 주 전
부모
커밋
e5c6bdc047
2개의 변경된 파일62개의 추가작업 그리고 28개의 파일을 삭제
  1. 36 19
      pages/personal/index.vue
  2. 26 9
      pages/personal/userInfo.vue

+ 36 - 19
pages/personal/index.vue

@@ -90,36 +90,52 @@ import LoginModal from '@/pages/components/LoginModal.vue';
 import { getFileUrl } from '@/utils/file.js';
 import { useUserStore } from '@/store/user.js';
 import { go } from '@/utils/utils.js';
-import { USER_INFO } from '@/settings/enums.js';
+import { GetUserInfo } from '@/api/dining.js';
 
 const userStore = useUserStore();
 const showLoginModal = ref(false);
-const userInfoSync = ref({});
+// 仅用接口返回的用户信息展示,不使用缓存
+const userInfoFromApi = ref({});
+
+// 将接口返回的用户信息转为页面展示字段(头像、昵称等)
+function normalizeUserInfoFromApi(raw) {
+	if (!raw || typeof raw !== 'object') return raw;
+	return {
+		...raw,
+		avatarUrl: raw.avatarUrl ?? raw.avatar ?? raw.headImgUrl ?? raw.icon ?? '',
+		nickName: raw.nickName ?? raw.nickname ?? raw.name ?? raw.userName ?? ''
+	};
+}
 
-function syncUserFromStorage() {
+async function fetchAndSetUserInfo() {
 	try {
-		const raw = uni.getStorageSync(USER_INFO);
-		userInfoSync.value = raw && typeof raw === 'object' ? raw : {};
+		const res = await GetUserInfo();
+		const data = res?.data ?? res ?? {};
+		const userData = data?.data ?? data;
+		if (userData && typeof userData === 'object') {
+			const normalized = normalizeUserInfoFromApi(userData);
+			userInfoFromApi.value = normalized;
+			userStore.setUserInfo({ ...userStore.getUserInfo, ...normalized });
+		} else {
+			userInfoFromApi.value = {};
+		}
 	} catch (e) {
-		userInfoSync.value = {};
+		console.warn('个人中心获取用户信息失败:', e);
+		userInfoFromApi.value = {};
 	}
 }
 
 onShow(() => {
-	syncUserFromStorage();
+	fetchAndSetUserInfo();
 });
-syncUserFromStorage();
 
-// 展示用用户信息(优先 onShow 同步的 storage,保证登录后关弹窗能刷新)
-const displayUserInfo = computed(() => {
-	const sync = userInfoSync.value;
-	if (sync && typeof sync === 'object' && Object.keys(sync).length > 0) return sync;
-	return userStore.getUserInfo || {};
-});
+// 展示用用户信息:仅来自接口,不使用缓存
+const displayUserInfo = computed(() => userInfoFromApi.value || {});
 
-// 头像:绑定缓存的 avatarUrl;本地/临时路径(如 127.0.0.1/tmp、wxfile://)会报 500,改用默认图
+// 头像:从接口获取并缓存后的用户信息中取 avatarUrl/avatar,无则默认图
 const avatarDisplayUrl = computed(() => {
-	const url = (displayUserInfo.value?.avatarUrl ?? '').trim();
+	const info = displayUserInfo.value;
+	const url = (info?.avatarUrl ?? info?.avatar ?? '').trim();
 	if (!url) return getFileUrl('img/personal/userDemo.png');
 	const isLocalTemp = /127\.0\.0\.1|localhost|^\/tmp\/|wxfile:\/\/|^blob:/i.test(url);
 	if (isLocalTemp) return getFileUrl('img/personal/userDemo.png');
@@ -127,9 +143,10 @@ const avatarDisplayUrl = computed(() => {
 	return getFileUrl(url);
 });
 
+// 昵称:从接口获取并缓存后的用户信息中取 nickName/nickname/name
 const displayNickName = computed(() => {
 	const info = displayUserInfo.value;
-	return info.nickName ?? info.nickname ?? info.name ?? '用户';
+	return info?.nickName ?? info?.nickname ?? info?.name ?? info?.userName ?? '用户';
 });
 
 // 处理登录点击
@@ -149,9 +166,9 @@ const handleNavClick = (url) => {
 	go(url);
 };
 
-// 登录成功回调:立即从 storage 同步用户信息,保证头像/昵称马上更新
+// 登录成功回调:重新拉取用户信息接口,保证头像/昵称马上更新
 const handleLoginSuccess = () => {
-	syncUserFromStorage();
+	fetchAndSetUserInfo();
 };
 
 // 取消登录回调

+ 26 - 9
pages/personal/userInfo.vue

@@ -105,7 +105,7 @@ import { ref, onMounted } from 'vue';
 import { useUserStore } from '@/store/user.js';
 import { getFileUrl } from '@/utils/file.js';
 import { go } from '@/utils/utils.js';
-import { PostUpdateProfile, uploadFileToServer } from '@/api/dining.js';
+import { GetUserInfo, PostUpdateProfile, uploadFileToServer } from '@/api/dining.js';
 import { UPLOAD } from '@/settings/siteSetting.js';
 
 const userStore = useUserStore();
@@ -143,19 +143,36 @@ const formData = ref({
 	phone: '1510987760'
 });
 
-// 初始化用户信息(头像用 avatarUrl/avatar,与缓存字段一致)
-onMounted(() => {
-	const userInfo = userStore.getUserInfo || {};
+// 从接口或本地缓存填充表单
+function fillFormFromUserInfo(userInfo) {
+	if (!userInfo || typeof userInfo !== 'object') return;
 	const g = userInfo.gender;
 	const genderVal = g === '女' || g === 'female' ? 'female' : 'male';
 	formData.value = {
-		userId: userInfo.id ?? userInfo.userId ?? null,
-		avatar: userInfo.avatarUrl ?? userInfo.avatar ?? '',
-		nickname: userInfo.nickName ?? userInfo.nickname ?? '',
+		userId: userInfo.id ?? userInfo.userId ?? formData.value.userId ?? null,
+		avatar: userInfo.avatarUrl ?? userInfo.avatar ?? formData.value.avatar ?? '',
+		nickname: userInfo.nickName ?? userInfo.nickname ?? formData.value.nickname ?? '',
 		gender: genderVal,
-		birthday: userInfo.birthday ?? '',
-		phone: userInfo.phone ?? userInfo.mobile ?? '1510987760'
+		birthday: userInfo.birthday ?? formData.value.birthday ?? '',
+		phone: userInfo.phone ?? userInfo.mobile ?? userInfo.contactPhone ?? formData.value.phone ?? '1510987760'
 	};
+}
+
+// 进入页面时调用获取用户信息接口,并填充表单;失败则用缓存
+onMounted(async () => {
+	// 先用缓存快速展示
+	fillFormFromUserInfo(userStore.getUserInfo || {});
+	try {
+		const res = await GetUserInfo();
+		const data = res?.data ?? res ?? {};
+		const userData = data?.data ?? data;
+		if (userData && typeof userData === 'object') {
+			fillFormFromUserInfo(userData);
+			userStore.setUserInfo({ ...userStore.getUserInfo, ...userData });
+		}
+	} catch (e) {
+		console.warn('获取用户信息失败,使用缓存:', e);
+	}
 });
 
 // 处理头像点击