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 | } | ... | ... |