From eed1773cee4708508c7e117959ea8851fa878d19 Mon Sep 17 00:00:00 2001
From: toly <1981462002@qq.com>
Date: Fri, 19 Jun 2020 09:59:57 +0800
Subject: [PATCH] =?UTF-8?q?:pencil:=20=E8=A6=81=E7=82=B9=E9=9B=86=E5=BD=95?=
=?UTF-8?q?=E5=88=9D=E6=B5=8B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.gitignore | 2 +-
android/app/src/main/AndroidManifest.xml | 5 +
assets/iconfont/iconfont.ttf | Bin 6112 -> 8552 bytes
lib/app/api/github/github_api.dart | 22 +
lib/app/api/github/issues_api.dart | 43 ++
lib/app/api/github/repos_api.dart | 20 +
lib/app/res/cons.dart | 11 +-
.../res/constant/github_client_config.dart | 8 +
lib/app/router.dart | 28 +-
lib/app/style/TolyIcon.dart | 7 +
lib/app/utils/convert_man.dart | 47 ++
lib/app/utils/http/code.dart | 30 ++
lib/app/utils/http/http_util.dart | 133 ++++++
.../http/interceptors/error_interceptor.dart | 32 ++
.../http/interceptors/header_interceptor.dart | 16 +
.../http/interceptors/log_interceptor.dart | 112 +++++
.../interceptors/response_interceptor.dart | 27 ++
.../http/interceptors/token_interceptor.dart | 64 +++
lib/app/utils/http/rep_result.dart | 28 ++
lib/blocs/github_authentic/bloc.dart | 73 +++
lib/blocs/github_authentic/event.dart | 26 +
lib/blocs/github_authentic/state.dart | 25 +
lib/blocs/github_login/api.dart | 19 +
lib/blocs/github_login/bloc.dart | 51 ++
lib/blocs/github_login/event.dart | 21 +
lib/blocs/github_login/state.dart | 24 +
lib/blocs/issues/event.dart | 41 ++
lib/blocs/issues/state.dart | 48 ++
lib/model/github/g/github_user.g.dart | 93 ++++
lib/model/github/g/issue.g.dart | 55 +++
lib/model/github/g/license.g.dart | 19 +
lib/model/github/g/repository.g.dart | 96 ++++
.../github/g/repository_permissions.g.dart | 24 +
lib/model/github/github_user.dart | 94 ++++
lib/model/github/issue.dart | 77 +++
lib/model/github/license.dart | 14 +
lib/model/github/repository.dart | 137 ++++++
lib/model/github/repository_permissions.dart | 18 +
.../github_authentic_repository.dart | 28 ++
lib/repositories/github_user_repository.dart | 54 +++
lib/storage/dao/local_storage.dart | 32 ++
lib/views/pages/category/collect_page.dart | 13 +-
lib/views/pages/home/home_drawer.dart | 2 +-
lib/views/pages/issues/main.dart | 449 ++++++++++++++++++
lib/views/pages/login/arc_clipper.dart | 26 +
lib/views/pages/login/login_form.dart | 202 ++++++++
lib/views/pages/login/login_page.dart | 112 +++++
lib/views/pages/search/serach_page.dart | 2 +-
...ug_unit_page.dart => point_unit_page.dart} | 17 +-
.../SliverOverlapAbsorber/node1_base.dart | 97 ++++
.../SliverOverlapInjector/node1_base.dart | 97 ++++
.../NestedScrollView/node1_base.dart | 102 ++++
pubspec.lock | 44 +-
pubspec.yaml | 3 +
test/github/issues.dart | 19 +
test/github/repos.dart | 17 +
test/widget_test.dart | 2 +-
57 files changed, 2878 insertions(+), 30 deletions(-)
create mode 100644 lib/app/api/github/github_api.dart
create mode 100644 lib/app/api/github/issues_api.dart
create mode 100644 lib/app/api/github/repos_api.dart
create mode 100644 lib/app/res/constant/github_client_config.dart
create mode 100644 lib/app/utils/convert_man.dart
create mode 100644 lib/app/utils/http/code.dart
create mode 100644 lib/app/utils/http/http_util.dart
create mode 100644 lib/app/utils/http/interceptors/error_interceptor.dart
create mode 100644 lib/app/utils/http/interceptors/header_interceptor.dart
create mode 100644 lib/app/utils/http/interceptors/log_interceptor.dart
create mode 100644 lib/app/utils/http/interceptors/response_interceptor.dart
create mode 100644 lib/app/utils/http/interceptors/token_interceptor.dart
create mode 100644 lib/app/utils/http/rep_result.dart
create mode 100644 lib/blocs/github_authentic/bloc.dart
create mode 100644 lib/blocs/github_authentic/event.dart
create mode 100644 lib/blocs/github_authentic/state.dart
create mode 100644 lib/blocs/github_login/api.dart
create mode 100644 lib/blocs/github_login/bloc.dart
create mode 100644 lib/blocs/github_login/event.dart
create mode 100644 lib/blocs/github_login/state.dart
create mode 100644 lib/blocs/issues/event.dart
create mode 100644 lib/blocs/issues/state.dart
create mode 100644 lib/model/github/g/github_user.g.dart
create mode 100644 lib/model/github/g/issue.g.dart
create mode 100644 lib/model/github/g/license.g.dart
create mode 100644 lib/model/github/g/repository.g.dart
create mode 100644 lib/model/github/g/repository_permissions.g.dart
create mode 100644 lib/model/github/github_user.dart
create mode 100644 lib/model/github/issue.dart
create mode 100644 lib/model/github/license.dart
create mode 100644 lib/model/github/repository.dart
create mode 100644 lib/model/github/repository_permissions.dart
create mode 100644 lib/repositories/github_authentic_repository.dart
create mode 100644 lib/repositories/github_user_repository.dart
create mode 100644 lib/storage/dao/local_storage.dart
create mode 100644 lib/views/pages/issues/main.dart
create mode 100644 lib/views/pages/login/arc_clipper.dart
create mode 100644 lib/views/pages/login/login_form.dart
create mode 100644 lib/views/pages/login/login_page.dart
rename lib/views/pages/unit_todo/{bug_unit_page.dart => point_unit_page.dart} (85%)
create mode 100644 lib/views/widgets/Sliver/SliverOverlapAbsorber/node1_base.dart
create mode 100644 lib/views/widgets/Sliver/SliverOverlapInjector/node1_base.dart
create mode 100644 lib/views/widgets/StatefulWidget/NestedScrollView/node1_base.dart
create mode 100644 test/github/issues.dart
create mode 100644 test/github/repos.dart
diff --git a/.gitignore b/.gitignore
index d94933c..75f4982 100644
--- a/.gitignore
+++ b/.gitignore
@@ -32,6 +32,6 @@
.pub/
/build/
/lib/tools/
-
+/lib/res/constant/github_client_config.dart
# Exceptions to above rules.
!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages
diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index 4d701f0..c5c9284 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -5,6 +5,11 @@
In most cases you can leave this as-is, but you if you want to provide
additional functionality it is fine to subclass or reimplement
FlutterApplication and put your custom class here. -->
+
+
+
+
+
LELikleqVLSjPS3=@cIkbT{RqjL!wKJY?qlRHBjx7ik3V>ruYZQ`dk@Dm_bncp
z-u=^wGpK(G$L0Cy2aiE7`6aHKI8HB2&(GHO*_)3N(sCM&&L3M`I{w%}|3zHGb(kZ7
z+gPqIlW*|j^^N)lue&o}`o$VEIIEJ6u1*DqKO+*?5co@|a?EAi9(5n#b#@YmK0+JI
z_&J7o0U`eO+3=u>RuuhxIxkH>G{I
zq<8-xX@=q}Vb(DXXvq8bkgb1-{O>=(4eBIU<%{$pRg5FfIB!6QV9tiR|HVn)_K
z^vFf8@%t_e!_TNe<%HF!yclJ#Le~#BT_b!k@%%idTIZ-)aB3fEhR}QE5i{#C4?p
z4*L!3!MJu2i&V%c86#gs|3L*Y5=}x43i-YoRFV+InS3EHh=LI{wwEe3z~$|@R0J&>
zF-lfBpAp1t68@W`@k@W_V}cP2a60$)`SWjc*!B$GwK^$sk}nVpjGW(>97w!!o#+1+
z9Br%Qa(1Qd}9hBO+uo`2tSm(QAB42D%ux1eFDn72j%wNcT1
zy9$M^#eyqpL_}7TgY3D7rC?Axv&IEC?bqBcx-~bux_@+x3IZJ)-M{+w7Y8@4NP}I^
zyuS9=#LXU_FHPv<7QJnbm6VYaBg@nrF*f9jQD&o
z3qk4O=NQ`K*3L-5%{9(;`>n}+lOxl-qVUrrll#8N!`+eb&U4Duey>|BwcmMXdkJms
zn%X=+(CZ5e0|P?X*E>KLCMOq;wWQG^+D*4qeFh!~EU}n;SJ?Bc0}o@A)EZ$ZG*ZoW
zK`PatTm%F(V(F)!Uf+{#Gg!;OIGHK4@W1F*;PT3M6vX);YX!rpx9sW%zS
z+#Qla>Cob%l>hYAS3l*kZ88DOoC)9mIV|7OwCp|mw0?16c^Mt+Du!;Kx;<3vN>|4_mT!%=n7jYu^_&!u@M((0HZR|r
zrKL;gW+^;zaA@e@M7Y#3UQOS-HG-L&oPFaHDH4rHv7AZwH#jpF+v*9_Z`5tBi1*r^
zc*SPAAs++*9jf6~W|dNSO1ymUc27spjhV<)JWv(Q>c$QsX+r@wXeltFe3A;NAJq(j
z^@T&%bfZtUV}=BZ+?U>&`gKmwW6xa4Rzmk44E5)(JRQ^dE-qCtSSJ_0tOk^11ehrw
z_qVpU298T6ut-t~sJ{xcF8;P<-}fY`Sx}9*E;NTiGw)`{%%7zAZRyq3)^@(-oVg>j
zc>@in+;@au3+4+kmgkIXc9X6*T{E~mixu+0*TUxJ=V`nkyfVw)qHmG|4pO
zjo4t73w#?^j*KX5ff&WITdG)St5Hp`i0F7Gyt7bpi!-v`$U7>CbGcEp8m~nG_PQS3
zCJVv1(iAi+BN$Q$KrjqV`$6#zYbg?!nKqkC7n;l+rF?y>M5@5*#j-H5nB$CzVi
zEH|7u#>=$Va1+2Cw_vR+S(QG!yxpo;DOa?&2KX8byOp9SQG+~tDNAWYL)ZL_^Jxl~
z|KksL@7y*}YA&QOPMqpjz|Wa+O5?H^iYdNm6Js6S44S=ww^DAP#zk5*;Hv!`&0^RQ
z(iG(e%Z#<6tZdq<055|{8PjyCBo&_VOcu&N7Gt4!PEY1IKTknW(+Y1Il+h+JVTvNx
zgm@=SN?DH_#~8`|40HjwURBf75+@qKhTPc2Ws9+NJB6r1f%h3P7fk$QtFPj>@+fi|
zc_qQWABNb*r?-~Jns1!RH%
delta 759
zcmZ{hOK4L;6o&t~uRLv<)Rrm=NexnpDBX1B0|db?Tv>{UD3?CWB548^sZdEo5DHR?
zw+k1pgl>v7h&yo+A{4=mf*_P4S;)CUyKrGQQhNO-(~Y1rd^29O61E?evU^k)$Zn@W@{pi5$*EfHST=#~zSN5KKx|2D-hm_NG*!p<=sXpkP
zZx`Ku`w`7JtnO!q=bpnFf`YoOjt32ONi~C(8Vr7^$vL%qm`PxFPiMF%`Dhmo-ty%T
z@;q6h#1T)D(kG)*l_go0Raut}X-gQU!e$f!hdzn_`vjk@!nk5gGmH55WHZo%Bj|<8
z+-byEOP1>5$WU7X9#T~31-|_|=vaw5e;UVjcLhDE#K1TZwn@W?5YNEakc5F*Agox!
ze2_i^GebrV)Bvd(s0PA6r_nu@<+@&I=)|iA-AY+EP&Q=4zycs`gKo2g1{Q^oMQK+B9DDU-&5Hi
D{wBPs
diff --git a/lib/app/api/github/github_api.dart b/lib/app/api/github/github_api.dart
new file mode 100644
index 0000000..ceba7a7
--- /dev/null
+++ b/lib/app/api/github/github_api.dart
@@ -0,0 +1,22 @@
+import 'package:dio/dio.dart';
+import 'package:flutter_unit/app/utils/http/http_util.dart';
+import 'package:flutter_unit/app/utils/http/rep_result.dart';
+
+/// create by 张风捷特烈 on 2020/6/17
+/// contact me by email 1981462002@qq.com
+/// 说明:
+
+class GithubApi {
+// static Future authorizations({String base64}) async {
+// var result = await HttpUtil.getInstance().post("/authorizations",
+// options: Options(headers: {"Authorization": "Basic $base64"}),
+// data: {
+// "scopes": ["user", "repo", "gist", "notifications"],
+// "note": "admin_script",
+// "client_id": GithubClientConfig.clientId,
+// "client_secret": GithubClientConfig.clientSecret
+// });
+//
+// return result;
+// }
+}
diff --git a/lib/app/api/github/issues_api.dart b/lib/app/api/github/issues_api.dart
new file mode 100644
index 0000000..5d0b25f
--- /dev/null
+++ b/lib/app/api/github/issues_api.dart
@@ -0,0 +1,43 @@
+import 'package:flutter_unit/app/utils/http/http_util.dart';
+import 'package:flutter_unit/app/utils/http/rep_result.dart';
+import 'package:flutter_unit/model/github/issue.dart';
+
+/// create by 张风捷特烈 on 2020/6/17
+/// contact me by email 1981462002@qq.com
+/// 说明:
+
+class IssuesApi {
+ static getIssues({
+ String username="toly1994328",
+ String repository="FlutterUnit",
+ String sort = 'created',
+ String direction = 'desc',
+ int page = 0,
+ int pageSize = 10,
+ String state = 'all',
+ String labels = "all",
+ }) async {
+ var url = "/repos/$username/$repository/issues";
+
+ var param = {
+ "state": state,
+ "sort": sort,
+ "direction": direction,
+ "labels": labels,
+ "page": page,
+ "per_page": pageSize,
+ };
+
+ var res = await HttpUtil.getInstance().get(url, param: param);
+
+ if (res != null && res.status) {
+ var data = res.data as List;
+
+ if (data == null) {
+ return RepResult(null, false, -1);
+ }
+
+ return RepResult(data.map(Issue.fromJson).toList(), true, 1);
+ }
+ }
+}
diff --git a/lib/app/api/github/repos_api.dart b/lib/app/api/github/repos_api.dart
new file mode 100644
index 0000000..9e49750
--- /dev/null
+++ b/lib/app/api/github/repos_api.dart
@@ -0,0 +1,20 @@
+import 'package:flutter_unit/app/utils/http/http_util.dart';
+import 'package:flutter_unit/app/utils/http/rep_result.dart';
+import 'package:flutter_unit/model/github/repository.dart';
+
+/// create by 张风捷特烈 on 2020/6/17
+/// contact me by email 1981462002@qq.com
+/// 说明:
+
+class ReposApi{
+
+ static Future getRepos({String username="toly1994328",String repository="FlutterUnit"}) async {
+
+ var result = await HttpUtil.getInstance().get("/repos/$username/$repository");
+
+ result.data = Repository.fromJson(result.data);
+
+ return result;
+
+ }
+}
\ No newline at end of file
diff --git a/lib/app/res/cons.dart b/lib/app/res/cons.dart
index b288798..3cbb40c 100644
--- a/lib/app/res/cons.dart
+++ b/lib/app/res/cons.dart
@@ -13,16 +13,6 @@ class Cons {
// "我的": Icons.account_circle,
};
- static const rainbow = [
- 0xffff0000,
- 0xffFF7F00,
- 0xffFFFF00,
- 0xff00FF00,
- 0xff00FFFF,
- 0xff0000FF,
- 0xff8B00FF
- ];
-
static const tabColors = [
0xff44D1FD,
0xffFD4F43,
@@ -32,6 +22,7 @@ class Cons {
0xFF00F1F1,
0xFFDBD83F
];
+
static const tabs = [
'Stles',
'Stful',
diff --git a/lib/app/res/constant/github_client_config.dart b/lib/app/res/constant/github_client_config.dart
new file mode 100644
index 0000000..28145f6
--- /dev/null
+++ b/lib/app/res/constant/github_client_config.dart
@@ -0,0 +1,8 @@
+/// create by 张风捷特烈 on 2020/6/16
+/// contact me by email 1981462002@qq.com
+/// 说明:
+
+class GithubClientConfig {
+ static const clientId = "7f2e92c1db43b9434585";
+ static const clientSecret = "f492b1d894d9dc638391e7b874b613cf54238eb4";
+}
\ No newline at end of file
diff --git a/lib/app/router.dart b/lib/app/router.dart
index f72ffa5..e209b8a 100644
--- a/lib/app/router.dart
+++ b/lib/app/router.dart
@@ -5,20 +5,21 @@ import 'package:flutter_unit/views/pages/about/about_app_page.dart';
import 'package:flutter_unit/views/pages/about/version_info.dart';
import 'package:flutter_unit/views/pages/category/category_detail.dart';
import 'package:flutter_unit/views/pages/category/collect_page.dart';
+import 'package:flutter_unit/views/pages/issues/main.dart';
+import 'package:flutter_unit/views/pages/login/login_page.dart';
import 'package:flutter_unit/views/pages/search/serach_page.dart';
import 'package:flutter_unit/views/pages/setting/code_style_setting.dart';
import 'package:flutter_unit/views/pages/setting/font_setting.dart';
import 'package:flutter_unit/views/pages/setting/item_style_setting.dart';
import 'package:flutter_unit/views/pages/setting/theme_color_setting.dart';
import 'package:flutter_unit/views/pages/unit_todo/attr_unit_page.dart';
-import 'package:flutter_unit/views/pages/unit_todo/bug_unit_page.dart';
+import 'package:flutter_unit/views/pages/unit_todo/point_unit_page.dart';
import 'package:flutter_unit/views/pages/detail/widget_detail_page.dart';
import 'package:flutter_unit/views/pages/unit_todo/layout_unit_page.dart';
import 'package:flutter_unit/views/pages/unit_todo/paint_unit_page.dart';
import 'package:flutter_unit/views/pages/setting/setting_page.dart';
-
import 'utils/router_utils.dart';
class Router {
@@ -36,9 +37,10 @@ class Router {
static const String code_style_setting = 'CodeStyleSettingPage';
static const String item_style_setting = 'ItemStyleSettingPage';
static const String version_info = 'VersionInfo';
-
+ static const String login = 'login';
static const String category_show = 'CategoryShow';
+ static const String issues_point = 'IssuesPointPage';
static const String attr = 'AttrUnitPage';
static const String bug = 'BugUnitPage';
@@ -51,7 +53,10 @@ class Router {
switch (settings.name) {
//根据名称跳转相应页面
case widget_detail:
- return Right2LeftRouter(child: WidgetDetailPage(model: settings.arguments,));
+ return Right2LeftRouter(
+ child: WidgetDetailPage(
+ model: settings.arguments,
+ ));
case search:
return Right2LeftRouter(child: SearchPage());
case collect:
@@ -68,8 +73,14 @@ class Router {
return Right2LeftRouter(child: CodeStyleSettingPage());
case item_style_setting:
return Right2LeftRouter(child: ItemStyleSettingPage());
- case version_info:
+
+ case version_info:
return Right2LeftRouter(child: VersionInfo());
+ case issues_point:
+ return Right2LeftRouter(child: IssuesPointPage());
+
+ case login:
+ return Right2LeftRouter(child: LoginPage());
case attr:
return Right2LeftRouter(child: AttrUnitPage());
@@ -84,8 +95,11 @@ class Router {
case about_me:
return Right2LeftRouter(child: AboutMePage());
- case category_show:
- return Right2LeftRouter(child: CategoryShow(model: settings.arguments,));
+ case category_show:
+ return Right2LeftRouter(
+ child: CategoryShow(
+ model: settings.arguments,
+ ));
default:
return MaterialPageRoute(
diff --git a/lib/app/style/TolyIcon.dart b/lib/app/style/TolyIcon.dart
index 681afdc..1caf6a8 100644
--- a/lib/app/style/TolyIcon.dart
+++ b/lib/app/style/TolyIcon.dart
@@ -4,6 +4,13 @@ import 'package:flutter/widgets.dart';
class TolyIcon {
TolyIcon._();
+static const IconData icon_common = const IconData( 0xe634, fontFamily: "TolyIcon");
+static const IconData icon_see = const IconData( 0xe608, fontFamily: "TolyIcon");
+static const IconData icon_issues = const IconData( 0xe7a7, fontFamily: "TolyIcon");
+static const IconData icon_fork = const IconData( 0xe623, fontFamily: "TolyIcon");
+static const IconData icon_github_star = const IconData( 0xe7df, fontFamily: "TolyIcon");
+static const IconData icon_show = const IconData( 0xe648, fontFamily: "TolyIcon");
+static const IconData icon_hide = const IconData( 0xe649, fontFamily: "TolyIcon");
static const IconData icon_email = const IconData( 0xe694, fontFamily: "TolyIcon");
static const IconData icon_github = const IconData( 0xe689, fontFamily: "TolyIcon");
static const IconData icon_juejin = const IconData( 0xe601, fontFamily: "TolyIcon");
diff --git a/lib/app/utils/convert_man.dart b/lib/app/utils/convert_man.dart
new file mode 100644
index 0000000..f6386ed
--- /dev/null
+++ b/lib/app/utils/convert_man.dart
@@ -0,0 +1,47 @@
+/// create by 张风捷特烈 on 2020/6/17
+/// contact me by email 1981462002@qq.com
+/// 说明:
+
+final double _kMillisLimit = 1000.0;
+
+final double _kSecondsLimit = 60 * _kMillisLimit;
+
+final double _kMinutesLimit = 60 * _kSecondsLimit;
+
+final double _kHourLimit = 24 * _kMinutesLimit;
+
+final double _kDaysLimit = 30 * _kHourLimit;
+
+class ConvertMan {
+
+ ///日期格式转换
+ static String time2string(DateTime date, {bool just = false}) {
+ if (just) {
+ return _getDateStr(date);
+ }
+ int subTimes =
+ DateTime.now().millisecondsSinceEpoch - date.millisecondsSinceEpoch;
+ if (subTimes < _kMillisLimit) {
+ return "刚刚";
+ } else if (subTimes < _kSecondsLimit) {
+ return (subTimes / _kMillisLimit).round().toString() + " 秒前";
+ } else if (subTimes < _kMinutesLimit) {
+ return (subTimes / _kSecondsLimit).round().toString() + "分钟前";
+ } else if (subTimes < _kHourLimit) {
+ return (subTimes / _kMinutesLimit).round().toString() + "小时前";
+ } else if (subTimes < _kDaysLimit) {
+ return (subTimes / _kHourLimit).round().toString() + "天前";
+ } else {
+ return _getDateStr(date);
+ }
+ }
+
+ static String _getDateStr(DateTime date) {
+ if (date == null || date.toString() == null) {
+ return "";
+ } else if (date.toString().length < 10) {
+ return date.toString();
+ }
+ return date.toString().substring(0, 10);
+ }
+}
diff --git a/lib/app/utils/http/code.dart b/lib/app/utils/http/code.dart
new file mode 100644
index 0000000..e85d8a3
--- /dev/null
+++ b/lib/app/utils/http/code.dart
@@ -0,0 +1,30 @@
+//import 'package:gsy_github_app_flutter/common/event/http_error_event.dart';
+//import 'package:gsy_github_app_flutter/common/event/index.dart';
+
+///错误编码
+class Code {
+ ///网络错误
+ static const NETWORK_ERROR = -1;
+
+ ///网络超时
+ static const NETWORK_TIMEOUT = -2;
+
+ ///网络返回数据格式化一次
+ static const NETWORK_JSON_EXCEPTION = -3;
+
+ ///Github APi Connection refused
+ static const GITHUB_API_REFUSED = -4;
+
+ static const SUCCESS = 200;
+
+ static errorHandleFunction(code, message, noTip) {
+ if (noTip) {
+ return message;
+ }
+ if(message != null && message is String && (message.contains("Connection refused") || message.contains("Connection reset"))) {
+ code = GITHUB_API_REFUSED;
+ }
+// eventBus.fire(new HttpErrorEvent(code, message));
+ return message;
+ }
+}
diff --git a/lib/app/utils/http/http_util.dart b/lib/app/utils/http/http_util.dart
new file mode 100644
index 0000000..9a17d2b
--- /dev/null
+++ b/lib/app/utils/http/http_util.dart
@@ -0,0 +1,133 @@
+import 'dart:collection';
+
+import 'package:dio/dio.dart';
+import 'rep_result.dart';
+
+import 'code.dart';
+import 'interceptors/log_interceptor.dart';
+import 'interceptors/response_interceptor.dart';
+import 'interceptors/token_interceptor.dart';
+
+const String _kBaseUrl = "https://api.github.com";
+const int _kReceiveTimeout = 15000;
+const int _kSendTimeout = 15000;
+const int _kConnectTimeout = 15000;
+const String _kTokenKey = 'Authorization';
+const String _kTokenPrefix = 'Bearer ';
+
+///http请求
+class HttpUtil {
+ static const CONTENT_TYPE_JSON = "application/json";
+ static const CONTENT_TYPE_FORM = "application/x-www-form-urlencoded";
+
+ static HttpUtil _instance = HttpUtil._internal();
+
+ Dio _dio;
+
+ void setToken(String token) {
+ _tokenInterceptors.token = token;
+ }
+
+ void clearToken(String token) {
+ setToken(null);
+ }
+
+ ///通用全局单例,第一次使用时初始化
+ HttpUtil._internal({String token}) {
+ if (null == _dio) {
+ _dio = Dio(BaseOptions(
+ baseUrl: _kBaseUrl,
+ connectTimeout: _kReceiveTimeout,
+ receiveTimeout: _kConnectTimeout,
+ sendTimeout: _kSendTimeout,
+ ));
+
+ _dio.interceptors.add(LogsInterceptors());
+ _dio.interceptors.add(ResponseInterceptors());
+ _dio.interceptors.add(_tokenInterceptors);
+ }
+ }
+
+ static HttpUtil getInstance() {
+ return _instance;
+ }
+
+ void rebase(String baseUrl) {
+ _dio.options.baseUrl = baseUrl;
+ }
+
+ final TokenInterceptor _tokenInterceptors = TokenInterceptor();
+
+ Future get(String url,
+ {Map header, Map param}) async {
+ Response response;
+ try {
+ response = await _dio.get(url, queryParameters: param);
+ } on DioError catch (e) {
+ return resultError(e);
+ }
+ if (response.data is DioError) {
+ return resultError(response.data);
+ }
+ return response.data;
+ }
+
+ Future post(String url,
+ {Map param, data, Options options,}) async {
+ Response response;
+ try {
+ response = await _dio.post(
+ url, data: data, queryParameters: param, options: options);
+ } on DioError catch (e) {
+ return resultError(e);
+ }
+ if (response.data is DioError) {
+ return resultError(response.data);
+ }
+ return response.data;
+ }
+
+ Future put(String url, {Map param, data}) async {
+ Response response;
+ try {
+ response = await _dio.put(url, data: data, queryParameters: param);
+ } on DioError catch (e) {
+ return resultError(e);
+ }
+ if (response.data is DioError) {
+ return resultError(response.data);
+ }
+ return response.data;
+ }
+
+ Future delete(String url,
+ {Map param, data}) async {
+ Response response;
+ try {
+ response = await _dio.delete(url, data: data, queryParameters: param);
+ } on DioError catch (e) {
+ return resultError(e);
+ }
+ if (response.data is DioError) {
+ return resultError(response.data);
+ }
+ return response.data;
+ }
+
+ resultError(DioError e) {
+ Response errorResponse;
+ if (e.response != null) {
+ errorResponse = e.response;
+ } else {
+ errorResponse = Response(statusCode: 666);
+ }
+ if (e.type == DioErrorType.CONNECT_TIMEOUT ||
+ e.type == DioErrorType.RECEIVE_TIMEOUT) {
+ errorResponse.statusCode = Code.NETWORK_TIMEOUT;
+ }
+ return RepResult(
+ Code.errorHandleFunction(errorResponse.statusCode, e.message, false),
+ false,
+ errorResponse.statusCode);
+ }
+}
\ No newline at end of file
diff --git a/lib/app/utils/http/interceptors/error_interceptor.dart b/lib/app/utils/http/interceptors/error_interceptor.dart
new file mode 100644
index 0000000..eaa28e5
--- /dev/null
+++ b/lib/app/utils/http/interceptors/error_interceptor.dart
@@ -0,0 +1,32 @@
+import 'package:connectivity/connectivity.dart';
+import 'package:dio/dio.dart';
+
+import '../code.dart';
+import '../rep_result.dart';
+
+/// create by 张风捷特烈 on 2020/4/28
+/// contact me by email 1981462002@qq.com
+/// 说明:
+
+///是否需要弹提示
+const NOT_TIP_KEY = "noTip";
+
+
+class ErrorInterceptors extends InterceptorsWrapper {
+ final Dio _dio;
+
+ ErrorInterceptors(this._dio);
+
+ @override
+ onRequest(RequestOptions options) async {
+ //没有网络
+ var connectivityResult = await (new Connectivity().checkConnectivity());
+ if (connectivityResult == ConnectivityResult.none) {
+ return _dio.resolve(new RepResult(
+ Code.errorHandleFunction(Code.NETWORK_ERROR, "", false),
+ false,
+ Code.NETWORK_ERROR));
+ }
+ return options;
+ }
+}
diff --git a/lib/app/utils/http/interceptors/header_interceptor.dart b/lib/app/utils/http/interceptors/header_interceptor.dart
new file mode 100644
index 0000000..dd78477
--- /dev/null
+++ b/lib/app/utils/http/interceptors/header_interceptor.dart
@@ -0,0 +1,16 @@
+import 'package:dio/dio.dart';
+
+/// create by 张风捷特烈 on 2020/4/28
+/// contact me by email 1981462002@qq.com
+/// 说明:
+///
+class HeaderInterceptors extends InterceptorsWrapper {
+ @override
+ onRequest(RequestOptions options) async {
+ ///超时
+ options.connectTimeout = 30000;
+ options.receiveTimeout = 30000;
+
+ return options;
+ }
+}
diff --git a/lib/app/utils/http/interceptors/log_interceptor.dart b/lib/app/utils/http/interceptors/log_interceptor.dart
new file mode 100644
index 0000000..058e8c5
--- /dev/null
+++ b/lib/app/utils/http/interceptors/log_interceptor.dart
@@ -0,0 +1,112 @@
+import 'dart:convert';
+import 'package:dio/dio.dart';
+
+/// create by 张风捷特烈 on 2020/4/28
+/// contact me by email 1981462002@qq.com
+/// 说明:
+///
+class LogsInterceptors extends InterceptorsWrapper {
+ static bool debug = true;
+
+ static List