hookehuyr

feat(profile): 添加家庭状态检查并动态调整菜单项

根据用户是否加入家庭来动态显示或隐藏家庭相关菜单项
新增has_family字段存储用户家庭状态
......@@ -115,8 +115,26 @@
<!-- 底部固定按钮 -->
<view v-if="isShowBtn" class="fixed bottom-0 left-0 right-0 bg-white border-t border-gray-100 p-4 z-10">
<!-- 双按钮布局:大于60岁且未创建过家庭 -->
<view v-if="showDoubleButtons" class="flex gap-3">
<view
@tap="createNewFamily"
class="flex-1 bg-green-500 text-white text-center py-3 rounded-lg font-medium text-sm"
>
创建家庭
</view>
<view
@tap="joinNewFamily"
class="flex-1 bg-blue-500 text-white text-center py-3 rounded-lg font-medium text-sm"
>
加入家庭
</view>
</view>
<!-- 单按钮布局:其他情况 -->
<view
v-else
@tap="joinNewFamily"
class="w-full bg-blue-500 text-white text-center py-3 rounded-lg font-medium text-sm"
>
加入新家庭
......@@ -224,6 +242,7 @@ import { Home, Check } from '@nutui/icons-vue-taro';
import './index.less';
// 获取接口信息
import { getMyFamiliesAPI, switchCurrentFamilyAPI, deleteFamilyMemberAPI } from '@/api/family';
import { getUserProfileAPI } from '@/api/user';
//
const defaultFamilyCoverSvg = 'https://cdn.ipadbiz.cn/lls_prog/images/default-family-cover.png';
// 默认头像
......@@ -232,6 +251,8 @@ const defaultAvatar = 'https://cdn.ipadbiz.cn/mlaj/images/icon_1.jpeg'
// 响应式数据
const familyList = ref([]);
const userProfile = ref(null); // 用户资料信息
const isOver60 = ref(false); // 是否大于60岁
// 成员管理相关数据
const showMemberPopup = ref(false);
......@@ -240,20 +261,60 @@ const selectedMembers = ref([]);
const currentMembers = ref([]);
/**
* 计算年龄
* @param {string} birthDate - 生日日期字符串
* @returns {number} 年龄
*/
const calculateAge = (birthDate) => {
if (!birthDate) return 0;
const birth = new Date(birthDate);
const today = new Date();
let age = today.getFullYear() - birth.getFullYear();
const monthDiff = today.getMonth() - birth.getMonth();
if (monthDiff < 0 || (monthDiff === 0 && today.getDate() < birth.getDate())) {
age--;
}
return age;
};
/**
* 初始化页面数据
*/
const initPageData = async () => {
// 获取家庭列表
const { code, data } = await getMyFamiliesAPI();
if (code) {
familyList.value = data;
console.warn(data);
}
// 获取用户资料
const userRes = await getUserProfileAPI();
if (userRes.code && userRes.data?.user) {
userProfile.value = userRes.data.user;
const age = calculateAge(userRes.data.user.birth_date);
isOver60.value = age > 60;
console.log('用户年龄:', age, '是否大于60岁:', isOver60.value);
}
};
// 如果家庭列表存在时, 才显示加入新家庭的按钮
const isShowBtn = computed(() => {
return familyList.value.length > 0;
})
});
// 判断用户是否创建过家庭
const hasCreatedFamily = computed(() => {
return familyList.value.some(family => family.is_my);
});
// 判断是否显示双按钮(创建家庭 + 加入家庭)
const showDoubleButtons = computed(() => {
return isOver60.value && !hasCreatedFamily.value;
});
/**
* 切换到指定家庭
......@@ -365,6 +426,15 @@ const joinNewFamily = () => {
};
/**
* 创建新家庭
*/
const createNewFamily = () => {
Taro.navigateTo({
url: '/pages/CreateFamily/index'
});
};
/**
* 显示成员管理弹窗
* @param {Object} family - 家庭对象
*/
......
<!--
* @Date: 2025-08-27 17:47:46
* @LastEditors: hookehuyr hookehuyr@gmail.com
* @LastEditTime: 2025-09-20 10:19:41
* @LastEditTime: 2025-09-22 13:40:24
* @FilePath: /lls_program/src/pages/Profile/index.vue
* @Description: 文件描述
-->
......@@ -52,6 +52,7 @@ import { My, Shop3, Cart, Message, Tips, Right, Ask } from '@nutui/icons-vue-tar
const defaultAvatar = 'https://cdn.ipadbiz.cn/mlaj/images/icon_1.jpeg'
// 获取接口信息
import { getUserProfileAPI } from '@/api/user'
import { getMyFamiliesAPI } from '@/api/family'
// 系统信息
const systemInfo = ref({});
......@@ -168,6 +169,7 @@ const userInfo = ref({
nickName: '',
avatarUrl: '',
is_creator: false,
has_family: false, // 新增字段:用户是否加入了家庭
});
const goToEditProfile = () => {
......@@ -185,14 +187,35 @@ const initPageData = async () => {
nickName: data?.user?.nickname || '临时用户',
avatarUrl: data?.user?.avatar_url || '',
is_creator: data?.user?.is_creator || false,
birth_date: data?.user?.birth_date || ''
birth_date: data?.user?.birth_date || '',
has_family: false // 初始化为false
}
// 根据用户身份更新菜单项
// 检查用户是否加入了家庭
try {
const familyResponse = await getMyFamiliesAPI();
if (familyResponse.code && familyResponse.data && familyResponse.data.length > 0) {
userInfo.value.has_family = true;
}
} catch (error) {
console.error('获取家庭信息失败:', error);
userInfo.value.has_family = false;
}
// 根据用户身份和家庭状态更新菜单项
if (userInfo.value.is_creator) {
// 创建者显示所有菜单项
menuItems.value = allMenuItems;
} else {
// 非创建者保持原有的过滤逻辑
menuItems.value = allMenuItems.filter(item => !['points', 'rewards'].includes(item.id));
// 非创建者过滤掉积分和兑换相关菜单
let filteredItems = allMenuItems.filter(item => !['points', 'rewards'].includes(item.id));
// 如果用户没有加入家庭,也过滤掉family菜单项
if (!userInfo.value.has_family) {
filteredItems = filteredItems.filter(item => item.id !== 'family');
}
menuItems.value = filteredItems;
}
}
}
......