Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
B
book-app
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
EzijingWeb
book-app
Commits
b9e13fce
提交
b9e13fce
authored
1月 09, 2024
作者:
yueweilu
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
401 处理
上级
d91b6f7c
显示空白字符变更
内嵌
并排
正在显示
7 个修改的文件
包含
94 行增加
和
23 行删除
+94
-23
account.dart
lib/apis/account.dart
+13
-0
index.dart
lib/apis/index.dart
+2
-0
controller.dart
lib/pages/course/controller.dart
+12
-0
index.dart
lib/pages/course/index.dart
+2
-0
view.dart
lib/pages/course/view.dart
+4
-3
view.dart
lib/pages/main/view.dart
+5
-5
http.dart
lib/services/http.dart
+56
-15
没有找到文件。
lib/apis/account.dart
浏览文件 @
b9e13fce
...
...
@@ -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
,
...
...
lib/apis/index.dart
浏览文件 @
b9e13fce
...
...
@@ -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'
;
...
...
lib/pages/course/controller.dart
浏览文件 @
b9e13fce
...
...
@@ -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
lib/pages/course/index.dart
浏览文件 @
b9e13fce
...
...
@@ -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
;
...
...
lib/pages/course/view.dart
浏览文件 @
b9e13fce
...
...
@@ -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),
),
),
)
...
...
lib/pages/main/view.dart
浏览文件 @
b9e13fce
...
...
@@ -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);
// }
if
(
page
!=
1
&&
!
UserStore
.
to
.
isLogin
)
{
context
.
pushNamed
(
Routes
.
login
);
}
else
{
controller
.
pageController
.
jumpToPage
(
page
);
}
// controller.pageController.jumpToPage(page);
},
items:
[
BottomNavigationBarItem
(
...
...
lib/services/http.dart
浏览文件 @
b9e13fce
...
...
@@ -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
>{};
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
!);
}
else
{
headers
[
'appId'
]
=
AppConfig
.
AppID
;
headers
[
'appSecret'
]
=
AppConfig
.
AppSecret
;
headers
[
'timestamp'
]
=
(
DateTime
.
now
().
millisecondsSinceEpoch
~/
1000
).
toString
();
headers
[
'url'
]
=
kServerUrl
+
url
.
toString
();
headers
[
'token'
]
=
''
;
if
(
Get
.
isRegistered
<
UserStore
>()
&&
UserStore
.
to
.
hasToken
&&
!
excludeToken
)
{
// headers['Token'] = UserStore.to.token;
headers
[
'Authorization'
]
=
UserStore
.
to
.
token
;
}
else
{
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
;
}
}
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论