feat: 更新个人信息和打卡功能

- 在个人信息页面中修改用户姓名字段为“name”,并添加注销帐号功能,支持用户删除帐号及相关数据
- 在打卡页面中集成从后端获取当天打卡列表的功能,确保用户数据的实时同步
- 更新 Redux 状态管理,支持打卡记录的同步和更新
- 新增打卡服务,提供创建、更新和删除打卡记录的 API 接口
- 优化样式以适应新功能的展示和交互
This commit is contained in:
richarjiang
2025-08-13 19:24:03 +08:00
parent ebc74eb1c8
commit 7ad26590e5
7 changed files with 225 additions and 22 deletions

View File

@@ -2,7 +2,8 @@ import { Colors } from '@/constants/Colors';
import { getTabBarBottomPadding } from '@/constants/TabBar';
import { useAppDispatch, useAppSelector } from '@/hooks/redux';
import { useColorScheme } from '@/hooks/useColorScheme';
import { DEFAULT_MEMBER_NAME, fetchMyProfile } from '@/store/userSlice';
import { api } from '@/services/api';
import { DEFAULT_MEMBER_NAME, fetchMyProfile, logout } from '@/store/userSlice';
import { Ionicons } from '@expo/vector-icons';
import AsyncStorage from '@react-native-async-storage/async-storage';
import { useBottomTabBarHeight } from '@react-navigation/bottom-tabs';
@@ -29,7 +30,7 @@ export default function PersonalScreen() {
const DEFAULT_AVATAR_URL = 'https://plates-1251306435.cos.ap-guangzhou.myqcloud.com/images/avatar/avatarGirl01.jpeg';
type UserProfile = {
fullName?: string;
name?: string;
email?: string;
gender?: 'male' | 'female' | '';
age?: string;
@@ -125,7 +126,34 @@ export default function PersonalScreen() {
};
const displayName = (profile.fullName && profile.fullName.trim()) ? profile.fullName : DEFAULT_MEMBER_NAME;
const displayName = (profile.name && profile.name.trim()) ? profile.name : DEFAULT_MEMBER_NAME;
const handleDeleteAccount = () => {
Alert.alert(
'确认注销帐号',
'此操作不可恢复,将删除您的帐号及相关数据。确定继续吗?',
[
{ text: '取消', style: 'cancel' },
{
text: '确认注销',
style: 'destructive',
onPress: async () => {
try {
await api.delete('/api/users/delete-account');
await AsyncStorage.multiRemove(['@user_personal_info']);
await dispatch(logout()).unwrap();
Alert.alert('帐号已注销', '您的帐号已成功注销');
router.replace('/auth/login');
} catch (err: any) {
const message = err?.message || '注销失败,请稍后重试';
Alert.alert('注销失败', message);
}
},
},
],
{ cancelable: true }
);
};
const UserInfoSection = () => (
<View style={[styles.userInfoCard, { backgroundColor: colorTokens.card }]}>
@@ -282,6 +310,16 @@ export default function PersonalScreen() {
},
];
const securityItems = [
{
icon: 'trash-outline',
iconBg: '#FFE8E8',
iconColor: '#FF4444',
title: '注销帐号',
onPress: handleDeleteAccount,
},
];
const developerItems = [
{
icon: 'refresh-outline',
@@ -306,6 +344,7 @@ export default function PersonalScreen() {
<MenuSection title="账户" items={accountItems} />
<MenuSection title="通知" items={notificationItems} />
<MenuSection title="其他" items={otherItems} />
<MenuSection title="账号与安全" items={securityItems} />
<MenuSection title="开发者" items={developerItems} />
{/* 底部浮动按钮 */}