Commit a4d8eaa2176819ff86c6929727eeb4c6d7c5ecbe
1 parent
fc75f209
feat: 登录时账户有效性校验
Showing
14 changed files
with
86 additions
and
25 deletions
android/app/src/main/AndroidManifest.xml
1 | <manifest xmlns:tools="http://schemas.android.com/tools" | 1 | <manifest xmlns:tools="http://schemas.android.com/tools" |
2 | xmlns:android="http://schemas.android.com/apk/res/android"> | 2 | xmlns:android="http://schemas.android.com/apk/res/android"> |
3 | <application | 3 | <application |
4 | - android:label="wow_english" | 4 | + android:label="Wow English" |
5 | android:name="${applicationName}" | 5 | android:name="${applicationName}" |
6 | android:icon="@mipmap/ic_launcher" | 6 | android:icon="@mipmap/ic_launcher" |
7 | android:usesCleartextTraffic="true"> | 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 | import 'dart:async'; | 1 | import 'dart:async'; |
2 | import 'dart:io'; | 2 | import 'dart:io'; |
3 | +import 'dart:math'; | ||
3 | 4 | ||
4 | import 'package:flutter/foundation.dart'; | 5 | import 'package:flutter/foundation.dart'; |
5 | import 'package:flutter/material.dart'; | 6 | import 'package:flutter/material.dart'; |
7 | +import 'package:flutter/services.dart'; | ||
8 | +import 'package:limiting_direction_csx/limiting_direction_csx.dart'; | ||
6 | import 'package:wow_english/common/core/user_util.dart'; | 9 | import 'package:wow_english/common/core/user_util.dart'; |
7 | import 'package:wow_english/common/extension/string_extension.dart'; | 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 | import 'package:wow_english/models/user_entity.dart'; | 13 | import 'package:wow_english/models/user_entity.dart'; |
9 | import 'package:wow_english/route/route.dart'; | 14 | import 'package:wow_english/route/route.dart'; |
15 | +import 'package:wow_english/utils/log_util.dart'; | ||
10 | import 'package:wow_english/utils/sp_util.dart'; | 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 | class SplashPage extends StatelessWidget { | 18 | class SplashPage extends StatelessWidget { |
15 | const SplashPage({super.key}); | 19 | const SplashPage({super.key}); |
@@ -33,12 +37,27 @@ class _TransitionViewState extends State<TransitionView> { | @@ -33,12 +37,27 @@ class _TransitionViewState extends State<TransitionView> { | ||
33 | Future startTime() async { | 37 | Future startTime() async { |
34 | // 判断是否登录 | 38 | // 判断是否登录 |
35 | UserEntity? userEntity = UserUtil.getUser(); | 39 | UserEntity? userEntity = UserUtil.getUser(); |
40 | + Log.d('当前模式:kDebugMode=$kDebugMode, kProfileMode=$kProfileMode, kReleaseMode=$kReleaseMode'); | ||
41 | + Log.d('当前API地址:${RequestConfig.baseUrl}'); | ||
36 | if (kDebugMode) { | 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 | if (userEntity != null) { | 60 | if (userEntity != null) { |
41 | - // todo 调一下接口判断一下有效性再往下 | ||
42 | pushNamedAndRemoveUntil(AppRouteName.home, (route) => false); | 61 | pushNamedAndRemoveUntil(AppRouteName.home, (route) => false); |
43 | } else { | 62 | } else { |
44 | pushNamedAndRemoveUntil(AppRouteName.login, (route) => false); | 63 | pushNamedAndRemoveUntil(AppRouteName.login, (route) => false); |
@@ -64,7 +83,7 @@ class _TransitionViewState extends State<TransitionView> { | @@ -64,7 +83,7 @@ class _TransitionViewState extends State<TransitionView> { | ||
64 | if (Platform.isIOS) { | 83 | if (Platform.isIOS) { |
65 | await LimitingDirectionCsx.setScreenDirection(DeviceDirectionMask.Landscape); | 84 | await LimitingDirectionCsx.setScreenDirection(DeviceDirectionMask.Landscape); |
66 | } else { | 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,7 +12,11 @@ class UserUtil { | ||
12 | 12 | ||
13 | static String get token => _userEntity?.token ?? ''; | 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 | _userEntity = user; | 20 | _userEntity = user; |
17 | _saveUserJson(user.toString()); | 21 | _saveUserJson(user.toString()); |
18 | } | 22 | } |
lib/common/request/apis.dart
@@ -2,8 +2,8 @@ part of 'request_client.dart'; | @@ -2,8 +2,8 @@ part of 'request_client.dart'; | ||
2 | 2 | ||
3 | class Apis { | 3 | class Apis { |
4 | /// app初始化配置信息 | 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 | static const String appConfig = 'system/app/config'; | 7 | static const String appConfig = 'system/app/config'; |
8 | 8 | ||
9 | /// 登录 | 9 | /// 登录 |
@@ -12,7 +12,11 @@ class Apis { | @@ -12,7 +12,11 @@ class Apis { | ||
12 | /// 登出 | 12 | /// 登出 |
13 | static const String logout = 'logout'; | 13 | static const String logout = 'logout'; |
14 | 14 | ||
15 | + /// 注销账号 | ||
16 | + static const String deleteAccount = 'logout'; | ||
17 | + | ||
15 | /// 获取用户信息 | 18 | /// 获取用户信息 |
19 | + /// get | ||
16 | static const String getUserInfo = 'student/info'; | 20 | static const String getUserInfo = 'student/info'; |
17 | 21 | ||
18 | /// 更新用户信息 | 22 | /// 更新用户信息 |
@@ -62,4 +66,8 @@ class Apis { | @@ -62,4 +66,8 @@ class Apis { | ||
62 | /// 获取课程内容 | 66 | /// 获取课程内容 |
63 | /// GET | 67 | /// GET |
64 | static const String process = '/course/process'; | 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,7 +23,13 @@ class UserDao { | ||
23 | /// 登出 | 23 | /// 登出 |
24 | static Future logout() async { | 24 | static Future logout() async { |
25 | var result = await requestClient.post(Apis.logout); | 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 | UserUtil.logout(); | 33 | UserUtil.logout(); |
28 | return result; | 34 | return result; |
29 | } | 35 | } |
@@ -69,7 +75,7 @@ class UserDao { | @@ -69,7 +75,7 @@ class UserDao { | ||
69 | 75 | ||
70 | /// 获取用户信息 | 76 | /// 获取用户信息 |
71 | static Future<UserEntity?> getUserInfo() async { | 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 | /// 更新用户信息,返回即成功,无body | 81 | /// 更新用户信息,返回即成功,无body |
lib/pages/user/bloc/user_bloc.dart
@@ -15,6 +15,7 @@ class UserBloc extends Bloc<UserEvent, UserState> { | @@ -15,6 +15,7 @@ class UserBloc extends Bloc<UserEvent, UserState> { | ||
15 | 15 | ||
16 | UserBloc() : super(UserInitial()) { | 16 | UserBloc() : super(UserInitial()) { |
17 | on<UserLogout>(_logout); | 17 | on<UserLogout>(_logout); |
18 | + on<UserDelete>(_deleteAccount); | ||
18 | on<UserUpdate>(_updateUser); | 19 | on<UserUpdate>(_updateUser); |
19 | on<UserUIUpdate>(_updateUIUser); | 20 | on<UserUIUpdate>(_updateUIUser); |
20 | } | 21 | } |
@@ -23,6 +24,10 @@ class UserBloc extends Bloc<UserEvent, UserState> { | @@ -23,6 +24,10 @@ class UserBloc extends Bloc<UserEvent, UserState> { | ||
23 | await UserDao.logout(); | 24 | await UserDao.logout(); |
24 | } | 25 | } |
25 | 26 | ||
27 | + void _deleteAccount(UserDelete event, Emitter<UserState> emitter) async { | ||
28 | + await UserDao.deleteAccount(); | ||
29 | + } | ||
30 | + | ||
26 | void _updateUIUser(UserUIUpdate event, Emitter<UserState> emitter) async { | 31 | void _updateUIUser(UserUIUpdate event, Emitter<UserState> emitter) async { |
27 | emitter(UserInfoUpdated()); | 32 | emitter(UserInfoUpdated()); |
28 | } | 33 | } |
lib/pages/user/bloc/user_event.dart
@@ -4,8 +4,12 @@ sealed class UserEvent {} | @@ -4,8 +4,12 @@ sealed class UserEvent {} | ||
4 | 4 | ||
5 | class UserStarted extends UserEvent {} | 5 | class UserStarted extends UserEvent {} |
6 | 6 | ||
7 | +/// 退出账号 | ||
7 | class UserLogout extends UserEvent {} | 8 | class UserLogout extends UserEvent {} |
8 | 9 | ||
10 | +/// 注销账号 | ||
11 | +class UserDelete extends UserEvent {} | ||
12 | + | ||
9 | class UserUpdate extends UserEvent { | 13 | class UserUpdate extends UserEvent { |
10 | final ModifyUserInformationType type; | 14 | final ModifyUserInformationType type; |
11 | 15 |
lib/pages/user/user_page.dart
@@ -189,6 +189,17 @@ class _UserView extends StatelessWidget { | @@ -189,6 +189,17 @@ class _UserView extends StatelessWidget { | ||
189 | fontSize: 17.sp, | 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,51 +4,55 @@ class Log { | ||
4 | static LogLevel level = LogLevel.debug; | 4 | static LogLevel level = LogLevel.debug; |
5 | 5 | ||
6 | /// debug | 6 | /// debug |
7 | - static void d(String message) { | 7 | + static void d(Object? object) { |
8 | if (level.index <= LogLevel.debug.index) { | 8 | if (level.index <= LogLevel.debug.index) { |
9 | - print(message); | 9 | + String line = "$object"; |
10 | + print(line); | ||
10 | } | 11 | } |
11 | } | 12 | } |
12 | 13 | ||
13 | /// info | 14 | /// info |
14 | - static void i(String message) { | 15 | + static void i(Object? object) { |
15 | if (level.index <= LogLevel.info.index) { | 16 | if (level.index <= LogLevel.info.index) { |
16 | - print(message); | 17 | + String line = "$object"; |
18 | + print(line); | ||
17 | } | 19 | } |
18 | } | 20 | } |
19 | 21 | ||
20 | /// warning | 22 | /// warning |
21 | - static void w(String message) { | 23 | + static void w(Object? object) { |
22 | if (level.index <= LogLevel.warning.index) { | 24 | if (level.index <= LogLevel.warning.index) { |
23 | - print(message); | 25 | + String line = "$object"; |
26 | + print(line); | ||
24 | } | 27 | } |
25 | } | 28 | } |
26 | 29 | ||
27 | /// error | 30 | /// error |
28 | - static void e(String message) { | 31 | + static void e(Object? object) { |
29 | if (level.index <= LogLevel.error.index) { | 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 | Log.d(this); | 41 | Log.d(this); |
38 | return this; | 42 | return this; |
39 | } | 43 | } |
40 | 44 | ||
41 | - String logI() { | 45 | + Object? logI() { |
42 | Log.i(this); | 46 | Log.i(this); |
43 | return this; | 47 | return this; |
44 | } | 48 | } |
45 | 49 | ||
46 | - String logW() { | 50 | + Object? logW() { |
47 | Log.w(this); | 51 | Log.w(this); |
48 | return this; | 52 | return this; |
49 | } | 53 | } |
50 | 54 | ||
51 | - String logE() { | 55 | + Object? logE() { |
52 | Log.e(this); | 56 | Log.e(this); |
53 | return this; | 57 | return this; |
54 | } | 58 | } |