Files
wushu/lib/services/get/profile_controller.dart
2026-04-02 07:06:55 +08:00

330 lines
8.3 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import 'dart:convert';
import 'dart:math' show Random;
import 'dart:io' as io;
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter/foundation.dart' show kIsWeb;
import 'package:get/get.dart';
import '../../constants/app_constants.dart';
import '../../controllers/history_controller.dart';
import '../../controllers/shared_preferences_storage_controller.dart';
import '../isweb/wakelock_service.dart';
import '../../views/profile/guide/tongji.dart';
class ProfileController extends GetxController with WidgetsBindingObserver {
// 页面状态
var currentPage = 1.obs; // 默认显示第2页设置
var isCardExpanded = false.obs; // 个人卡片展开状态
var isStatsHidden = false.obs; // 统计数据隐藏状态
var isScreenWakeEnabled = false.obs; // 屏幕常亮状态
var startY = 0.0.obs;
// 历史记录相关
var poetryHistory = <Map<String, dynamic>>[].obs;
// 答题统计数据
var correctAnswers = 0.obs;
var weekQuestions = 0.obs;
// 统计数据
var todayViews = 0.obs;
var weekViews = 0.obs;
var firstUseTime = '未记录'.obs;
var useDays = 1.obs;
var dataSize = '0 B'.obs;
var noteCount = 0.obs;
var totalQuestions = 0.obs;
var todayQuestions = 0.obs;
var todayLikes = 0.obs;
// 可爱的emoji列表
final List<String> avatars = [
'👤',
'😊',
'🎉',
'🌟',
'🔥',
'💎',
'🌈',
'🦋',
'🌸',
'🐱',
'🐶',
'🐼',
'🐨',
'🐵',
'🦄',
'🐸',
'🐹',
'🐰',
'🦊',
'🐻',
];
// 模拟用户数据
var userData = {
'avatar': '👤', // 使用emoji代替网络图片
'nickname': '诗词爱好者',
'signature': '人生如诗,岁月如歌',
'level': 'Lv.12',
'vip': true,
'posts': 156,
'followers': 1280,
'following': 89,
'likes': 2560,
'favorites': 128,
'views': 3560,
}.obs;
@override
void onInit() {
super.onInit();
WidgetsBinding.instance.addObserver(this);
loadPoetryHistory();
loadPoetryStatistics();
loadStatistics();
}
@override
void onClose() {
WidgetsBinding.instance.removeObserver(this);
super.onClose();
}
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
if (state == AppLifecycleState.resumed) {
// 应用恢复时刷新数据
refreshData();
}
}
// 更换头像
void changeAvatar() {
final random = Random();
userData['avatar'] = avatars[random.nextInt(avatars.length)];
}
// 刷新所有数据
Future<void> refreshData() async {
await loadPoetryStatistics();
await loadStatistics();
}
// 页面切换
void onPageChanged(int page) {
currentPage.value = page;
HapticFeedback.lightImpact();
}
// 切换卡片展开状态
void toggleCardExpanded() {
isCardExpanded.value = !isCardExpanded.value;
}
// 切换统计数据显示状态
void toggleStatsHidden() {
isStatsHidden.value = !isStatsHidden.value;
HapticFeedback.lightImpact();
}
// === 历史记录相关方法 ===
Future<void> loadPoetryHistory() async {
try {
final history = await HistoryController.getHistory();
poetryHistory.value = history;
} catch (e) {
print('加载历史记录失败: $e');
}
}
// === 答题统计相关方法 ===
Future<void> loadPoetryStatistics() async {
try {
// 加载总体统计
correctAnswers.value = await SharedPreferencesStorageController.getInt(
'correctAnswers',
defaultValue: 0,
);
// 加载答题记录列表来计算今日和本周答题数
List<String> records =
await SharedPreferencesStorageController.getStringList(
'poetryAnswerRecords',
defaultValue: [],
);
final now = DateTime.now();
final todayStart = DateTime(now.year, now.month, now.day);
final weekStart = todayStart.subtract(
Duration(days: todayStart.weekday - 1),
);
todayQuestions.value = 0;
weekQuestions.value = 0;
for (String recordStr in records) {
try {
final record = jsonDecode(recordStr) as Map<String, dynamic>;
final answerTime = record['answerTime'];
if (answerTime != null) {
final time = DateTime.parse(answerTime);
if (time.isAfter(todayStart)) {
todayQuestions.value++;
}
if (time.isAfter(weekStart)) {
weekQuestions.value++;
}
}
} catch (e) {
continue;
}
}
} catch (e) {
print('加载答题统计失败: $e');
}
}
// === 加载统计数据 ===
Future<void> loadStatistics() async {
try {
// 加载浏览统计
todayViews.value = await StatisticsManager().getTodayViews();
weekViews.value = await StatisticsManager().getWeekViews();
firstUseTime.value = await StatisticsManager().getFirstUseTime();
useDays.value = await StatisticsManager().getUseDays();
dataSize.value = await StatisticsManager().getDataSize();
todayLikes.value = await StatisticsManager().getTodayLikes();
todayQuestions.value = await StatisticsManager().getTodayQuestions();
// 加载笔记总数
noteCount.value = await HistoryController.getNotesCount();
// 加载累计答题数
totalQuestions.value = await SharedPreferencesStorageController.getInt(
'totalQuestions',
defaultValue: 0,
);
} catch (e) {
print('加载统计数据失败: $e');
}
}
// === 屏幕常亮相关方法 ===
Future<void> toggleScreenWake(bool enable) async {
// Web 平台不支持 wakelock_plus
if (kIsWeb) {
Get.snackbar('提示', 'Web 平台不支持屏幕常亮功能');
return;
}
try {
// 使用 io.Platform 检测平台
final String osName = io.Platform.operatingSystem;
final String osVersion = io.Platform.operatingSystemVersion;
print('Current platform: $osName, version: $osVersion');
if (enable) {
await WakelockService.instance.enable();
Get.snackbar('提示', '屏幕常亮已开启');
} else {
await WakelockService.instance.disable();
Get.snackbar('提示', '屏幕常亮已关闭');
}
// 不再更新开关状态,由 UI 层直接控制
// isScreenWakeEnabled.value = enable;
} catch (e, stackTrace) {
print('WakelockService error: $e');
print('Stack trace: $stackTrace');
// 检查错误类型,判断是否是设备不支持
String errorMessage;
if (e.toString().contains('not supported') ||
e.toString().contains('unsupported') ||
e.toString().contains('不支持')) {
errorMessage = '该设备不支持屏幕常亮功能';
} else {
errorMessage = '屏幕常亮功能异常: $e';
}
// 不再更新开关状态,由 UI 层直接控制
// isScreenWakeEnabled.value = enable;
// 显示错误提示,但不影响开关状态
Get.dialog(
AlertDialog(
title: const Text('提示'),
content: Text(errorMessage),
actions: [
TextButton(onPressed: () => Get.back(), child: const Text('确定')),
],
),
);
}
}
// === 导航方法 ===
void navigateToHistoryPage() {
Get.toNamed('/history');
}
void navigateToAppFunSettings() {
Get.toNamed('/app-fun-settings');
}
void navigateToUserPlanPage() {
Get.toNamed('/user-plan');
}
void navigateToOfflineDataPage() {
Get.toNamed('/offline-data');
}
void navigateToPermissionPage() {
Get.toNamed('/permission');
}
void navigateToAppDataPage() {
Get.toNamed('/app-data');
}
void navigateToPrivacyPage() {
Get.toNamed('/privacy');
}
void navigateToLearnUsPage() {
Get.toNamed('/learn-us');
}
void navigateToAppInfoPage() {
Get.toNamed('/app-info');
}
void navigateToAppDiyPage() {
Get.toNamed('/app-diy');
}
void navigateToVotePage() {
Get.toNamed('/vote');
}
void navigateToPoetryLevelPage() {
Get.toNamed('/poetry-level');
}
void navigateToEntirePage() {
Get.toNamed('/entire');
}
void navigateToManuscriptPage() {
Get.toNamed('/manuscript');
}
// === 显示提示 ===
void showSnackBar(String message) {
Get.snackbar('提示', message);
}
}