| 
									
										
										
										
											2025-08-19 11:06:16 +08:00
										 |  |  |  | import 'dart:convert'; | 
					
						
							| 
									
										
										
										
											2025-09-15 15:54:03 +08:00
										 |  |  |  | import 'dart:io'; | 
					
						
							| 
									
										
										
										
											2025-08-19 11:06:16 +08:00
										 |  |  |  | import 'package:encrypt/encrypt.dart' as encrypt; | 
					
						
							| 
									
										
										
										
											2025-09-09 20:08:10 +08:00
										 |  |  |  | import 'package:flutter/src/widgets/framework.dart'; | 
					
						
							| 
									
										
										
										
											2025-08-19 11:06:16 +08:00
										 |  |  |  | import 'package:pointycastle/asymmetric/api.dart' show RSAPublicKey; | 
					
						
							| 
									
										
										
										
											2025-09-08 17:53:44 +08:00
										 |  |  |  | import 'package:qhd_prevention/pages/mine/mine_set_pwd_page.dart'; | 
					
						
							| 
									
										
										
										
											2025-08-19 11:06:16 +08:00
										 |  |  |  | import 'package:qhd_prevention/tools/tools.dart'; | 
					
						
							|  |  |  |  | import 'package:shared_preferences/shared_preferences.dart'; | 
					
						
							|  |  |  |  | import 'package:fluttertoast/fluttertoast.dart'; | 
					
						
							| 
									
										
										
										
											2025-09-15 15:54:03 +08:00
										 |  |  |  | import 'package:permission_handler/permission_handler.dart'; | 
					
						
							| 
									
										
										
										
											2025-08-19 11:06:16 +08:00
										 |  |  |  | import '../http/ApiService.dart'; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | class AuthService { | 
					
						
							|  |  |  |  |   static const _keyUser = 'USER'; | 
					
						
							|  |  |  |  |   static const _keyRemember = 'remember'; | 
					
						
							|  |  |  |  |   static const _keyIsLoggedIn = 'isLoggedIn'; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |   /// 登录
 | 
					
						
							| 
									
										
										
										
											2025-09-09 20:08:10 +08:00
										 |  |  |  |   static Future<Map<String, dynamic>> login(String username, String password) async { | 
					
						
							| 
									
										
										
										
											2025-08-19 11:06:16 +08:00
										 |  |  |  |     final parser = encrypt.RSAKeyParser(); | 
					
						
							|  |  |  |  |     final pub = parser.parse(ApiService.publicKey) as RSAPublicKey; | 
					
						
							|  |  |  |  |     final encrypter = encrypt.Encrypter(encrypt.RSA(publicKey: pub)); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     final plain = 'zcloudchina$username,zy,$password'; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     String encrypted; | 
					
						
							|  |  |  |  |     try { | 
					
						
							|  |  |  |  |       encrypted = encrypter.encrypt(plain).base64; | 
					
						
							|  |  |  |  |     } catch (e) { | 
					
						
							|  |  |  |  |       Fluttertoast.showToast(msg: '加密失败:$e'); | 
					
						
							| 
									
										
										
										
											2025-09-09 20:08:10 +08:00
										 |  |  |  |       return {} ; | 
					
						
							|  |  |  |  |       // return false;
 | 
					
						
							| 
									
										
										
										
											2025-08-19 11:06:16 +08:00
										 |  |  |  |     } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     final data = await ApiService.loginCheck(encrypted); | 
					
						
							|  |  |  |  |     final result = data['result'] as String? ?? ''; | 
					
						
							|  |  |  |  |     if (result != 'success') { | 
					
						
							| 
									
										
										
										
											2025-08-29 09:52:48 +08:00
										 |  |  |  |       Fluttertoast.showToast(msg: data['msg'] ?? ''); | 
					
						
							| 
									
										
										
										
											2025-09-09 20:08:10 +08:00
										 |  |  |  |       return data; | 
					
						
							|  |  |  |  |       // return false;
 | 
					
						
							| 
									
										
										
										
											2025-08-19 11:06:16 +08:00
										 |  |  |  |     } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-09-09 20:08:10 +08:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-09-08 17:53:44 +08:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-08-19 11:06:16 +08:00
										 |  |  |  |     final prefs = await SharedPreferences.getInstance(); | 
					
						
							|  |  |  |  |     await prefs.setString(_keyUser, json.encode(data)); | 
					
						
							|  |  |  |  |     await prefs.setStringList(_keyRemember, [username, password]); | 
					
						
							|  |  |  |  |     await prefs.setBool(_keyIsLoggedIn, true); | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     SessionService.instance | 
					
						
							|  |  |  |  |       ..setLoginUserId(data['USER_ID'] as String) | 
					
						
							|  |  |  |  |       ..setCorpinfoId(data['CORPINFO_ID'] as String) | 
					
						
							|  |  |  |  |       ..setDeptId(data['DEPARTMENT_ID'] as String) | 
					
						
							|  |  |  |  |       ..setDeptLevel(data['DEPARTMENT_LEVEL'] as String) | 
					
						
							|  |  |  |  |       ..setIsRest(data['ISREST'] as String) | 
					
						
							|  |  |  |  |       ..setUsername(data['NAME'] as String) | 
					
						
							|  |  |  |  |       ..setLoginUser(data); | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-09-09 20:08:10 +08:00
										 |  |  |  |     return data; | 
					
						
							|  |  |  |  |     // return true;
 | 
					
						
							| 
									
										
										
										
											2025-08-19 11:06:16 +08:00
										 |  |  |  |   } | 
					
						
							|  |  |  |  |   /// 检查更新
 | 
					
						
							|  |  |  |  |   static Future<Map<String, dynamic>> checkUpdate() async { | 
					
						
							|  |  |  |  |     final data = await ApiService.getUpdateInfo(); | 
					
						
							|  |  |  |  |     final result = data['result'] as String? ?? ''; | 
					
						
							|  |  |  |  |     if (result == 'success') { | 
					
						
							|  |  |  |  |       return data; | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  |     return {}; | 
					
						
							|  |  |  |  |   } | 
					
						
							| 
									
										
										
										
											2025-09-15 15:54:03 +08:00
										 |  |  |  |   // 检查并请求相机权限
 | 
					
						
							|  |  |  |  |   static Future<bool> checkCameraPermission() async { | 
					
						
							|  |  |  |  |     final status = await Permission.camera.status; | 
					
						
							|  |  |  |  |     if (status.isDenied) { | 
					
						
							|  |  |  |  |       final result = await Permission.camera.request(); | 
					
						
							|  |  |  |  |       return result.isGranted; | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  |     return status.isGranted; | 
					
						
							|  |  |  |  |   } | 
					
						
							| 
									
										
										
										
											2025-08-19 11:06:16 +08:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-09-15 15:54:03 +08:00
										 |  |  |  | // 检查并请求照片库权限(iOS)和存储权限(Android)
 | 
					
						
							|  |  |  |  |   static Future<bool> checkPhotoLibraryPermission() async { | 
					
						
							|  |  |  |  |     if (Platform.isIOS) { | 
					
						
							|  |  |  |  |       final status = await Permission.photos.status; | 
					
						
							|  |  |  |  |       if (status.isDenied) { | 
					
						
							|  |  |  |  |         final result = await Permission.photos.request(); | 
					
						
							|  |  |  |  |         return result.isGranted; | 
					
						
							|  |  |  |  |       } | 
					
						
							|  |  |  |  |       return status.isGranted; | 
					
						
							|  |  |  |  |     } else { | 
					
						
							|  |  |  |  |       final status = await Permission.storage.status; | 
					
						
							|  |  |  |  |       if (status.isDenied) { | 
					
						
							|  |  |  |  |         final result = await Permission.storage.request(); | 
					
						
							|  |  |  |  |         return result.isGranted; | 
					
						
							|  |  |  |  |       } | 
					
						
							|  |  |  |  |       return status.isGranted; | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  |   } | 
					
						
							| 
									
										
										
										
											2025-08-19 11:06:16 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |   /// 验证是否已登录(通过重新登录)
 | 
					
						
							| 
									
										
										
										
											2025-09-09 20:08:10 +08:00
										 |  |  |  |   static Future<Map<String, dynamic>> isLoggedIn() async { | 
					
						
							| 
									
										
										
										
											2025-08-19 11:06:16 +08:00
										 |  |  |  |     final prefs = await SharedPreferences.getInstance(); | 
					
						
							|  |  |  |  |     final isLocalLoggedIn = prefs.getBool(_keyIsLoggedIn) ?? false; | 
					
						
							| 
									
										
										
										
											2025-09-09 20:08:10 +08:00
										 |  |  |  |     if (!isLocalLoggedIn) return {}; | 
					
						
							| 
									
										
										
										
											2025-08-19 11:06:16 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |     final remember = prefs.getStringList(_keyRemember); | 
					
						
							| 
									
										
										
										
											2025-09-09 20:08:10 +08:00
										 |  |  |  |     if (remember == null || remember.length < 2) return {}; | 
					
						
							| 
									
										
										
										
											2025-08-19 11:06:16 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |     final username = remember[0]; | 
					
						
							|  |  |  |  |     final password = remember[1]; | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     // 用存储的账号密码重新登录
 | 
					
						
							| 
									
										
										
										
											2025-09-09 20:08:10 +08:00
										 |  |  |  |     final data = await login(username, password); | 
					
						
							|  |  |  |  |     if (data.isEmpty||data['result']!= 'success') { | 
					
						
							| 
									
										
										
										
											2025-08-19 11:06:16 +08:00
										 |  |  |  |       await logout(); | 
					
						
							| 
									
										
										
										
											2025-09-09 20:08:10 +08:00
										 |  |  |  |       return data; | 
					
						
							| 
									
										
										
										
											2025-08-19 11:06:16 +08:00
										 |  |  |  |     } | 
					
						
							| 
									
										
										
										
											2025-09-09 20:08:10 +08:00
										 |  |  |  |     return data; | 
					
						
							| 
									
										
										
										
											2025-08-19 11:06:16 +08:00
										 |  |  |  |   } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |   /// 获取已保存的用户信息
 | 
					
						
							|  |  |  |  |   static Future<Map<String, dynamic>?> getUser() async { | 
					
						
							|  |  |  |  |     final prefs = await SharedPreferences.getInstance(); | 
					
						
							|  |  |  |  |     final jsonStr = prefs.getString(_keyUser); | 
					
						
							|  |  |  |  |     if (jsonStr == null) return null; | 
					
						
							|  |  |  |  |     return json.decode(jsonStr); | 
					
						
							|  |  |  |  |   } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |   /// 登出
 | 
					
						
							|  |  |  |  |   static Future<void> logout() async { | 
					
						
							|  |  |  |  |     final prefs = await SharedPreferences.getInstance(); | 
					
						
							|  |  |  |  |     await prefs.remove(_keyUser); | 
					
						
							|  |  |  |  |     await prefs.remove(_keyRemember); | 
					
						
							|  |  |  |  |     await prefs.setBool(_keyIsLoggedIn, false); | 
					
						
							|  |  |  |  |   } | 
					
						
							|  |  |  |  | } |