/// 时间: 2026-03-31 /// 功能: 统计数据管理 /// 介绍: 管理应用的各种统计数据,包括浏览次数、答题次数、点赞数等 /// 最新变化: 新建文件 import 'package:shared_preferences/shared_preferences.dart'; class StatisticsManager { static const String _todayViewsKey = 'today_views'; static const String _weekViewsKey = 'week_views'; static const String _firstUseTimeKey = 'first_use_time'; static const String _todayLikesKey = 'today_likes'; static const String _todayQuestionsKey = 'today_questions'; static const String _lastViewDateKey = 'last_view_date'; static const String _lastWeekKey = 'last_week_start'; static const String _lastQuestionDateKey = 'last_question_date'; static StatisticsManager? _instance; StatisticsManager._internal(); factory StatisticsManager() { _instance ??= StatisticsManager._internal(); return _instance!; } /// 记录一次浏览 Future recordView() async { final prefs = await SharedPreferences.getInstance(); final now = DateTime.now(); final today = _formatDate(now); final weekStart = _getWeekStart(now); final lastViewDate = prefs.getString(_lastViewDateKey); final lastWeekStart = prefs.getString(_lastWeekKey); if (lastViewDate != today) { await prefs.setInt(_todayViewsKey, 0); await prefs.setString(_lastViewDateKey, today); } if (lastWeekStart != weekStart) { await prefs.setInt(_weekViewsKey, 0); await prefs.setString(_lastWeekKey, weekStart); } final todayViews = prefs.getInt(_todayViewsKey) ?? 0; final weekViews = prefs.getInt(_weekViewsKey) ?? 0; await prefs.setInt(_todayViewsKey, todayViews + 1); await prefs.setInt(_weekViewsKey, weekViews + 1); } /// 获取今日浏览次数 Future getTodayViews() async { final prefs = await SharedPreferences.getInstance(); final today = _formatDate(DateTime.now()); final lastViewDate = prefs.getString(_lastViewDateKey); if (lastViewDate != today) { return 0; } return prefs.getInt(_todayViewsKey) ?? 0; } /// 获取本周浏览次数 Future getWeekViews() async { final prefs = await SharedPreferences.getInstance(); final now = DateTime.now(); final weekStart = _getWeekStart(now); final lastWeekStart = prefs.getString(_lastWeekKey); if (lastWeekStart != weekStart) { return 0; } return prefs.getInt(_weekViewsKey) ?? 0; } /// 记录首次使用时间 Future recordFirstUse() async { final prefs = await SharedPreferences.getInstance(); if (!prefs.containsKey(_firstUseTimeKey)) { await prefs.setString(_firstUseTimeKey, DateTime.now().toIso8601String()); } } /// 获取首次使用时间 Future getFirstUseTime() async { final prefs = await SharedPreferences.getInstance(); final timeStr = prefs.getString(_firstUseTimeKey); if (timeStr == null) { return '未记录'; } final date = DateTime.parse(timeStr); return '${date.year}-${date.month.toString().padLeft(2, '0')}-${date.day.toString().padLeft(2, '0')}'; } /// 记录今日点赞 Future recordTodayLike() async { final prefs = await SharedPreferences.getInstance(); final now = DateTime.now(); final today = _formatDate(now); final lastLikeDate = prefs.getString('last_like_date'); if (lastLikeDate != today) { await prefs.setInt(_todayLikesKey, 0); await prefs.setString('last_like_date', today); } final todayLikes = prefs.getInt(_todayLikesKey) ?? 0; await prefs.setInt(_todayLikesKey, todayLikes + 1); } /// 获取今日点赞数 Future getTodayLikes() async { final prefs = await SharedPreferences.getInstance(); final today = _formatDate(DateTime.now()); final lastLikeDate = prefs.getString('last_like_date'); if (lastLikeDate != today) { return 0; } return prefs.getInt(_todayLikesKey) ?? 0; } /// 获取数据占用空间 Future getDataSize() async { try { final prefs = await SharedPreferences.getInstance(); final keys = prefs.getKeys(); int totalBytes = 0; for (final key in keys) { final value = prefs.get(key); if (value != null) { totalBytes += value.toString().length * 2; } } if (totalBytes < 1024) { return '$totalBytes B'; } else if (totalBytes < 1024 * 1024) { return '${(totalBytes / 1024).toStringAsFixed(1)} KB'; } else { return '${(totalBytes / (1024 * 1024)).toStringAsFixed(1)} MB'; } } catch (e) { return '计算失败'; } } /// 获取累计浏览数 Future getTotalViews() async { final prefs = await SharedPreferences.getInstance(); return prefs.getInt('total_views') ?? 0; } /// 记录累计浏览 Future recordTotalView() async { final prefs = await SharedPreferences.getInstance(); final totalViews = prefs.getInt('total_views') ?? 0; await prefs.setInt('total_views', totalViews + 1); } /// 获取累计点赞数 Future getTotalLikes() async { final prefs = await SharedPreferences.getInstance(); return prefs.getInt('total_likes') ?? 0; } /// 记录累计点赞 Future recordTotalLike() async { final prefs = await SharedPreferences.getInstance(); final totalLikes = prefs.getInt('total_likes') ?? 0; await prefs.setInt('total_likes', totalLikes + 1); } /// 获取累计答题数 Future getTotalQuestions() async { final prefs = await SharedPreferences.getInstance(); return prefs.getInt('totalQuestions') ?? 0; } /// 记录今日答题 Future recordTodayQuestion() async { final prefs = await SharedPreferences.getInstance(); final now = DateTime.now(); final today = _formatDate(now); final lastQuestionDate = prefs.getString(_lastQuestionDateKey); if (lastQuestionDate != today) { await prefs.setInt(_todayQuestionsKey, 0); await prefs.setString(_lastQuestionDateKey, today); } final todayQuestions = prefs.getInt(_todayQuestionsKey) ?? 0; await prefs.setInt(_todayQuestionsKey, todayQuestions + 1); } /// 获取今日答题数 Future getTodayQuestions() async { final prefs = await SharedPreferences.getInstance(); final today = _formatDate(DateTime.now()); final lastQuestionDate = prefs.getString(_lastQuestionDateKey); if (lastQuestionDate != today) { return 0; } return prefs.getInt(_todayQuestionsKey) ?? 0; } /// 获取使用天数 Future getUseDays() async { final prefs = await SharedPreferences.getInstance(); final timeStr = prefs.getString(_firstUseTimeKey); if (timeStr == null) { return 1; } try { final firstUseDate = DateTime.parse(timeStr); final today = DateTime.now(); final difference = today.difference(firstUseDate); return difference.inDays + 1; } catch (e) { return 1; } } /// 格式化日期为 YYYY-MM-DD String _formatDate(DateTime date) { return '${date.year}-${date.month.toString().padLeft(2, '0')}-${date.day.toString().padLeft(2, '0')}'; } /// 获取本周开始日期(周一) String _getWeekStart(DateTime date) { final monday = date.subtract(Duration(days: date.weekday - 1)); return _formatDate(monday); } }