From 990fb90428eb3630f1e2716300828a34f2ffc0fe Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Mon, 24 Nov 2025 20:43:24 +0800 Subject: [PATCH] =?UTF-8?q?feat(usage):=20=E6=B7=BB=E5=8A=A0AI=E8=81=8A?= =?UTF-8?q?=E5=A4=A9=E7=A7=AF=E5=88=86=E7=BB=9F=E8=AE=A1=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增AI聊天积分统计视图、控制器及相关绑定配置 在底部导航栏添加AI聊天入口 实现积分数据显示及刷新功能 --- lib/modules/usage/bindings/usage_binding.dart | 13 ++-- .../controllers/aichat_stats_controller.dart | 10 +++ .../usage/controllers/usage_controller.dart | 2 + .../usage/views/aichat_stats_view.dart | 74 +++++++++++++++++++ lib/modules/usage/views/usage_view.dart | 8 +- 5 files changed, 100 insertions(+), 7 deletions(-) create mode 100644 lib/modules/usage/controllers/aichat_stats_controller.dart create mode 100644 lib/modules/usage/views/aichat_stats_view.dart diff --git a/lib/modules/usage/bindings/usage_binding.dart b/lib/modules/usage/bindings/usage_binding.dart index 1d3145df9..e03af7554 100644 --- a/lib/modules/usage/bindings/usage_binding.dart +++ b/lib/modules/usage/bindings/usage_binding.dart @@ -2,6 +2,7 @@ import 'package:get/get.dart'; import '../controllers/usage_controller.dart'; import '../controllers/meeting_stats_controller.dart'; import '../controllers/translation_stats_controller.dart'; +import '../controllers/aichat_stats_controller.dart'; import '../../../data/services/usage_stats_service.dart'; class UsageBinding implements Bindings { @@ -10,11 +11,13 @@ class UsageBinding implements Bindings { if (!Get.isRegistered()) { Get.put(UsageStatsService(), permanent: true); } - if (!Get.isRegistered()) { - Get.lazyPut(() => TranslationStatsController()); - } - Get.lazyPut(() => MeetingStatsController()); + Get.lazyPut(() => UsageController()); + + Get.lazyPut(() => AiChatStatsController()); + + Get.lazyPut(() => TranslationStatsController()); + + Get.lazyPut(() => MeetingStatsController()); } } - diff --git a/lib/modules/usage/controllers/aichat_stats_controller.dart b/lib/modules/usage/controllers/aichat_stats_controller.dart new file mode 100644 index 000000000..efc285a6c --- /dev/null +++ b/lib/modules/usage/controllers/aichat_stats_controller.dart @@ -0,0 +1,10 @@ +import 'package:get/get.dart'; +import '../../../data/models/user_Info.dart'; + +class AiChatStatsController extends GetxController { + final isLoading = false.obs; + + int get currentIntegral => User.instance.aichatintegral; + int get totalIntegral => User.instance.aichattotalintegral; +} + diff --git a/lib/modules/usage/controllers/usage_controller.dart b/lib/modules/usage/controllers/usage_controller.dart index bf2c5a4be..d8ecbbecd 100644 --- a/lib/modules/usage/controllers/usage_controller.dart +++ b/lib/modules/usage/controllers/usage_controller.dart @@ -2,12 +2,14 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; import '../views/translation_stats_view.dart'; import '../views/meeting_stats_view.dart'; +import '../views/aichat_stats_view.dart'; class UsageController extends GetxController { late PageController pageController; final RxInt pageIndex = 0.obs; final List pageList = const [ + AiChatStatsView(), TranslationStatsView(), MeetingStatsView(), ]; diff --git a/lib/modules/usage/views/aichat_stats_view.dart b/lib/modules/usage/views/aichat_stats_view.dart new file mode 100644 index 000000000..584ce5ee1 --- /dev/null +++ b/lib/modules/usage/views/aichat_stats_view.dart @@ -0,0 +1,74 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; +import '../../../core/theme/app_colors.dart'; +import '../controllers/aichat_stats_controller.dart'; +import '../../../data/models/user_Info.dart'; + +class AiChatStatsView extends GetView { + const AiChatStatsView({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + final isDarkMode = Theme.of(context).brightness == Brightness.dark; + + return Scaffold( + backgroundColor: isDarkMode ? AppColors.darkBackground : Colors.grey[50], + appBar: _buildAppBar(isDarkMode), + body: _buildBody(isDarkMode), + ); + } + + PreferredSizeWidget _buildAppBar(bool isDarkMode) { + return AppBar( + leading: IconButton( + icon: Icon(Icons.arrow_back_ios, color: isDarkMode ? Colors.white : Colors.black, size: 20.sp), + onPressed: () => Get.back(), + ), + backgroundColor: isDarkMode ? AppColors.darkBackground : Colors.white, + elevation: 0.5, + title: Text( + 'AI聊天', + style: TextStyle(fontSize: 17.sp, fontWeight: FontWeight.w600, color: isDarkMode ? Colors.white : Colors.black), + ), + centerTitle: true, + ); + } + + Widget _buildBody(bool isDarkMode) { + return Obx(() { + final _ = User.refreshTick.value; + final u = User.instance; + return Padding( + padding: EdgeInsets.all(16.w), + child: Container( + padding: EdgeInsets.all(16.w), + decoration: BoxDecoration( + color: isDarkMode ? AppColors.cardBackground : Colors.white, + borderRadius: BorderRadius.circular(12.r), + boxShadow: [ + BoxShadow(color: Colors.black.withValues(alpha: 0.05), blurRadius: 10, offset: const Offset(0, 2)), + ], + ), + child: Row( + children: [ + Icon(Icons.chat_bubble_outline, color: AppColors.primary, size: 20.sp), + SizedBox(width: 8.w), + Expanded( + child: Text( + 'AI聊天积分', + style: TextStyle(fontSize: 16.sp, fontWeight: FontWeight.w600, color: isDarkMode ? Colors.white : Colors.black), + ), + ), + Text( + '${u.aichatintegral}/${u.aichattotalintegral}', + style: TextStyle(fontSize: 16.sp, fontWeight: FontWeight.w600, color: isDarkMode ? Colors.white : Colors.black), + ), + ], + ), + ), + ); + }); + } +} + diff --git a/lib/modules/usage/views/usage_view.dart b/lib/modules/usage/views/usage_view.dart index efa1b02e8..393884869 100644 --- a/lib/modules/usage/views/usage_view.dart +++ b/lib/modules/usage/views/usage_view.dart @@ -21,6 +21,10 @@ class UsageView extends GetView { bottomNavigationBar: Obx( () => BottomNavigationBar( items: [ + BottomNavigationBarItem( + icon: const Icon(Icons.chat_bubble_outline), + label: 'AI聊天', + ), BottomNavigationBarItem( icon: const Icon(Icons.translate), label: 'interpretation'.tr, @@ -32,7 +36,8 @@ class UsageView extends GetView { ], backgroundColor: isDarkMode ? Colors.black : const Color(0xFFF9FAFB), currentIndex: controller.pageIndex.value, - unselectedItemColor: isDarkMode ? Colors.grey[500] : const Color(0xFF6B7280), + unselectedItemColor: + isDarkMode ? Colors.grey[500] : const Color(0xFF6B7280), selectedItemColor: const Color(0xFF3B82F6), unselectedFontSize: 10.sp, selectedFontSize: 10.sp, @@ -47,4 +52,3 @@ class UsageView extends GetView { ); } } -