Commit a4d8eaa2176819ff86c6929727eeb4c6d7c5ecbe
1 parent
fc75f209
feat: 登录时账户有效性校验
Showing
14 changed files
with
86 additions
and
25 deletions
android/app/src/main/AndroidManifest.xml
| 1 | 1 | <manifest xmlns:tools="http://schemas.android.com/tools" |
| 2 | 2 | xmlns:android="http://schemas.android.com/apk/res/android"> |
| 3 | 3 | <application |
| 4 | - android:label="wow_english" | |
| 4 | + android:label="Wow English" | |
| 5 | 5 | android:name="${applicationName}" |
| 6 | 6 | android:icon="@mipmap/ic_launcher" |
| 7 | 7 | android:usesCleartextTraffic="true"> | ... | ... |
android/app/src/main/res/mipmap-hdpi/ic_launcher.png
android/app/src/main/res/mipmap-mdpi/ic_launcher.png deleted
442 Bytes
android/app/src/main/res/mipmap-xhdpi/ic_launcher.png deleted
721 Bytes
android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
lib/app/splash_page.dart
| 1 | 1 | import 'dart:async'; |
| 2 | 2 | import 'dart:io'; |
| 3 | +import 'dart:math'; | |
| 3 | 4 | |
| 4 | 5 | import 'package:flutter/foundation.dart'; |
| 5 | 6 | import 'package:flutter/material.dart'; |
| 7 | +import 'package:flutter/services.dart'; | |
| 8 | +import 'package:limiting_direction_csx/limiting_direction_csx.dart'; | |
| 6 | 9 | import 'package:wow_english/common/core/user_util.dart'; |
| 7 | 10 | import 'package:wow_english/common/extension/string_extension.dart'; |
| 11 | +import 'package:wow_english/common/request/config.dart'; | |
| 12 | +import 'package:wow_english/common/request/dao/user_dao.dart'; | |
| 8 | 13 | import 'package:wow_english/models/user_entity.dart'; |
| 9 | 14 | import 'package:wow_english/route/route.dart'; |
| 15 | +import 'package:wow_english/utils/log_util.dart'; | |
| 10 | 16 | import 'package:wow_english/utils/sp_util.dart'; |
| 11 | -import 'package:flutter/services.dart'; | |
| 12 | -import 'package:limiting_direction_csx/limiting_direction_csx.dart'; | |
| 13 | 17 | |
| 14 | 18 | class SplashPage extends StatelessWidget { |
| 15 | 19 | const SplashPage({super.key}); |
| ... | ... | @@ -33,12 +37,27 @@ class _TransitionViewState extends State<TransitionView> { |
| 33 | 37 | Future startTime() async { |
| 34 | 38 | // 判断是否登录 |
| 35 | 39 | UserEntity? userEntity = UserUtil.getUser(); |
| 40 | + Log.d('当前模式:kDebugMode=$kDebugMode, kProfileMode=$kProfileMode, kReleaseMode=$kReleaseMode'); | |
| 41 | + Log.d('当前API地址:${RequestConfig.baseUrl}'); | |
| 36 | 42 | if (kDebugMode) { |
| 37 | - print('Splash读本地userEntity: $userEntity'); | |
| 43 | + Log.d('Splash读本地userEntity: $userEntity'); | |
| 44 | + } | |
| 45 | + int apartInMilliseconds = 0; | |
| 46 | + // 调一下接口判断一下有效性再往下 | |
| 47 | + if (userEntity != null) { | |
| 48 | + DateTime startTime = DateTime.now(); | |
| 49 | + try { | |
| 50 | + userEntity = await UserDao.getUserInfo(); | |
| 51 | + UserUtil.saveUser(userEntity); | |
| 52 | + } catch (e) { | |
| 53 | + e.logE(); | |
| 54 | + } | |
| 55 | + apartInMilliseconds = DateTime.now().difference(startTime).inMilliseconds; | |
| 38 | 56 | } |
| 39 | - Timer(const Duration(seconds: 2), () { | |
| 57 | + Log.d('Splash getUserInfo 耗时:${apartInMilliseconds}ms'); | |
| 58 | + int duration = max(2000 - apartInMilliseconds, 0); | |
| 59 | + Timer(Duration(milliseconds: duration), () { | |
| 40 | 60 | if (userEntity != null) { |
| 41 | - // todo 调一下接口判断一下有效性再往下 | |
| 42 | 61 | pushNamedAndRemoveUntil(AppRouteName.home, (route) => false); |
| 43 | 62 | } else { |
| 44 | 63 | pushNamedAndRemoveUntil(AppRouteName.login, (route) => false); |
| ... | ... | @@ -64,7 +83,7 @@ class _TransitionViewState extends State<TransitionView> { |
| 64 | 83 | if (Platform.isIOS) { |
| 65 | 84 | await LimitingDirectionCsx.setScreenDirection(DeviceDirectionMask.Landscape); |
| 66 | 85 | } else { |
| 67 | - await SystemChrome.setPreferredOrientations([DeviceOrientation.landscapeLeft,DeviceOrientation.landscapeRight]); | |
| 86 | + await SystemChrome.setPreferredOrientations([DeviceOrientation.landscapeLeft, DeviceOrientation.landscapeRight]); | |
| 68 | 87 | } |
| 69 | 88 | } |
| 70 | 89 | ... | ... |
lib/common/core/user_util.dart
| ... | ... | @@ -12,7 +12,11 @@ class UserUtil { |
| 12 | 12 | |
| 13 | 13 | static String get token => _userEntity?.token ?? ''; |
| 14 | 14 | |
| 15 | - static void saveUser(UserEntity user) { | |
| 15 | + static void saveUser(UserEntity? user) { | |
| 16 | + if (user == null) { | |
| 17 | + _clearUserData(); | |
| 18 | + return; | |
| 19 | + } | |
| 16 | 20 | _userEntity = user; |
| 17 | 21 | _saveUserJson(user.toString()); |
| 18 | 22 | } | ... | ... |
lib/common/request/apis.dart
| ... | ... | @@ -2,8 +2,8 @@ part of 'request_client.dart'; |
| 2 | 2 | |
| 3 | 3 | class Apis { |
| 4 | 4 | /// app初始化配置信息 |
| 5 | - // GET /system/app/config | |
| 6 | - // 接口地址:https://app.apifox.com/link/project/2684751/apis/api-89897678 | |
| 5 | + /// GET /system/app/config | |
| 6 | + /// 接口地址:https://app.apifox.com/link/project/2684751/apis/api-89897678 | |
| 7 | 7 | static const String appConfig = 'system/app/config'; |
| 8 | 8 | |
| 9 | 9 | /// 登录 |
| ... | ... | @@ -12,7 +12,11 @@ class Apis { |
| 12 | 12 | /// 登出 |
| 13 | 13 | static const String logout = 'logout'; |
| 14 | 14 | |
| 15 | + /// 注销账号 | |
| 16 | + static const String deleteAccount = 'logout'; | |
| 17 | + | |
| 15 | 18 | /// 获取用户信息 |
| 19 | + /// get | |
| 16 | 20 | static const String getUserInfo = 'student/info'; |
| 17 | 21 | |
| 18 | 22 | /// 更新用户信息 |
| ... | ... | @@ -62,4 +66,8 @@ class Apis { |
| 62 | 66 | /// 获取课程内容 |
| 63 | 67 | /// GET |
| 64 | 68 | static const String process = '/course/process'; |
| 69 | + | |
| 70 | + /// 首页弹窗 | |
| 71 | + /// get | |
| 72 | + static const String homePopup = 'home/popup'; | |
| 65 | 73 | } | ... | ... |
lib/common/request/dao/user_dao.dart
| ... | ... | @@ -23,7 +23,13 @@ class UserDao { |
| 23 | 23 | /// 登出 |
| 24 | 24 | static Future logout() async { |
| 25 | 25 | var result = await requestClient.post(Apis.logout); |
| 26 | - print('logout result=$result'); | |
| 26 | + UserUtil.logout(); | |
| 27 | + return result; | |
| 28 | + } | |
| 29 | + | |
| 30 | + /// 注销账号 | |
| 31 | + static Future deleteAccount() async { | |
| 32 | + var result = await requestClient.post(Apis.deleteAccount); | |
| 27 | 33 | UserUtil.logout(); |
| 28 | 34 | return result; |
| 29 | 35 | } |
| ... | ... | @@ -69,7 +75,7 @@ class UserDao { |
| 69 | 75 | |
| 70 | 76 | /// 获取用户信息 |
| 71 | 77 | static Future<UserEntity?> getUserInfo() async { |
| 72 | - return await requestClient.post(Apis.getUserInfo); | |
| 78 | + return await requestClient.get(Apis.getUserInfo); | |
| 73 | 79 | } |
| 74 | 80 | |
| 75 | 81 | /// 更新用户信息,返回即成功,无body | ... | ... |
lib/pages/user/bloc/user_bloc.dart
| ... | ... | @@ -15,6 +15,7 @@ class UserBloc extends Bloc<UserEvent, UserState> { |
| 15 | 15 | |
| 16 | 16 | UserBloc() : super(UserInitial()) { |
| 17 | 17 | on<UserLogout>(_logout); |
| 18 | + on<UserDelete>(_deleteAccount); | |
| 18 | 19 | on<UserUpdate>(_updateUser); |
| 19 | 20 | on<UserUIUpdate>(_updateUIUser); |
| 20 | 21 | } |
| ... | ... | @@ -23,6 +24,10 @@ class UserBloc extends Bloc<UserEvent, UserState> { |
| 23 | 24 | await UserDao.logout(); |
| 24 | 25 | } |
| 25 | 26 | |
| 27 | + void _deleteAccount(UserDelete event, Emitter<UserState> emitter) async { | |
| 28 | + await UserDao.deleteAccount(); | |
| 29 | + } | |
| 30 | + | |
| 26 | 31 | void _updateUIUser(UserUIUpdate event, Emitter<UserState> emitter) async { |
| 27 | 32 | emitter(UserInfoUpdated()); |
| 28 | 33 | } | ... | ... |
lib/pages/user/bloc/user_event.dart
| ... | ... | @@ -4,8 +4,12 @@ sealed class UserEvent {} |
| 4 | 4 | |
| 5 | 5 | class UserStarted extends UserEvent {} |
| 6 | 6 | |
| 7 | +/// 退出账号 | |
| 7 | 8 | class UserLogout extends UserEvent {} |
| 8 | 9 | |
| 10 | +/// 注销账号 | |
| 11 | +class UserDelete extends UserEvent {} | |
| 12 | + | |
| 9 | 13 | class UserUpdate extends UserEvent { |
| 10 | 14 | final ModifyUserInformationType type; |
| 11 | 15 | ... | ... |
lib/pages/user/user_page.dart
| ... | ... | @@ -189,6 +189,17 @@ class _UserView extends StatelessWidget { |
| 189 | 189 | fontSize: 17.sp, |
| 190 | 190 | ), |
| 191 | 191 | )), |
| 192 | + 30.verticalSpace, | |
| 193 | + TextButton( | |
| 194 | + onPressed: () => userBloc.add(UserDelete()), | |
| 195 | + child: Text( | |
| 196 | + "注销账号", | |
| 197 | + style: TextStyle( | |
| 198 | + //fontWeight: FontWeight.w600, | |
| 199 | + color: Colors.red, | |
| 200 | + fontSize: 15.sp, | |
| 201 | + ), | |
| 202 | + )), | |
| 192 | 203 | ], |
| 193 | 204 | ), |
| 194 | 205 | )); | ... | ... |
lib/utils/log_util.dart
| ... | ... | @@ -4,51 +4,55 @@ class Log { |
| 4 | 4 | static LogLevel level = LogLevel.debug; |
| 5 | 5 | |
| 6 | 6 | /// debug |
| 7 | - static void d(String message) { | |
| 7 | + static void d(Object? object) { | |
| 8 | 8 | if (level.index <= LogLevel.debug.index) { |
| 9 | - print(message); | |
| 9 | + String line = "$object"; | |
| 10 | + print(line); | |
| 10 | 11 | } |
| 11 | 12 | } |
| 12 | 13 | |
| 13 | 14 | /// info |
| 14 | - static void i(String message) { | |
| 15 | + static void i(Object? object) { | |
| 15 | 16 | if (level.index <= LogLevel.info.index) { |
| 16 | - print(message); | |
| 17 | + String line = "$object"; | |
| 18 | + print(line); | |
| 17 | 19 | } |
| 18 | 20 | } |
| 19 | 21 | |
| 20 | 22 | /// warning |
| 21 | - static void w(String message) { | |
| 23 | + static void w(Object? object) { | |
| 22 | 24 | if (level.index <= LogLevel.warning.index) { |
| 23 | - print(message); | |
| 25 | + String line = "$object"; | |
| 26 | + print(line); | |
| 24 | 27 | } |
| 25 | 28 | } |
| 26 | 29 | |
| 27 | 30 | /// error |
| 28 | - static void e(String message) { | |
| 31 | + static void e(Object? object) { | |
| 29 | 32 | if (level.index <= LogLevel.error.index) { |
| 30 | - print(message); | |
| 33 | + String line = "$object"; | |
| 34 | + print(line); | |
| 31 | 35 | } |
| 32 | 36 | } |
| 33 | 37 | } |
| 34 | 38 | |
| 35 | -extension LogExtension on String { | |
| 36 | - String logD() { | |
| 39 | +extension LogExtension on Object? { | |
| 40 | + Object? logD() { | |
| 37 | 41 | Log.d(this); |
| 38 | 42 | return this; |
| 39 | 43 | } |
| 40 | 44 | |
| 41 | - String logI() { | |
| 45 | + Object? logI() { | |
| 42 | 46 | Log.i(this); |
| 43 | 47 | return this; |
| 44 | 48 | } |
| 45 | 49 | |
| 46 | - String logW() { | |
| 50 | + Object? logW() { | |
| 47 | 51 | Log.w(this); |
| 48 | 52 | return this; |
| 49 | 53 | } |
| 50 | 54 | |
| 51 | - String logE() { | |
| 55 | + Object? logE() { | |
| 52 | 56 | Log.e(this); |
| 53 | 57 | return this; |
| 54 | 58 | } | ... | ... |