From 97e89b9bf0a9e015988f8bdaee6999b257de9407 Mon Sep 17 00:00:00 2001 From: richarjiang Date: Fri, 15 Aug 2025 20:44:06 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=9B=B4=E6=96=B0=E9=9A=90=E7=A7=81?= =?UTF-8?q?=E5=90=8C=E6=84=8F=E5=BC=B9=E7=AA=97=E5=92=8C=E5=BA=94=E7=94=A8?= =?UTF-8?q?=E5=90=8D=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将应用名称修改为“每日普拉提”,提升品牌识别度 - 新增隐私同意弹窗,确保用户在使用应用前同意隐私政策 - 更新 Redux 状态管理,添加隐私同意状态的处理 - 优化用户信息页面,确保体重和身高的格式化显示 - 更新今日训练页面标题为“快速训练”,提升用户体验 - 添加开发工具函数,便于测试隐私同意功能 --- app.json | 2 +- app/(tabs)/explore.tsx | 15 +-- app/(tabs)/index.tsx | 5 +- app/(tabs)/personal.tsx | 4 +- app/_layout.tsx | 46 ++++++- app/workout/today.tsx | 2 +- assets/images/icons/iconPlan.png | Bin 0 -> 59772 bytes components/PrivacyConsentModal.tsx | 191 +++++++++++++++++++++++++++++ ios/Podfile.lock | 6 + ios/digitalpilates/Info.plist | 2 +- package-lock.json | 7 ++ package.json | 1 + services/api.ts | 1 + store/userSlice.ts | 23 +++- utils/devTools.ts | 47 +++++++ 15 files changed, 326 insertions(+), 26 deletions(-) create mode 100644 assets/images/icons/iconPlan.png create mode 100644 components/PrivacyConsentModal.tsx create mode 100644 utils/devTools.ts diff --git a/app.json b/app.json index b01ba53..1762424 100644 --- a/app.json +++ b/app.json @@ -1,6 +1,6 @@ { "expo": { - "name": "digital-pilates", + "name": "普拉提助手", "slug": "digital-pilates", "version": "1.0.3", "orientation": "portrait", diff --git a/app/(tabs)/explore.tsx b/app/(tabs)/explore.tsx index 67474a6..38f12e0 100644 --- a/app/(tabs)/explore.tsx +++ b/app/(tabs)/explore.tsx @@ -29,6 +29,7 @@ export default function ExploreScreen() { const colorTokens = Colors[theme]; const stepGoal = useAppSelector((s) => s.user.profile?.dailyStepsGoal) ?? 2000; const userProfile = useAppSelector((s) => s.user.profile); + // 使用 dayjs:当月日期与默认选中“今天” const days = getMonthDaysZh(); const [selectedIndex, setSelectedIndex] = useState(getTodayIndexInMonth()); @@ -163,16 +164,6 @@ export default function ExploreScreen() { })} - {/* 打卡入口 */} - - 每日报告 - router.push('/checkin/calendar')} accessibilityRole="button"> - 查看打卡日历 - - - - {/* 取消卡片内 loading,保持静默刷新提升体验 */} - {/* 指标行:左大卡(训练时间),右两小卡(消耗卡路里、步数) */} @@ -230,8 +221,8 @@ export default function ExploreScreen() { {/* BMI 指数卡片 */} diff --git a/app/(tabs)/index.tsx b/app/(tabs)/index.tsx index bd3a5cf..b316076 100644 --- a/app/(tabs)/index.tsx +++ b/app/(tabs)/index.tsx @@ -301,7 +301,10 @@ export default function HomeScreen() { > - 💪 + 计划管理 diff --git a/app/(tabs)/personal.tsx b/app/(tabs)/personal.tsx index f2f595b..3b3789b 100644 --- a/app/(tabs)/personal.tsx +++ b/app/(tabs)/personal.tsx @@ -45,12 +45,12 @@ export default function PersonalScreen() { // 数据格式化函数 const formatHeight = () => { if (userProfile.height == null) return '--'; - return `${Math.round(userProfile.height)}cm`; + return `${parseFloat(userProfile.height).toFixed(1)}cm`; }; const formatWeight = () => { if (userProfile.weight == null) return '--'; - return `${Math.round(userProfile.weight * 10) / 10}kg`; + return `${parseFloat(userProfile.weight).toFixed(1)}kg`; }; const formatAge = () => { diff --git a/app/_layout.tsx b/app/_layout.tsx index 0de09f5..93cbe29 100644 --- a/app/_layout.tsx +++ b/app/_layout.tsx @@ -4,22 +4,60 @@ import { Stack } from 'expo-router'; import { StatusBar } from 'expo-status-bar'; import 'react-native-reanimated'; -import { useAppDispatch } from '@/hooks/redux'; +import PrivacyConsentModal from '@/components/PrivacyConsentModal'; +import { useAppDispatch, useAppSelector } from '@/hooks/redux'; import { useColorScheme } from '@/hooks/useColorScheme'; import { clearAiCoachSessionCache } from '@/services/aiCoachSession'; import { store } from '@/store'; -import { rehydrateUser } from '@/store/userSlice'; +import { rehydrateUser, setPrivacyAgreed } from '@/store/userSlice'; import React from 'react'; +import RNExitApp from 'react-native-exit-app'; + import { Provider } from 'react-redux'; function Bootstrapper({ children }: { children: React.ReactNode }) { const dispatch = useAppDispatch(); + const { privacyAgreed } = useAppSelector((state) => state.user); + const [showPrivacyModal, setShowPrivacyModal] = React.useState(false); + const [userDataLoaded, setUserDataLoaded] = React.useState(false); + React.useEffect(() => { - dispatch(rehydrateUser()); + const loadUserData = async () => { + await dispatch(rehydrateUser()); + setUserDataLoaded(true); + }; + + loadUserData(); // 冷启动时清空 AI 教练会话缓存 clearAiCoachSessionCache(); }, [dispatch]); - return <>{children}; + + React.useEffect(() => { + // 当用户数据加载完成后,检查是否需要显示隐私同意弹窗 + if (userDataLoaded && !privacyAgreed) { + setShowPrivacyModal(true); + } + }, [userDataLoaded, privacyAgreed]); + + const handlePrivacyAgree = () => { + dispatch(setPrivacyAgreed()); + setShowPrivacyModal(false); + }; + + const handlePrivacyDisagree = () => { + RNExitApp.exitApp(); + }; + + return ( + <> + {children} + + + ); } export default function RootLayout() { diff --git a/app/workout/today.tsx b/app/workout/today.tsx index 066f9f0..247a510 100644 --- a/app/workout/today.tsx +++ b/app/workout/today.tsx @@ -427,7 +427,7 @@ export default function TodayWorkoutScreen() { router.back()} withSafeTop={false} transparent={true} diff --git a/assets/images/icons/iconPlan.png b/assets/images/icons/iconPlan.png new file mode 100644 index 0000000000000000000000000000000000000000..e12236eb53ded822ec4b4720551fd6f83c2e81ad GIT binary patch literal 59772 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ℑKv@6i>-PB3GUGWax6qToe^&>>K!(!}{yzGbSDg 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 void; + onDisagree: () => void; +} + +export default function PrivacyConsentModal({ + visible, + onAgree, + onDisagree, +}: PrivacyConsentModalProps) { + const handleUserAgreementPress = () => { + router.push('/legal/user-agreement'); + }; + + const handlePrivacyPolicyPress = () => { + router.push('/legal/privacy-policy'); + }; + + return ( + + + + 欢迎来到普拉提助手 + + + + 点击"同意并继续"代表您已阅读并理解 + + + + 《用户协议》 + + + + 《隐私政策》 + + + + 我们深知保护用户隐私信息的重要性,请认真进行阅读。 + + + 查看完整版 + + 《用户协议》 + + + + 《隐私政策》 + + + + + + 同意并继续 + + + + 不同意并退出 + + + + + ); +} + +const styles = StyleSheet.create({ + overlay: { + flex: 1, + backgroundColor: 'rgba(0, 0, 0, 0.5)', + justifyContent: 'center', + alignItems: 'center', + paddingHorizontal: 20, + }, + container: { + backgroundColor: 'white', + borderRadius: 20, + padding: 24, + width: width * 0.85, + maxWidth: 400, + alignItems: 'center', + }, + iconContainer: { + marginBottom: 20, + alignItems: 'center', + }, + characterContainer: { + position: 'relative', + alignItems: 'center', + }, + iconText: { + fontSize: 48, + marginBottom: 8, + }, + balloons: { + position: 'absolute', + top: -5, + right: -25, + flexDirection: 'row', + gap: 4, + }, + balloon: { + width: 12, + height: 16, + borderRadius: 6, + }, + title: { + fontSize: 20, + fontWeight: '600', + color: '#1F2937', + marginBottom: 20, + textAlign: 'center', + }, + contentContainer: { + marginBottom: 24, + }, + description: { + fontSize: 14, + color: '#6B7280', + lineHeight: 20, + textAlign: 'center', + }, + linksContainer: { + flexDirection: 'row', + justifyContent: 'center', + alignItems: 'center', + flexWrap: 'wrap', + }, + link: { + fontSize: 14, + color: '#8B5FE6', + textDecorationLine: 'underline', + }, + and: { + fontSize: 14, + color: '#6B7280', + }, + viewFullContainer: { + flexDirection: 'row', + justifyContent: 'center', + alignItems: 'center', + flexWrap: 'wrap', + marginTop: 4, + }, + viewFull: { + fontSize: 14, + color: '#6B7280', + }, + agreeButton: { + backgroundColor: '#8B5FE6', + borderRadius: 25, + paddingVertical: 14, + paddingHorizontal: 40, + width: '100%', + marginBottom: 12, + }, + agreeButtonText: { + color: 'white', + fontSize: 16, + fontWeight: '600', + textAlign: 'center', + }, + disagreeButton: { + paddingVertical: 14, + paddingHorizontal: 40, + }, + disagreeButtonText: { + color: '#9CA3AF', + fontSize: 16, + fontWeight: '500', + textAlign: 'center', + }, +}); diff --git a/ios/Podfile.lock b/ios/Podfile.lock index e3039da..096cb1a 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -1730,6 +1730,8 @@ PODS: - Yoga - RNDateTimePicker (8.4.4): - React-Core + - RNExitApp (2.0.0): + - React-Core - RNGestureHandler (2.24.0): - DoubleConversion - glog @@ -2010,6 +2012,7 @@ DEPENDENCIES: - "RNCAsyncStorage (from `../node_modules/@react-native-async-storage/async-storage`)" - "RNCMaskedView (from `../node_modules/@react-native-masked-view/masked-view`)" - "RNDateTimePicker (from `../node_modules/@react-native-community/datetimepicker`)" + - RNExitApp (from `../node_modules/react-native-exit-app`) - RNGestureHandler (from `../node_modules/react-native-gesture-handler`) - RNReanimated (from `../node_modules/react-native-reanimated`) - RNScreens (from `../node_modules/react-native-screens`) @@ -2221,6 +2224,8 @@ EXTERNAL SOURCES: :path: "../node_modules/@react-native-masked-view/masked-view" RNDateTimePicker: :path: "../node_modules/@react-native-community/datetimepicker" + RNExitApp: + :path: "../node_modules/react-native-exit-app" RNGestureHandler: :path: "../node_modules/react-native-gesture-handler" RNReanimated: @@ -2334,6 +2339,7 @@ SPEC CHECKSUMS: RNCAsyncStorage: b44e8a4e798c3e1f56bffccd0f591f674fb9198f RNCMaskedView: d4644e239e65383f96d2f32c40c297f09705ac96 RNDateTimePicker: 7d93eacf4bdf56350e4b7efd5cfc47639185e10c + RNExitApp: 4432b9b7cc5ccec9f91c94e507849891282befd4 RNGestureHandler: 6e640921d207f070e4bbcf79f4e6d0eabf323389 RNReanimated: 34e90d19560aebd52a2ad583fdc2de2cf7651bbb RNScreens: 241cfe8fc82737f3e132dd45779f9512928075b8 diff --git a/ios/digitalpilates/Info.plist b/ios/digitalpilates/Info.plist index 7056669..ceea14f 100644 --- a/ios/digitalpilates/Info.plist +++ b/ios/digitalpilates/Info.plist @@ -7,7 +7,7 @@ CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) CFBundleDisplayName - digital-pilates + 普拉提助手 CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier diff --git a/package-lock.json b/package-lock.json index 88ff173..64e9e93 100644 --- a/package-lock.json +++ b/package-lock.json @@ -38,6 +38,7 @@ "react-dom": "19.0.0", "react-native": "0.79.5", "react-native-cos-sdk": "^1.2.1", + "react-native-exit-app": "^2.0.0", "react-native-gesture-handler": "~2.24.0", "react-native-health": "^1.19.0", "react-native-image-viewing": "^0.2.2", @@ -10881,6 +10882,12 @@ "react-native": "*" } }, + "node_modules/react-native-exit-app": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/react-native-exit-app/-/react-native-exit-app-2.0.0.tgz", + "integrity": "sha512-vr9e/8jgPcKCBw6qo0QLxfeMiTwExydghbYDqpLZYAGWR+6cbgnhvOxwdYj/JWR7ZtOALrRA4GMGSvU/ayxM7w==", + "license": "MIT" + }, "node_modules/react-native-fit-image": { "version": "1.5.5", "resolved": "https://mirrors.tencent.com/npm/react-native-fit-image/-/react-native-fit-image-1.5.5.tgz", diff --git a/package.json b/package.json index 59008ae..7eb4cb6 100644 --- a/package.json +++ b/package.json @@ -41,6 +41,7 @@ "react-dom": "19.0.0", "react-native": "0.79.5", "react-native-cos-sdk": "^1.2.1", + "react-native-exit-app": "^2.0.0", "react-native-gesture-handler": "~2.24.0", "react-native-health": "^1.19.0", "react-native-image-viewing": "^0.2.2", diff --git a/services/api.ts b/services/api.ts index 93f5dd2..fd8d9af 100644 --- a/services/api.ts +++ b/services/api.ts @@ -74,6 +74,7 @@ export const api = { export const STORAGE_KEYS = { authToken: '@auth_token', userProfile: '@user_profile', + privacyAgreed: '@privacy_agreed', } as const; export async function loadPersistedToken(): Promise { diff --git a/store/userSlice.ts b/store/userSlice.ts index 44aabb2..0070de0 100644 --- a/store/userSlice.ts +++ b/store/userSlice.ts @@ -9,8 +9,8 @@ export type UserProfile = { email?: string; gender?: Gender; birthDate?: string; - weight?: number; - height?: number; + weight?: string; + height?: string; avatar?: string | null; dailyStepsGoal?: number; // 每日步数目标(用于 Explore 页等) dailyCaloriesGoal?: number; // 每日卡路里消耗目标 @@ -22,6 +22,7 @@ export type UserState = { profile: UserProfile; loading: boolean; error: string | null; + privacyAgreed: boolean; }; export const DEFAULT_MEMBER_NAME = '普拉提星球学员'; @@ -33,6 +34,7 @@ const initialState: UserState = { }, loading: false, error: null, + privacyAgreed: false, }; export type LoginPayload = Record & { @@ -105,22 +107,30 @@ export const login = createAsyncThunk( ); export const rehydrateUser = createAsyncThunk('user/rehydrate', async () => { - const [token, profileStr] = await Promise.all([ + const [token, profileStr, privacyAgreedStr] = await Promise.all([ loadPersistedToken(), AsyncStorage.getItem(STORAGE_KEYS.userProfile), + AsyncStorage.getItem(STORAGE_KEYS.privacyAgreed), ]); await setAuthToken(token); let profile: UserProfile = {}; if (profileStr) { try { profile = JSON.parse(profileStr) as UserProfile; } catch { profile = {}; } } - return { token, profile } as { token: string | null; profile: UserProfile }; + const privacyAgreed = privacyAgreedStr === 'true'; + return { token, profile, privacyAgreed } as { token: string | null; profile: UserProfile; privacyAgreed: boolean }; +}); + +export const setPrivacyAgreed = createAsyncThunk('user/setPrivacyAgreed', async () => { + await AsyncStorage.setItem(STORAGE_KEYS.privacyAgreed, 'true'); + return true; }); export const logout = createAsyncThunk('user/logout', async () => { await Promise.all([ AsyncStorage.removeItem(STORAGE_KEYS.authToken), AsyncStorage.removeItem(STORAGE_KEYS.userProfile), + AsyncStorage.removeItem(STORAGE_KEYS.privacyAgreed), ]); await setAuthToken(null); return true; @@ -176,6 +186,7 @@ const userSlice = createSlice({ .addCase(rehydrateUser.fulfilled, (state, action) => { state.token = action.payload.token; state.profile = action.payload.profile; + state.privacyAgreed = action.payload.privacyAgreed; if (!state.profile?.name || !state.profile.name.trim()) { state.profile.name = DEFAULT_MEMBER_NAME; } @@ -193,6 +204,10 @@ const userSlice = createSlice({ .addCase(logout.fulfilled, (state) => { state.token = null; state.profile = {}; + state.privacyAgreed = false; + }) + .addCase(setPrivacyAgreed.fulfilled, (state) => { + state.privacyAgreed = true; }); }, }); diff --git a/utils/devTools.ts b/utils/devTools.ts new file mode 100644 index 0000000..7f94b19 --- /dev/null +++ b/utils/devTools.ts @@ -0,0 +1,47 @@ +import { STORAGE_KEYS } from '@/services/api'; +import AsyncStorage from '@react-native-async-storage/async-storage'; + +/** + * 开发工具函数 - 清除隐私同意状态 + * 用于测试隐私同意弹窗功能 + */ +export const clearPrivacyAgreement = async (): Promise => { + try { + await AsyncStorage.removeItem(STORAGE_KEYS.privacyAgreed); + console.log('隐私同意状态已清除'); + } catch (error) { + console.error('清除隐私同意状态失败:', error); + } +}; + +/** + * 开发工具函数 - 检查隐私同意状态 + */ +export const checkPrivacyAgreement = async (): Promise => { + try { + const privacyAgreed = await AsyncStorage.getItem(STORAGE_KEYS.privacyAgreed); + const isAgreed = privacyAgreed === 'true'; + console.log('隐私同意状态:', isAgreed); + return isAgreed; + } catch (error) { + console.error('检查隐私同意状态失败:', error); + return false; + } +}; + +/** + * 开发工具函数 - 清除所有用户数据 + * 用于完全重置应用状态 + */ +export const clearAllUserData = async (): Promise => { + try { + await Promise.all([ + AsyncStorage.removeItem(STORAGE_KEYS.authToken), + AsyncStorage.removeItem(STORAGE_KEYS.userProfile), + AsyncStorage.removeItem(STORAGE_KEYS.privacyAgreed), + ]); + console.log('所有用户数据已清除'); + } catch (error) { + console.error('清除用户数据失败:', error); + } +};