Commit 278208b8573ecc4d18c2f4576a8e448c4f7e0a5a
1 parent
578f1729
feat:1、用户访问权限调整;2、添加游戏访问权限
Showing
9 changed files
with
81 additions
and
21 deletions
lib/app/splash_page.dart
| ... | ... | @@ -45,8 +45,8 @@ class _TransitionViewState extends State<TransitionView> { |
| 45 | 45 | Log.d('Splash读本地, userEntity: $userEntity'); |
| 46 | 46 | int apartInMilliseconds = 0; |
| 47 | 47 | // 调一下接口判断一下有效性再往下 |
| 48 | - if (userEntity != null) { | |
| 49 | - String token = userEntity.token; | |
| 48 | + if (userEntity != null && userEntity.token != null) { | |
| 49 | + String token = userEntity.token!; | |
| 50 | 50 | DateTime startTime = DateTime.now(); |
| 51 | 51 | try { |
| 52 | 52 | userEntity = await UserDao.getUserInfo(); | ... | ... |
lib/common/core/user_util.dart
| ... | ... | @@ -11,8 +11,6 @@ import 'package:wow_english/utils/sp_util.dart'; |
| 11 | 11 | class UserUtil { |
| 12 | 12 | static UserEntity? _userEntity; |
| 13 | 13 | |
| 14 | - static String get token => _userEntity?.token ?? ''; | |
| 15 | - | |
| 16 | 14 | static void saveUser(UserEntity? user) { |
| 17 | 15 | if (user == null) { |
| 18 | 16 | _clearUserData(); |
| ... | ... | @@ -64,4 +62,18 @@ class UserUtil { |
| 64 | 62 | }*/ |
| 65 | 63 | Navigator.of(AppRouter.context).pushNamedAndRemoveUntil(AppRouteName.login, (route) => false, arguments: {'showPasswordPage': showPasswordLoginPage}); |
| 66 | 64 | } |
| 65 | + | |
| 66 | + // 是否有游戏权限 | |
| 67 | + static bool hasGamePermission() { | |
| 68 | + return _userEntity?.valid ?? false; | |
| 69 | + } | |
| 70 | + | |
| 71 | + // 是否登录(token是否有效) | |
| 72 | + static bool isLogined() { | |
| 73 | + return getUserToken().isNotEmpty; | |
| 74 | + } | |
| 75 | + | |
| 76 | + static String getUserToken() { | |
| 77 | + return _userEntity?.token ?? ''; | |
| 78 | + } | |
| 67 | 79 | } | ... | ... |
lib/common/request/dao/user_dao.dart
| ... | ... | @@ -16,6 +16,12 @@ class UserDao { |
| 16 | 16 | ); |
| 17 | 17 | if (data != null) { |
| 18 | 18 | UserUtil.saveUser(data); |
| 19 | + // 由于userInfo接口不会返回token,所以这里需要再次保存一下token | |
| 20 | + final token = data.token; | |
| 21 | + //登录成功后zip一下getUserInfo,因为进入首页需要的信息在userinfo里,保证进入首页数据是最新的 | |
| 22 | + data = await getUserInfo(); | |
| 23 | + data?.token = token; | |
| 24 | + UserUtil.saveUser(data); | |
| 19 | 25 | } |
| 20 | 26 | return data; |
| 21 | 27 | } | ... | ... |
lib/common/request/token_interceptor.dart
| ... | ... | @@ -5,8 +5,8 @@ class TokenInterceptor extends Interceptor { |
| 5 | 5 | @override |
| 6 | 6 | void onRequest(RequestOptions options, RequestInterceptorHandler handler) { |
| 7 | 7 | // 判断token不为空插入, todo token的取法应该跟user在一起,这里取不到user |
| 8 | - if (UserUtil.token.isNotEmpty) { | |
| 9 | - options.headers["Auth-token"] = UserUtil.token; | |
| 8 | + if (UserUtil.isLogined()) { | |
| 9 | + options.headers["Auth-token"] = UserUtil.getUserToken(); | |
| 10 | 10 | } |
| 11 | 11 | options.headers["version"] = '1.0.0'; |
| 12 | 12 | super.onRequest(options, handler); | ... | ... |
lib/generated/json/user_entity.g.dart
| ... | ... | @@ -45,6 +45,14 @@ UserEntity $UserEntityFromJson(Map<String, dynamic> json) { |
| 45 | 45 | if (effectiveDate != null) { |
| 46 | 46 | userEntity.effectiveDate = effectiveDate; |
| 47 | 47 | } |
| 48 | + final int? validDay = jsonConvert.convert<int>(json['validDay']); | |
| 49 | + if (validDay != null) { | |
| 50 | + userEntity.validDay = validDay; | |
| 51 | + } | |
| 52 | + final bool? valid = jsonConvert.convert<bool>(json['valid']); | |
| 53 | + if (valid != null) { | |
| 54 | + userEntity.valid = valid; | |
| 55 | + } | |
| 48 | 56 | return userEntity; |
| 49 | 57 | } |
| 50 | 58 | |
| ... | ... | @@ -60,6 +68,8 @@ Map<String, dynamic> $UserEntityToJson(UserEntity entity) { |
| 60 | 68 | data['fillUserInfo'] = entity.fillUserInfo; |
| 61 | 69 | data['nowCourseModuleId'] = entity.nowCourseModuleId; |
| 62 | 70 | data['effectiveDate'] = entity.effectiveDate; |
| 71 | + data['validDay'] = entity.validDay; | |
| 72 | + data['valid'] = entity.valid; | |
| 63 | 73 | return data; |
| 64 | 74 | } |
| 65 | 75 | |
| ... | ... | @@ -75,6 +85,8 @@ extension UserEntityExtension on UserEntity { |
| 75 | 85 | int? fillUserInfo, |
| 76 | 86 | int? nowCourseModuleId, |
| 77 | 87 | String? effectiveDate, |
| 88 | + int? validDay, | |
| 89 | + bool? valid, | |
| 78 | 90 | }) { |
| 79 | 91 | return UserEntity() |
| 80 | 92 | ..id = id ?? this.id |
| ... | ... | @@ -86,6 +98,8 @@ extension UserEntityExtension on UserEntity { |
| 86 | 98 | ..phoneNum = phoneNum ?? this.phoneNum |
| 87 | 99 | ..fillUserInfo = fillUserInfo ?? this.fillUserInfo |
| 88 | 100 | ..nowCourseModuleId = nowCourseModuleId ?? this.nowCourseModuleId |
| 89 | - ..effectiveDate = effectiveDate ?? this.effectiveDate; | |
| 101 | + ..effectiveDate = effectiveDate ?? this.effectiveDate | |
| 102 | + ..validDay = validDay ?? this.validDay | |
| 103 | + ..valid = valid ?? this.valid; | |
| 90 | 104 | } |
| 91 | 105 | } |
| 92 | 106 | \ No newline at end of file | ... | ... |
lib/models/user_entity.dart
| ... | ... | @@ -9,7 +9,7 @@ class UserEntity { |
| 9 | 9 | late String name; |
| 10 | 10 | |
| 11 | 11 | /// 一定有也必须要有 |
| 12 | - late String token; | |
| 12 | + String? token; | |
| 13 | 13 | |
| 14 | 14 | //late int expireTime; |
| 15 | 15 | |
| ... | ... | @@ -29,6 +29,12 @@ class UserEntity { |
| 29 | 29 | /// 有效时间,VIP,为null没有 |
| 30 | 30 | String? effectiveDate; |
| 31 | 31 | |
| 32 | + /// 有效天数 | |
| 33 | + int? validDay; | |
| 34 | + | |
| 35 | + /// 游戏权限 | |
| 36 | + bool? valid; | |
| 37 | + | |
| 32 | 38 | UserEntity(); |
| 33 | 39 | |
| 34 | 40 | factory UserEntity.fromJson(Map<String, dynamic> json) => $UserEntityFromJson(json); | ... | ... |
lib/pages/home/home_page.dart
| ... | ... | @@ -33,20 +33,20 @@ class _HomePageView extends StatelessWidget { |
| 33 | 33 | if (type == HeaderActionType.video) { |
| 34 | 34 | pushNamed(AppRouteName.reAfter); |
| 35 | 35 | } else if (type == HeaderActionType.phase) { |
| 36 | - if(UserUtil.token.isEmpty) { | |
| 37 | - pushNamed(AppRouteName.login); | |
| 38 | - } else { | |
| 36 | + if (UserUtil.isLogined()) { | |
| 39 | 37 | pushNamed(AppRouteName.lesson); |
| 38 | + } else { | |
| 39 | + pushNamed(AppRouteName.login); | |
| 40 | 40 | } |
| 41 | 41 | } else if (type == HeaderActionType.listen) { |
| 42 | 42 | pushNamed(AppRouteName.listen); |
| 43 | 43 | } else if (type == HeaderActionType.shop) { |
| 44 | 44 | pushNamed(AppRouteName.shop); |
| 45 | 45 | } else if (type == HeaderActionType.user) { |
| 46 | - if(UserUtil.token.isEmpty) { | |
| 47 | - pushNamed(AppRouteName.login); | |
| 48 | - } else { | |
| 46 | + if (UserUtil.isLogined()) { | |
| 49 | 47 | pushNamed(AppRouteName.user); |
| 48 | + } else { | |
| 49 | + pushNamed(AppRouteName.login); | |
| 50 | 50 | } |
| 51 | 51 | } else { |
| 52 | 52 | |
| ... | ... | @@ -155,7 +155,7 @@ class _HomePageView extends StatelessWidget { |
| 155 | 155 | //彩蛋 |
| 156 | 156 | return GestureDetector( |
| 157 | 157 | onTap: () { |
| 158 | - if(UserUtil.token.isEmpty) { | |
| 158 | + if (!UserUtil.isLogined()) { | |
| 159 | 159 | pushNamed(AppRouteName.login); |
| 160 | 160 | return; |
| 161 | 161 | } |
| ... | ... | @@ -173,7 +173,7 @@ class _HomePageView extends StatelessWidget { |
| 173 | 173 | } else { |
| 174 | 174 | return GestureDetector( |
| 175 | 175 | onTap: () { |
| 176 | - if(UserUtil.token.isEmpty) { | |
| 176 | + if (!UserUtil.isLogined()) { | |
| 177 | 177 | pushNamed(AppRouteName.login); |
| 178 | 178 | return; |
| 179 | 179 | } | ... | ... |
lib/pages/moduleSelect/view.dart
| ... | ... | @@ -4,6 +4,8 @@ import 'package:wow_english/common/extension/string_extension.dart'; |
| 4 | 4 | import 'package:wow_english/pages/moduleSelect/state.dart'; |
| 5 | 5 | import 'package:wow_english/pages/moduleSelect/widgets/BaseHomeHeaderWidget.dart'; |
| 6 | 6 | |
| 7 | +import '../../common/core/user_util.dart'; | |
| 8 | +import '../../common/dialogs/show_dialog.dart'; | |
| 7 | 9 | import 'bloc.dart'; |
| 8 | 10 | import 'event.dart'; |
| 9 | 11 | import 'package:flutter_screenutil/flutter_screenutil.dart'; |
| ... | ... | @@ -47,7 +49,11 @@ class _HomePageView extends StatelessWidget { |
| 47 | 49 | Expanded( |
| 48 | 50 | child: GestureDetector( |
| 49 | 51 | onTap: () { |
| 50 | - pushNamed(AppRouteName.home); | |
| 52 | + if (UserUtil.isLogined()) { | |
| 53 | + pushNamed(AppRouteName.home); | |
| 54 | + } else { | |
| 55 | + pushNamed(AppRouteName.login); | |
| 56 | + } | |
| 51 | 57 | }, |
| 52 | 58 | child: Column( |
| 53 | 59 | mainAxisAlignment: MainAxisAlignment.center, |
| ... | ... | @@ -74,7 +80,23 @@ class _HomePageView extends StatelessWidget { |
| 74 | 80 | Expanded( |
| 75 | 81 | child: GestureDetector( |
| 76 | 82 | onTap: () { |
| 77 | - pushNamed(AppRouteName.games); | |
| 83 | + //如果没登录先登录 | |
| 84 | + if (UserUtil.isLogined()) { | |
| 85 | + if (UserUtil.hasGamePermission()) { | |
| 86 | + pushNamed(AppRouteName.games); | |
| 87 | + } else { | |
| 88 | + showTwoActionDialog( | |
| 89 | + '提示', '忽略', '去续费', | |
| 90 | + '您的课程已到期,请快快续费继续学习吧!', leftTap: () { | |
| 91 | + popPage(); | |
| 92 | + }, rightTap: () { | |
| 93 | + popPage(); | |
| 94 | + pushNamed(AppRouteName.shop); | |
| 95 | + }); | |
| 96 | + } | |
| 97 | + } else { | |
| 98 | + pushNamed(AppRouteName.login); | |
| 99 | + } | |
| 78 | 100 | }, |
| 79 | 101 | child: Column( |
| 80 | 102 | mainAxisAlignment: MainAxisAlignment.center, | ... | ... |
lib/pages/moduleSelect/widgets/BaseHomeHeaderWidget.dart
| ... | ... | @@ -96,9 +96,9 @@ class BaseHomeHeaderWidget extends StatelessWidget { |
| 96 | 96 | } |
| 97 | 97 | |
| 98 | 98 | void onUserClick() { |
| 99 | - if (UserUtil.token.isEmpty) { | |
| 100 | - pushNamed(AppRouteName.login); | |
| 101 | - } else { | |
| 99 | + if (UserUtil.isLogined()) { | |
| 102 | 100 | pushNamed(AppRouteName.user); |
| 101 | + } else { | |
| 102 | + pushNamed(AppRouteName.login); | |
| 103 | 103 | } |
| 104 | 104 | } | ... | ... |