|
|
@@ -1,14 +1,13 @@
|
|
|
-import 'package:chicken_farm/core/services/offline_storage_service.dart';
|
|
|
-import 'package:chicken_farm/core/services/sync_service.dart';
|
|
|
-import 'package:chicken_farm/core/utils/storage.dart';
|
|
|
-import 'package:chicken_farm/core/utils/toast.dart';
|
|
|
import 'package:chicken_farm/stores/auth_store.dart';
|
|
|
-import 'package:chicken_farm/stores/config_store.dart';
|
|
|
-import 'package:chicken_farm/stores/dict_stroe.dart';
|
|
|
import 'package:flutter/material.dart';
|
|
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|
|
-import 'package:chicken_farm/core/services/connectivity_service.dart';
|
|
|
-import 'package:chicken_farm/pages/account/config_dialog.dart';
|
|
|
+import 'package:chicken_farm/pages/home/_profile/user_info_card.dart';
|
|
|
+import 'package:chicken_farm/pages/home/_profile/upload_data_button.dart';
|
|
|
+import 'package:chicken_farm/pages/home/_profile/clear_cache_button.dart';
|
|
|
+import 'package:chicken_farm/pages/home/_profile/config_button.dart';
|
|
|
+import 'package:chicken_farm/pages/home/_profile/rfid_config_button.dart';
|
|
|
+// import 'package:chicken_farm/pages/home/_profile/scanner_light_button.dart';
|
|
|
+import 'package:chicken_farm/pages/home/_profile/logout_button.dart';
|
|
|
|
|
|
class ProfilePage extends ConsumerWidget {
|
|
|
const ProfilePage({super.key});
|
|
|
@@ -16,7 +15,6 @@ class ProfilePage extends ConsumerWidget {
|
|
|
@override
|
|
|
Widget build(BuildContext context, WidgetRef ref) {
|
|
|
final authState = ref.watch(authStoreProvider);
|
|
|
- final authStore = ref.read(authStoreProvider.notifier);
|
|
|
|
|
|
return Scaffold(
|
|
|
body: Padding(
|
|
|
@@ -32,191 +30,23 @@ class ProfilePage extends ConsumerWidget {
|
|
|
child: Column(
|
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
|
children: [
|
|
|
- Card(
|
|
|
- child: Padding(
|
|
|
- padding: const EdgeInsets.all(16.0),
|
|
|
- child: Column(
|
|
|
- crossAxisAlignment: CrossAxisAlignment.start,
|
|
|
- children: [
|
|
|
- ListTile(
|
|
|
- leading: const CircleAvatar(
|
|
|
- radius: 30,
|
|
|
- child: Icon(Icons.person, size: 30),
|
|
|
- ),
|
|
|
- title: Text(
|
|
|
- authState.user!.nickName ?? '未设置昵称',
|
|
|
- style: const TextStyle(
|
|
|
- fontSize: 20,
|
|
|
- fontWeight: FontWeight.bold,
|
|
|
- ),
|
|
|
- ),
|
|
|
- subtitle: Text(
|
|
|
- '用户名: ${authState.user!.userName}',
|
|
|
- ),
|
|
|
- ),
|
|
|
- const Divider(),
|
|
|
- const Text(
|
|
|
- '基本信息',
|
|
|
- style: TextStyle(fontWeight: FontWeight.bold),
|
|
|
- ),
|
|
|
- const SizedBox(height: 10),
|
|
|
- _buildInfoRow(
|
|
|
- '手机号码',
|
|
|
- authState.user!.phonenumber ?? '未填写',
|
|
|
- ),
|
|
|
- _buildInfoRow(
|
|
|
- '邮箱地址',
|
|
|
- authState.user!.email ?? '未填写',
|
|
|
- ),
|
|
|
- _buildInfoRow(
|
|
|
- '部门',
|
|
|
- authState.user!.orgName ?? '未分配',
|
|
|
- ),
|
|
|
- _buildInfoRow(
|
|
|
- '角色',
|
|
|
- (authState.user!.roles
|
|
|
- ?.map((r) => r.roleName)
|
|
|
- .join(', ')) ??
|
|
|
- '未分配',
|
|
|
- ),
|
|
|
- ],
|
|
|
- ),
|
|
|
- ),
|
|
|
- ),
|
|
|
+ UserInfoCard(user: authState.user!),
|
|
|
const SizedBox(height: 20),
|
|
|
- // 显示待上传数据数量的按钮
|
|
|
- FutureBuilder<List<OfflineOperation>>(
|
|
|
- future: OfflineStorageService().getPendingOperations(),
|
|
|
- builder: (context, snapshot) {
|
|
|
- if (snapshot.connectionState ==
|
|
|
- ConnectionState.done &&
|
|
|
- snapshot.hasData) {
|
|
|
- final pendingCount = snapshot.data!.length;
|
|
|
- return SizedBox(
|
|
|
- width: double.infinity,
|
|
|
- child: ElevatedButton.icon(
|
|
|
- onPressed: pendingCount > 0
|
|
|
- ? () async {
|
|
|
- ToastUtil.show(
|
|
|
- '正在上传 $pendingCount 条数据...',
|
|
|
- );
|
|
|
- final syncService = SyncService();
|
|
|
- await syncService
|
|
|
- .syncPendingOperations();
|
|
|
- ToastUtil.success('数据上传完成');
|
|
|
- // 刷新按钮状态
|
|
|
- (context as Element).markNeedsBuild();
|
|
|
- }
|
|
|
- : null, // 禁用按钮
|
|
|
- icon: const Icon(Icons.upload),
|
|
|
- label: Text('上传数据 ($pendingCount条待上传)'),
|
|
|
- style: ElevatedButton.styleFrom(
|
|
|
- padding: const EdgeInsets.symmetric(
|
|
|
- horizontal: 30,
|
|
|
- vertical: 15,
|
|
|
- ),
|
|
|
- textStyle: const TextStyle(fontSize: 16),
|
|
|
- ),
|
|
|
- ),
|
|
|
- );
|
|
|
- }
|
|
|
- return const SizedBox(
|
|
|
- width: double.infinity,
|
|
|
- child: Center(child: CircularProgressIndicator()),
|
|
|
- );
|
|
|
- },
|
|
|
- ),
|
|
|
+ const UploadDataButton(),
|
|
|
const SizedBox(height: 20),
|
|
|
- SizedBox(
|
|
|
- width: double.infinity,
|
|
|
- child: ElevatedButton.icon(
|
|
|
- onPressed: () {
|
|
|
- ToastUtil.confirm('确定要清除所有缓存吗?', () async {
|
|
|
- await StorageUtils.removeWithPrefix("vb_");
|
|
|
- ConfigStore().clearAll();
|
|
|
- DictStore().clearAll();
|
|
|
- if (context.mounted) {
|
|
|
- ToastUtil.success('缓存已清除');
|
|
|
- }
|
|
|
- });
|
|
|
- },
|
|
|
- icon: const Icon(Icons.cleaning_services),
|
|
|
- label: const Text('清除缓存'),
|
|
|
- style: ElevatedButton.styleFrom(
|
|
|
- padding: const EdgeInsets.symmetric(
|
|
|
- horizontal: 30,
|
|
|
- vertical: 15,
|
|
|
- ),
|
|
|
- textStyle: const TextStyle(fontSize: 16),
|
|
|
- ),
|
|
|
- ),
|
|
|
- ),
|
|
|
+ const ClearCacheButton(),
|
|
|
const SizedBox(height: 20),
|
|
|
- SizedBox(
|
|
|
- width: double.infinity,
|
|
|
- child: ElevatedButton.icon(
|
|
|
- onPressed: () async {
|
|
|
- final result = await showDialog(
|
|
|
- context: context,
|
|
|
- builder: (context) => const ConfigDialog(),
|
|
|
- );
|
|
|
- // 如果配置发生了变化,显示提示
|
|
|
- if (result == true && context.mounted) {
|
|
|
- ToastUtil.success('配置已保存');
|
|
|
- }
|
|
|
- },
|
|
|
- icon: const Icon(Icons.settings),
|
|
|
- label: const Text('服务配置'),
|
|
|
- style: ElevatedButton.styleFrom(
|
|
|
- padding: const EdgeInsets.symmetric(
|
|
|
- horizontal: 30,
|
|
|
- vertical: 15,
|
|
|
- ),
|
|
|
- textStyle: const TextStyle(fontSize: 16),
|
|
|
- ),
|
|
|
- ),
|
|
|
- ),
|
|
|
+ const ConfigButton(),
|
|
|
+ const SizedBox(height: 20),
|
|
|
+ const RfidConfigButton(),
|
|
|
+ const SizedBox(height: 20),
|
|
|
+ // const ScannerLightButton(),
|
|
|
+ // const SizedBox(height: 20),
|
|
|
+ const LogoutButton(),
|
|
|
],
|
|
|
),
|
|
|
),
|
|
|
),
|
|
|
- // 网络状态感知的退出登录按钮
|
|
|
- Consumer(
|
|
|
- builder: (context, ref, child) {
|
|
|
- final isConnectedAsync = ref.watch(isConnectedProvider);
|
|
|
- return SizedBox(
|
|
|
- width: double.infinity,
|
|
|
- child: ElevatedButton.icon(
|
|
|
- onPressed: isConnectedAsync.when(
|
|
|
- data: (isConnected) {
|
|
|
- // 在线状态下允许退出登录,离线状态下禁用
|
|
|
- return isConnected
|
|
|
- ? () {
|
|
|
- ToastUtil.confirm(
|
|
|
- '确定要退出登录吗?',
|
|
|
- () => authStore.logout(),
|
|
|
- );
|
|
|
- }
|
|
|
- : null;
|
|
|
- },
|
|
|
- loading: () => null,
|
|
|
- error: (_, _) => null,
|
|
|
- ),
|
|
|
- icon: const Icon(Icons.logout),
|
|
|
- label: const Text('退出登录'),
|
|
|
- style: ElevatedButton.styleFrom(
|
|
|
- // 保持背景色不变,只改变文字颜色为红色
|
|
|
- foregroundColor: Colors.red,
|
|
|
- padding: const EdgeInsets.symmetric(
|
|
|
- horizontal: 30,
|
|
|
- vertical: 15,
|
|
|
- ),
|
|
|
- textStyle: const TextStyle(fontSize: 16),
|
|
|
- ),
|
|
|
- ),
|
|
|
- );
|
|
|
- },
|
|
|
- ),
|
|
|
] else ...[
|
|
|
const Center(child: Text('加载中...')),
|
|
|
],
|
|
|
@@ -225,22 +55,4 @@ class ProfilePage extends ConsumerWidget {
|
|
|
),
|
|
|
);
|
|
|
}
|
|
|
-
|
|
|
- Widget _buildInfoRow(String label, String value) {
|
|
|
- return Padding(
|
|
|
- padding: const EdgeInsets.symmetric(vertical: 4.0),
|
|
|
- child: Row(
|
|
|
- children: [
|
|
|
- SizedBox(
|
|
|
- width: 80,
|
|
|
- child: Text(
|
|
|
- '$label:',
|
|
|
- style: const TextStyle(fontWeight: FontWeight.w500),
|
|
|
- ),
|
|
|
- ),
|
|
|
- Expanded(child: Text(value)),
|
|
|
- ],
|
|
|
- ),
|
|
|
- );
|
|
|
- }
|
|
|
}
|