提交 b9e13fce authored 作者: yueweilu's avatar yueweilu

401 处理

上级 d91b6f7c
...@@ -37,6 +37,19 @@ abstract class AccountAPI { ...@@ -37,6 +37,19 @@ abstract class AccountAPI {
return UserModel.fromJson(result.data); return UserModel.fromJson(result.data);
} }
/// 退出登录
static Future logout() async{
print('--------------------------------logout');
final result = await HttpService.to.post(
'/v1/members/login/logout',
params: {}
);
if (result.data is Map && result.data['is_success'] == 1){
return true;
}
return false;
}
/// 发送验证码 /// 发送验证码
static Future sendCode({ static Future sendCode({
required String phone, required String phone,
......
...@@ -2,6 +2,8 @@ library apis; ...@@ -2,6 +2,8 @@ library apis;
import 'dart:io'; import 'dart:io';
import 'package:flutter_book/store/index.dart';
import '../models/user_model.dart'; import '../models/user_model.dart';
import '../services/index.dart'; import '../services/index.dart';
......
...@@ -56,4 +56,15 @@ class CourseController extends GetxController { ...@@ -56,4 +56,15 @@ class CourseController extends GetxController {
} }
} }
void logout(BuildContext context) async {
final result = await AccountAPI.logout();
if (result){
CustomToast.success('退出成功');
await UserStore.to.logout();
if(context.mounted){
context.goNamed(Routes.main);
}
}
}
} }
\ No newline at end of file
...@@ -12,7 +12,9 @@ import 'package:get/get_state_manager/src/simple/get_controllers.dart'; ...@@ -12,7 +12,9 @@ import 'package:get/get_state_manager/src/simple/get_controllers.dart';
import 'package:go_router/go_router.dart'; import 'package:go_router/go_router.dart';
import 'package:ionicons/ionicons.dart'; import 'package:ionicons/ionicons.dart';
import '../../apis/index.dart';
import '../../routes/index.dart'; import '../../routes/index.dart';
import '../../store/index.dart';
import '../../utils/index.dart'; import '../../utils/index.dart';
import '../../widgets/index.dart'; import '../../widgets/index.dart';
import 'package:badges/badges.dart' as badges; import 'package:badges/badges.dart' as badges;
......
...@@ -30,11 +30,12 @@ class _CoursePageState extends State<CoursePage> { ...@@ -30,11 +30,12 @@ class _CoursePageState extends State<CoursePage> {
padding: EdgeInsets.zero, padding: EdgeInsets.zero,
backgroundColor: Colors.transparent, backgroundColor: Colors.transparent,
icon: const Icon(Ionicons.timer), icon: const Icon(Ionicons.timer),
onPressed: () => context.pushNamed(Routes.msgs), // onPressed: () => context.pushNamed(Routes.msgs),
), ),
GestureDetector( GestureDetector(
onTap: (){ onTap: (){
context.pushNamed(Routes.msgs); // context.pushNamed(Routes.msgs);
controller.logout(context);
}, },
child: badges.Badge( child: badges.Badge(
position: badges.BadgePosition.topEnd(top: -5, end: 0), position: badges.BadgePosition.topEnd(top: -5, end: 0),
...@@ -47,7 +48,7 @@ class _CoursePageState extends State<CoursePage> { ...@@ -47,7 +48,7 @@ class _CoursePageState extends State<CoursePage> {
padding: EdgeInsets.zero, padding: EdgeInsets.zero,
backgroundColor: Colors.transparent, backgroundColor: Colors.transparent,
icon: const Icon(Ionicons.notifications), icon: const Icon(Ionicons.notifications),
onPressed: () => context.pushNamed(Routes.msgs), // onPressed: () => context.pushNamed(Routes.msgs),
), ),
), ),
) )
......
...@@ -50,12 +50,12 @@ class _MainPageState extends State<MainPage> with WidgetsBindingObserver{ ...@@ -50,12 +50,12 @@ class _MainPageState extends State<MainPage> with WidgetsBindingObserver{
builder: (controller) => BottomNavigationBar( builder: (controller) => BottomNavigationBar(
currentIndex:controller.currentPage , currentIndex:controller.currentPage ,
onTap: (page){ onTap: (page){
// if (page != 1 && !UserStore.to.isLogin) { if (page != 1 && !UserStore.to.isLogin) {
// context.pushNamed(Routes.login); context.pushNamed(Routes.login);
// } else { } else {
// controller.pageController.jumpToPage(page); controller.pageController.jumpToPage(page);
// } }
controller.pageController.jumpToPage(page); // controller.pageController.jumpToPage(page);
}, },
items: [ items: [
BottomNavigationBarItem( BottomNavigationBarItem(
......
...@@ -24,25 +24,23 @@ class HttpService extends GetxService { ...@@ -24,25 +24,23 @@ class HttpService extends GetxService {
/// 组织 headers 参数 /// 组织 headers 参数
Map<String,dynamic>? _getHeaders({bool excludeToken = false,Map<String,dynamic>? params,String? url}) { Map<String,dynamic>? _getHeaders({bool excludeToken = false,Map<String,dynamic>? params,String? url}) {
final headers = <String, dynamic>{}; final headers = <String, dynamic>{};
headers['appId'] = AppConfig.AppID;
headers['appSecret'] = AppConfig.AppSecret;
headers['timestamp'] = (DateTime.now().millisecondsSinceEpoch~/1000).toString();
headers['url'] = kServerUrl + url.toString();
if (Get.isRegistered<UserStore>() && if (Get.isRegistered<UserStore>() &&
UserStore.to.hasToken && !excludeToken) { UserStore.to.hasToken && !excludeToken) {
// headers['Token'] = UserStore.to.token; // headers['Token'] = UserStore.to.token;
headers['token'] = UserStore.to.token; headers['Authorization'] = UserStore.to.token;
if (params != null) {
params.addAll(headers);
}
headers['Sign'] = SignTool.createSign(params!);
} else{ } else{
headers['appId'] = AppConfig.AppID; headers['Authorization'] = '';
headers['appSecret'] = AppConfig.AppSecret;
headers['timestamp'] = (DateTime.now().millisecondsSinceEpoch~/1000).toString();
headers['url'] = kServerUrl + url.toString();
headers['token'] = '';
if (params != null) {
params.addAll(headers);
}
headers['Sign'] = SignTool.createSign(params!);
} }
if (params != null) {
params.addAll(headers);
}
headers['Sign'] = SignTool.createSign(params!);
// Console.log(headers);
return headers; return headers;
} }
...@@ -93,6 +91,7 @@ class HttpService extends GetxService { ...@@ -93,6 +91,7 @@ class HttpService extends GetxService {
cancelToken: cancelToken, cancelToken: cancelToken,
); );
if (showLoading) CustomToast.dismiss(); if (showLoading) CustomToast.dismiss();
Console.log(response.data);
return ResponseModel.fromJson(response.data); return ResponseModel.fromJson(response.data);
} catch (error){ } catch (error){
if (error is! DioException) CustomToast.dismiss(); if (error is! DioException) CustomToast.dismiss();
...@@ -158,7 +157,6 @@ class HttpService extends GetxService { ...@@ -158,7 +157,6 @@ class HttpService extends GetxService {
class _RequestInterceptor extends Interceptor { class _RequestInterceptor extends Interceptor {
@override @override
void onResponse(Response response, ResponseInterceptorHandler handler) { void onResponse(Response response, ResponseInterceptorHandler handler) {
Console.log('--------------------------------');
if (response.data['code'] != 200) { if (response.data['code'] != 200) {
handler.reject( handler.reject(
DioException( DioException(
...@@ -174,7 +172,7 @@ class _RequestInterceptor extends Interceptor { ...@@ -174,7 +172,7 @@ class _RequestInterceptor extends Interceptor {
} }
@override @override
void onError(DioException err, ErrorInterceptorHandler handler) { void onError(DioException err, ErrorInterceptorHandler handler) async {
// Console.log(err.type); // Console.log(err.type);
switch (err.type) { switch (err.type) {
case DioExceptionType.connectionTimeout: case DioExceptionType.connectionTimeout:
...@@ -199,6 +197,33 @@ class _RequestInterceptor extends Interceptor { ...@@ -199,6 +197,33 @@ class _RequestInterceptor extends Interceptor {
switch (statusCode) { switch (statusCode) {
case 401: case 401:
msg = '$statusCode - Unauthorized'; msg = '$statusCode - Unauthorized';
final newToken = await refreshToken();
if (newToken != null) {
final RequestOptions requestOptions = err.requestOptions;
final headers = requestOptions.headers;
headers['Authorization'] = newToken;
// 更新请求体参数(如果有的话)
if (requestOptions.data is Map<String, dynamic>) {
final bodyParams = requestOptions.data as Map<String, dynamic>;
bodyParams.addAll(headers);
headers['Sign'] = SignTool.createSign(bodyParams);
} else {
final newParams = Map<String, dynamic>.from(headers);
headers['Sign'] = SignTool.createSign(newParams);
}
try {
final newResponse = await Dio().fetch(requestOptions);
handler.resolve(newResponse);
}catch (e) {
handler.reject(err);
}
} else {
UserStore.to.logout();
CustomToast.fail('登录已失效,请重新登录');
}
break; break;
case 404: case 404:
msg = '$statusCode - Server not found'; msg = '$statusCode - Server not found';
...@@ -210,8 +235,9 @@ class _RequestInterceptor extends Interceptor { ...@@ -210,8 +235,9 @@ class _RequestInterceptor extends Interceptor {
msg = '$statusCode - Bad gateway'; msg = '$statusCode - Bad gateway';
break; break;
default: default:
if (code == 901) UserStore.to.logout(); // if (code == 901) UserStore.to.logout();
msg = response?.data?['msg']?.toString() ?? msg; // msg = response?.data?['msg']?.toString() ?? msg;
msg = response?.data?['message']?.toString() ?? msg;
break; break;
} }
CustomToast.fail(msg); CustomToast.fail(msg);
...@@ -229,6 +255,21 @@ class _RequestInterceptor extends Interceptor { ...@@ -229,6 +255,21 @@ class _RequestInterceptor extends Interceptor {
super.onError(err, handler); super.onError(err, handler);
} }
Future<String?> refreshToken() async {
final result = await HttpService.to.post(
'/v1/members/login/getToken',
);
if (result.data is! Map) {
await Future.wait([
UserStore.to.setToken(result.data['token']),
UserStore.to.setAccessToken(result.data['access_token']),
]);
return result.data['token'];
}
// 在这里执行刷新token的逻辑
// 如果刷新成功,返回新的token;如果刷新失败,返回null
return null;
}
} }
......
...@@ -20,4 +20,4 @@ part 'sign.dart'; ...@@ -20,4 +20,4 @@ part 'sign.dart';
part 'encrypt_util.dart'; part 'encrypt_util.dart';
part 'tools.dart'; part 'tools.dart';
part 'styles.dart'; part 'styles.dart';
part 'validator.dart'; part 'validator.dart';
\ No newline at end of file
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论