Commit e55bbdf3e9c2e15793aadb445e46b0db70c336d2
1 parent
20345cbf
fixed: aliyun oss private->public read
fixed: login refresh user info
Showing
7 changed files
with
80 additions
and
33 deletions
lib/app/splash_page.dart
| @@ -9,6 +9,7 @@ import 'package:limiting_direction_csx/limiting_direction_csx.dart'; | @@ -9,6 +9,7 @@ import 'package:limiting_direction_csx/limiting_direction_csx.dart'; | ||
| 9 | import 'package:wow_english/common/core/user_util.dart'; | 9 | import 'package:wow_english/common/core/user_util.dart'; |
| 10 | 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'; | 11 | import 'package:wow_english/common/request/config.dart'; |
| 12 | +import 'package:wow_english/common/request/dao/user_dao.dart'; | ||
| 12 | import 'package:wow_english/models/user_entity.dart'; | 13 | import 'package:wow_english/models/user_entity.dart'; |
| 13 | import 'package:wow_english/route/route.dart'; | 14 | import 'package:wow_english/route/route.dart'; |
| 14 | import 'package:wow_english/utils/log_util.dart'; | 15 | import 'package:wow_english/utils/log_util.dart'; |
| @@ -38,23 +39,30 @@ class _TransitionViewState extends State<TransitionView> { | @@ -38,23 +39,30 @@ class _TransitionViewState extends State<TransitionView> { | ||
| 38 | UserEntity? userEntity = UserUtil.getUser(); | 39 | UserEntity? userEntity = UserUtil.getUser(); |
| 39 | Log.d('当前模式:kDebugMode=$kDebugMode, kProfileMode=$kProfileMode, kReleaseMode=$kReleaseMode'); | 40 | Log.d('当前模式:kDebugMode=$kDebugMode, kProfileMode=$kProfileMode, kReleaseMode=$kReleaseMode'); |
| 40 | Log.d('当前API地址:${RequestConfig.baseUrl}'); | 41 | Log.d('当前API地址:${RequestConfig.baseUrl}'); |
| 41 | - if (kDebugMode) { | ||
| 42 | - Log.d('Splash读本地userEntity: $userEntity'); | ||
| 43 | - } | 42 | + //BuildContext context = Navigator.of(context).context; |
| 43 | + //var currentPageName = ModalRoute.of(Navigator.of(AppRouter.context))?.settings.name; | ||
| 44 | + //Log.d('Splash读当前页面:$currentPageName'); | ||
| 45 | + Log.d('Splash读本地, userEntity: $userEntity'); | ||
| 44 | int apartInMilliseconds = 0; | 46 | int apartInMilliseconds = 0; |
| 45 | // 调一下接口判断一下有效性再往下 | 47 | // 调一下接口判断一下有效性再往下 |
| 46 | if (userEntity != null) { | 48 | if (userEntity != null) { |
| 49 | + String token = userEntity.token; | ||
| 47 | DateTime startTime = DateTime.now(); | 50 | DateTime startTime = DateTime.now(); |
| 48 | - // try { | ||
| 49 | - // userEntity = await UserDao.getUserInfo(); | ||
| 50 | - // UserUtil.saveUser(userEntity); | ||
| 51 | - // } catch (e) { | ||
| 52 | - // e.logE(); | ||
| 53 | - // } | 51 | + try { |
| 52 | + userEntity = await UserDao.getUserInfo(); | ||
| 53 | + Log.d('Splash在线更新, userEntity: $userEntity'); | ||
| 54 | + if (userEntity != null) { | ||
| 55 | + userEntity.token = token; | ||
| 56 | + Log.d('Splash重设token, userEntity: $userEntity'); | ||
| 57 | + UserUtil.saveUser(userEntity); | ||
| 58 | + } | ||
| 59 | + } catch (e) { | ||
| 60 | + e.logE(); | ||
| 61 | + } | ||
| 54 | apartInMilliseconds = DateTime.now().difference(startTime).inMilliseconds; | 62 | apartInMilliseconds = DateTime.now().difference(startTime).inMilliseconds; |
| 55 | } | 63 | } |
| 56 | - Log.d('Splash getUserInfo 耗时:${apartInMilliseconds}ms'); | ||
| 57 | int duration = max(2000 - apartInMilliseconds, 0); | 64 | int duration = max(2000 - apartInMilliseconds, 0); |
| 65 | + Log.d('Splash getUserInfo 耗时:${apartInMilliseconds}ms, 最终duration=$duration'); | ||
| 58 | Timer(Duration(milliseconds: duration), () { | 66 | Timer(Duration(milliseconds: duration), () { |
| 59 | /*if (userEntity != null) { | 67 | /*if (userEntity != null) { |
| 60 | pushNamedAndRemoveUntil(AppRouteName.home, (route) => false); | 68 | pushNamedAndRemoveUntil(AppRouteName.home, (route) => false); |
lib/common/core/user_util.dart
| @@ -2,6 +2,7 @@ import 'dart:convert'; | @@ -2,6 +2,7 @@ import 'dart:convert'; | ||
| 2 | 2 | ||
| 3 | import 'package:flutter/foundation.dart'; | 3 | import 'package:flutter/foundation.dart'; |
| 4 | import 'package:flutter/material.dart'; | 4 | import 'package:flutter/material.dart'; |
| 5 | +import 'package:flutter/widgets.dart'; | ||
| 5 | import 'package:wow_english/common/core/sp_const.dart'; | 6 | import 'package:wow_english/common/core/sp_const.dart'; |
| 6 | import 'package:wow_english/models/user_entity.dart'; | 7 | import 'package:wow_english/models/user_entity.dart'; |
| 7 | import 'package:wow_english/route/route.dart'; | 8 | import 'package:wow_english/route/route.dart'; |
| @@ -55,6 +56,12 @@ class UserUtil { | @@ -55,6 +56,12 @@ class UserUtil { | ||
| 55 | 56 | ||
| 56 | static void logout() { | 57 | static void logout() { |
| 57 | _clearUserData(); | 58 | _clearUserData(); |
| 59 | + // 判断下不在Splash页就跳转 | ||
| 60 | + /*var currentPageName = ModalRoute.of(AppRouter.context)?.settings.name; | ||
| 61 | + Log.d('当前页面:$currentPageName'); | ||
| 62 | + if (currentPageName != AppRouteName.splash) { | ||
| 63 | + Navigator.of(AppRouter.context).pushNamedAndRemoveUntil(AppRouteName.login, (route) => false); | ||
| 64 | + }*/ | ||
| 58 | Navigator.of(AppRouter.context).pushNamedAndRemoveUntil(AppRouteName.login, (route) => false); | 65 | Navigator.of(AppRouter.context).pushNamedAndRemoveUntil(AppRouteName.login, (route) => false); |
| 59 | } | 66 | } |
| 60 | } | 67 | } |
lib/common/request/basic_config.dart
lib/common/request/request_client.dart
| @@ -3,6 +3,7 @@ import 'dart:convert'; | @@ -3,6 +3,7 @@ import 'dart:convert'; | ||
| 3 | import 'package:dio/dio.dart'; | 3 | import 'package:dio/dio.dart'; |
| 4 | import 'package:flutter/foundation.dart'; | 4 | import 'package:flutter/foundation.dart'; |
| 5 | import 'package:pretty_dio_logger/pretty_dio_logger.dart'; | 5 | import 'package:pretty_dio_logger/pretty_dio_logger.dart'; |
| 6 | +import 'package:wow_english/utils/toast_util.dart'; | ||
| 6 | 7 | ||
| 7 | import '../core/user_util.dart'; | 8 | import '../core/user_util.dart'; |
| 8 | import 'api_response/api_response_entity.dart'; | 9 | import 'api_response/api_response_entity.dart'; |
| @@ -49,6 +50,7 @@ class RequestClient { | @@ -49,6 +50,7 @@ class RequestClient { | ||
| 49 | } catch (e) { | 50 | } catch (e) { |
| 50 | print("e type=${e.runtimeType}"); | 51 | print("e type=${e.runtimeType}"); |
| 51 | if (e is ApiException && e.code == 405) { | 52 | if (e is ApiException && e.code == 405) { |
| 53 | + showToast('登录已失效,请重新登录!', duration: const Duration(seconds: 3)); | ||
| 52 | UserUtil.logout(); | 54 | UserUtil.logout(); |
| 53 | return null; | 55 | return null; |
| 54 | } | 56 | } |
lib/models/user_entity.dart
| @@ -56,4 +56,29 @@ class UserEntity { | @@ -56,4 +56,29 @@ class UserEntity { | ||
| 56 | ? '男' | 56 | ? '男' |
| 57 | : '女'; | 57 | : '女'; |
| 58 | } | 58 | } |
| 59 | + | ||
| 60 | + UserEntity copyWith({ | ||
| 61 | + int? id, | ||
| 62 | + String? name, | ||
| 63 | + String? token, | ||
| 64 | + int? age, | ||
| 65 | + int? gender, | ||
| 66 | + String? avatarUrl, | ||
| 67 | + String? phoneNum, | ||
| 68 | + int? fillUserInfo, | ||
| 69 | + int? nowCourseModuleId, | ||
| 70 | + String? effectiveDate, | ||
| 71 | + }) { | ||
| 72 | + return UserEntity() | ||
| 73 | + ..id = id ?? this.id | ||
| 74 | + ..name = name ?? this.name | ||
| 75 | + ..token = token ?? this.token | ||
| 76 | + ..age = age ?? this.age | ||
| 77 | + ..gender = gender ?? this.gender | ||
| 78 | + ..avatarUrl = avatarUrl ?? this.avatarUrl | ||
| 79 | + ..phoneNum = phoneNum ?? this.phoneNum | ||
| 80 | + ..fillUserInfo = fillUserInfo ?? this.fillUserInfo | ||
| 81 | + ..nowCourseModuleId = nowCourseModuleId ?? this.nowCourseModuleId | ||
| 82 | + ..effectiveDate = effectiveDate ?? this.effectiveDate; | ||
| 83 | + } | ||
| 59 | } | 84 | } |
lib/route/route.dart
| @@ -43,6 +43,7 @@ class AppRouteName { | @@ -43,6 +43,7 @@ class AppRouteName { | ||
| 43 | 43 | ||
| 44 | /// 用户详细信息页 | 44 | /// 用户详细信息页 |
| 45 | static const String userInformation = 'userInformation'; | 45 | static const String userInformation = 'userInformation'; |
| 46 | + | ||
| 46 | /// 修改用户头像 | 47 | /// 修改用户头像 |
| 47 | static const String userAvatar = 'userAvatar'; | 48 | static const String userAvatar = 'userAvatar'; |
| 48 | 49 | ||
| @@ -50,12 +51,13 @@ class AppRouteName { | @@ -50,12 +51,13 @@ class AppRouteName { | ||
| 50 | //static const String userModifyInformation = 'userModifyInformation'; | 51 | //static const String userModifyInformation = 'userModifyInformation'; |
| 51 | ///看视频 | 52 | ///看视频 |
| 52 | static const String lookVideo = 'lookVideo'; | 53 | static const String lookVideo = 'lookVideo'; |
| 54 | + | ||
| 53 | ///绘本 | 55 | ///绘本 |
| 54 | static const String reading = 'reading'; | 56 | static const String reading = 'reading'; |
| 57 | + | ||
| 55 | ///视频跟读详情 | 58 | ///视频跟读详情 |
| 56 | static const String readAfterContent = 'readAfterContent'; | 59 | static const String readAfterContent = 'readAfterContent'; |
| 57 | 60 | ||
| 58 | - | ||
| 59 | static const String tab = '/'; | 61 | static const String tab = '/'; |
| 60 | } | 62 | } |
| 61 | 63 | ||
| @@ -82,8 +84,8 @@ class AppRouter { | @@ -82,8 +84,8 @@ class AppRouter { | ||
| 82 | } | 84 | } |
| 83 | return CupertinoPageRoute( | 85 | return CupertinoPageRoute( |
| 84 | builder: (_) => HomePage( | 86 | builder: (_) => HomePage( |
| 85 | - moduleId: moduleId, | ||
| 86 | - )); | 87 | + moduleId: moduleId, |
| 88 | + )); | ||
| 87 | case AppRouteName.fogPwd: | 89 | case AppRouteName.fogPwd: |
| 88 | return CupertinoPageRoute(builder: (_) => const ForgetPasswordHomePage()); | 90 | return CupertinoPageRoute(builder: (_) => const ForgetPasswordHomePage()); |
| 89 | case AppRouteName.lesson: | 91 | case AppRouteName.lesson: |
| @@ -105,11 +107,14 @@ class AppRouter { | @@ -105,11 +107,14 @@ class AppRouter { | ||
| 105 | case AppRouteName.userAvatar: | 107 | case AppRouteName.userAvatar: |
| 106 | var pageType = 0; | 108 | var pageType = 0; |
| 107 | if (settings.arguments != null) { | 109 | if (settings.arguments != null) { |
| 108 | - final content = (settings.arguments as Map)['pageType'] as String??'0'; | 110 | + final content = (settings.arguments as Map)['pageType'] as String ?? '0'; |
| 109 | pageType = int.parse(content); | 111 | pageType = int.parse(content); |
| 110 | } | 112 | } |
| 111 | - return CupertinoPageRoute(builder: (_) => ModifyUserAvatarPage(pageType: pageType,)); | ||
| 112 | - /*case AppRouteName.userModifyInformation: | 113 | + return CupertinoPageRoute( |
| 114 | + builder: (_) => ModifyUserAvatarPage( | ||
| 115 | + pageType: pageType, | ||
| 116 | + )); | ||
| 117 | + /*case AppRouteName.userModifyInformation: | ||
| 113 | return CupertinoPageRoute(builder: (_) { | 118 | return CupertinoPageRoute(builder: (_) { |
| 114 | ModifyUserInformationType argument = ModifyUserInformationType.name; | 119 | ModifyUserInformationType argument = ModifyUserInformationType.name; |
| 115 | if (settings.arguments != null) { | 120 | if (settings.arguments != null) { |
| @@ -120,18 +125,18 @@ class AppRouter { | @@ -120,18 +125,18 @@ class AppRouter { | ||
| 120 | case AppRouteName.topicPic: | 125 | case AppRouteName.topicPic: |
| 121 | var courseLessonId = ''; | 126 | var courseLessonId = ''; |
| 122 | if (settings.arguments != null) { | 127 | if (settings.arguments != null) { |
| 123 | - courseLessonId = (settings.arguments as Map)['courseLessonId'] as String??''; | 128 | + courseLessonId = (settings.arguments as Map)['courseLessonId'] as String ?? ''; |
| 124 | } | 129 | } |
| 125 | - return CupertinoPageRoute(builder: (_) => TopicPicturePage(courseLessonId: courseLessonId)); | 130 | + return CupertinoPageRoute(builder: (_) => TopicPicturePage(courseLessonId: courseLessonId)); |
| 126 | case AppRouteName.lookVideo: | 131 | case AppRouteName.lookVideo: |
| 127 | final videoUrl = (settings.arguments as Map)['videoUrl'] as String; | 132 | final videoUrl = (settings.arguments as Map)['videoUrl'] as String; |
| 128 | final title = (settings.arguments as Map)['title'] as String?; | 133 | final title = (settings.arguments as Map)['title'] as String?; |
| 129 | return CupertinoPageRoute( | 134 | return CupertinoPageRoute( |
| 130 | builder: (_) => LookVideoPage( | 135 | builder: (_) => LookVideoPage( |
| 131 | - videoUrl: videoUrl, | ||
| 132 | - typeTitle: title, | ||
| 133 | - )); | ||
| 134 | - /*case AppRouteName.setPwd: | 136 | + videoUrl: videoUrl, |
| 137 | + typeTitle: title, | ||
| 138 | + )); | ||
| 139 | + /*case AppRouteName.setPwd: | ||
| 135 | case AppRouteName.setPwd: | 140 | case AppRouteName.setPwd: |
| 136 | phoneNum: phoneNum, | 141 | phoneNum: phoneNum, |
| 137 | smsCode: smsCode, | 142 | smsCode: smsCode, |
| @@ -142,16 +147,15 @@ class AppRouter { | @@ -142,16 +147,15 @@ class AppRouter { | ||
| 142 | final webViewTitle = (settings.arguments as Map)['webViewTitle'] as String; | 147 | final webViewTitle = (settings.arguments as Map)['webViewTitle'] as String; |
| 143 | return CupertinoPageRoute( | 148 | return CupertinoPageRoute( |
| 144 | builder: (_) => WowWebViewPage( | 149 | builder: (_) => WowWebViewPage( |
| 145 | - urlStr: urlStr, | ||
| 146 | - webViewTitle: webViewTitle, | ||
| 147 | - )); | 150 | + urlStr: urlStr, |
| 151 | + webViewTitle: webViewTitle, | ||
| 152 | + )); | ||
| 148 | case AppRouteName.readAfterContent: | 153 | case AppRouteName.readAfterContent: |
| 149 | var videoFollowReadId = ''; | 154 | var videoFollowReadId = ''; |
| 150 | if (settings.arguments != null) { | 155 | if (settings.arguments != null) { |
| 151 | - videoFollowReadId = (settings.arguments as Map)['videoFollowReadId'] as String??''; | 156 | + videoFollowReadId = (settings.arguments as Map)['videoFollowReadId'] as String ?? ''; |
| 152 | } | 157 | } |
| 153 | - return CupertinoPageRoute( | ||
| 154 | - builder: (_) => RepeatAfterContentPage(videoFollowReadId:videoFollowReadId)); | 158 | + return CupertinoPageRoute(builder: (_) => RepeatAfterContentPage(videoFollowReadId: videoFollowReadId)); |
| 155 | case AppRouteName.tab: | 159 | case AppRouteName.tab: |
| 156 | return PageRouteBuilder( | 160 | return PageRouteBuilder( |
| 157 | opaque: false, | 161 | opaque: false, |
| @@ -162,7 +166,7 @@ class AppRouter { | @@ -162,7 +166,7 @@ class AppRouter { | ||
| 162 | case AppRouteName.reading: | 166 | case AppRouteName.reading: |
| 163 | var courseLessonId = ''; | 167 | var courseLessonId = ''; |
| 164 | if (settings.arguments != null) { | 168 | if (settings.arguments != null) { |
| 165 | - courseLessonId = (settings.arguments as Map)['courseLessonId'] as String??''; | 169 | + courseLessonId = (settings.arguments as Map)['courseLessonId'] as String ?? ''; |
| 166 | } | 170 | } |
| 167 | return CupertinoPageRoute(builder: (_) => ReadingPage(courseLessonId: courseLessonId)); | 171 | return CupertinoPageRoute(builder: (_) => ReadingPage(courseLessonId: courseLessonId)); |
| 168 | default: | 172 | default: |
| @@ -173,11 +177,11 @@ class AppRouter { | @@ -173,11 +177,11 @@ class AppRouter { | ||
| 173 | } | 177 | } |
| 174 | 178 | ||
| 175 | void pushNamed(String routeName, {Object? arguments}) { | 179 | void pushNamed(String routeName, {Object? arguments}) { |
| 176 | - Navigator.of(AppRouter.context).pushNamed(routeName,arguments: arguments); | 180 | + Navigator.of(AppRouter.context).pushNamed(routeName, arguments: arguments); |
| 177 | } | 181 | } |
| 178 | 182 | ||
| 179 | -void pushNamedAndRemoveUntil(String routeName,RoutePredicate predicate, {Object? arguments}) { | ||
| 180 | - Navigator.of(AppRouter.context).pushNamedAndRemoveUntil(routeName, predicate,arguments: arguments); | 183 | +void pushNamedAndRemoveUntil(String routeName, RoutePredicate predicate, {Object? arguments}) { |
| 184 | + Navigator.of(AppRouter.context).pushNamedAndRemoveUntil(routeName, predicate, arguments: arguments); | ||
| 181 | } | 185 | } |
| 182 | 186 | ||
| 183 | void popPage() { | 187 | void popPage() { |
lib/utils/aliyun_oss_util.dart
| @@ -37,7 +37,7 @@ class AliyunOssUtil { | @@ -37,7 +37,7 @@ class AliyunOssUtil { | ||
| 37 | onReceiveProgress: (count, total) { | 37 | onReceiveProgress: (count, total) { |
| 38 | Log.d("receive: count = $count, and total = $total"); | 38 | Log.d("receive: count = $count, and total = $total"); |
| 39 | }, | 39 | }, |
| 40 | - aclModel: AclMode.private, | 40 | + aclModel: AclMode.publicRead, |
| 41 | callback: Callback( | 41 | callback: Callback( |
| 42 | callbackUrl: stsEntity.callbackParam.callbackUrl, | 42 | callbackUrl: stsEntity.callbackParam.callbackUrl, |
| 43 | callbackBody: stsEntity.callbackParam.callbackBody, | 43 | callbackBody: stsEntity.callbackParam.callbackBody, |