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

401 处理

上级 d91b6f7c
......@@ -37,6 +37,19 @@ abstract class AccountAPI {
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({
required String phone,
......
......@@ -2,6 +2,8 @@ library apis;
import 'dart:io';
import 'package:flutter_book/store/index.dart';
import '../models/user_model.dart';
import '../services/index.dart';
......
......@@ -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';
import 'package:go_router/go_router.dart';
import 'package:ionicons/ionicons.dart';
import '../../apis/index.dart';
import '../../routes/index.dart';
import '../../store/index.dart';
import '../../utils/index.dart';
import '../../widgets/index.dart';
import 'package:badges/badges.dart' as badges;
......
......@@ -30,11 +30,12 @@ class _CoursePageState extends State<CoursePage> {
padding: EdgeInsets.zero,
backgroundColor: Colors.transparent,
icon: const Icon(Ionicons.timer),
onPressed: () => context.pushNamed(Routes.msgs),
// onPressed: () => context.pushNamed(Routes.msgs),
),
GestureDetector(
onTap: (){
context.pushNamed(Routes.msgs);
// context.pushNamed(Routes.msgs);
controller.logout(context);
},
child: badges.Badge(
position: badges.BadgePosition.topEnd(top: -5, end: 0),
......@@ -47,7 +48,7 @@ class _CoursePageState extends State<CoursePage> {
padding: EdgeInsets.zero,
backgroundColor: Colors.transparent,
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{
builder: (controller) => BottomNavigationBar(
currentIndex:controller.currentPage ,
onTap: (page){
// if (page != 1 && !UserStore.to.isLogin) {
// context.pushNamed(Routes.login);
// } else {
// controller.pageController.jumpToPage(page);
// }
controller.pageController.jumpToPage(page);
if (page != 1 && !UserStore.to.isLogin) {
context.pushNamed(Routes.login);
} else {
controller.pageController.jumpToPage(page);
}
// controller.pageController.jumpToPage(page);
},
items: [
BottomNavigationBarItem(
......
......@@ -24,25 +24,23 @@ class HttpService extends GetxService {
/// 组织 headers 参数
Map<String,dynamic>? _getHeaders({bool excludeToken = false,Map<String,dynamic>? params,String? url}) {
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>() &&
UserStore.to.hasToken && !excludeToken) {
// headers['Token'] = UserStore.to.token;
headers['token'] = UserStore.to.token;
if (params != null) {
params.addAll(headers);
}
headers['Sign'] = SignTool.createSign(params!);
headers['Authorization'] = UserStore.to.token;
} else{
headers['appId'] = AppConfig.AppID;
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!);
headers['Authorization'] = '';
}
if (params != null) {
params.addAll(headers);
}
headers['Sign'] = SignTool.createSign(params!);
// Console.log(headers);
return headers;
}
......@@ -93,6 +91,7 @@ class HttpService extends GetxService {
cancelToken: cancelToken,
);
if (showLoading) CustomToast.dismiss();
Console.log(response.data);
return ResponseModel.fromJson(response.data);
} catch (error){
if (error is! DioException) CustomToast.dismiss();
......@@ -158,7 +157,6 @@ class HttpService extends GetxService {
class _RequestInterceptor extends Interceptor {
@override
void onResponse(Response response, ResponseInterceptorHandler handler) {
Console.log('--------------------------------');
if (response.data['code'] != 200) {
handler.reject(
DioException(
......@@ -174,7 +172,7 @@ class _RequestInterceptor extends Interceptor {
}
@override
void onError(DioException err, ErrorInterceptorHandler handler) {
void onError(DioException err, ErrorInterceptorHandler handler) async {
// Console.log(err.type);
switch (err.type) {
case DioExceptionType.connectionTimeout:
......@@ -199,6 +197,33 @@ class _RequestInterceptor extends Interceptor {
switch (statusCode) {
case 401:
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;
case 404:
msg = '$statusCode - Server not found';
......@@ -210,8 +235,9 @@ class _RequestInterceptor extends Interceptor {
msg = '$statusCode - Bad gateway';
break;
default:
if (code == 901) UserStore.to.logout();
msg = response?.data?['msg']?.toString() ?? msg;
// if (code == 901) UserStore.to.logout();
// msg = response?.data?['msg']?.toString() ?? msg;
msg = response?.data?['message']?.toString() ?? msg;
break;
}
CustomToast.fail(msg);
......@@ -229,6 +255,21 @@ class _RequestInterceptor extends Interceptor {
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';
part 'encrypt_util.dart';
part 'tools.dart';
part 'styles.dart';
part 'validator.dart';
\ No newline at end of file
part 'validator.dart';
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论