refactor login page.

refactor net util.
just RTFSC.
hmxc
小赖 4 years ago
parent a75cbb0145
commit 0653eb1625

@ -1,9 +1,14 @@
class API {
static const String host = 'http://192.168.31.129:9001/app';
static const String host = 'http://192.168.2.201:8804/IntelligentCommunity';
static String get resource => '$host/static';
static const int networkTimeOut = 10000;
static _Login login = _Login();
}
class _Login {
String get a => '';
///
String get sendSMSCode => '/login/sendMMSLogin';
///
String get loginBySMS => 'login/loginSMSUser';
}

@ -1,7 +1,6 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
extension PageExt on Widget{
Function get to => (){Get.to(this);};
}
extension PageExt on Widget {
Function get to => () => Get.to(this);
}

@ -1,3 +1,4 @@
import 'package:akuCommunity/pages/splash/splash_page.dart';
import 'package:akuCommunity/pages/tab_navigator.dart';
import 'package:akuCommunity/provider/user_provider.dart';
import 'package:akuCommunity/utils/developer_util.dart';
@ -50,7 +51,7 @@ class _MyAppState extends State<MyApp> {
primarySwatch: Colors.yellow,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
home: TabNavigator(),
home: SplashPage(),
//
localizationsDelegates: [
PickerLocalizationsDelegate.delegate,

@ -0,0 +1,64 @@
class UserInfoModel {
Data data;
String message;
bool status;
UserInfoModel({this.data, this.message, this.status});
UserInfoModel.fromJson(Map<String, dynamic> json) {
data = json['data'] != null ? new Data.fromJson(json['data']) : null;
message = json['message'];
status = json['status'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
if (this.data != null) {
data['data'] = this.data.toJson();
}
data['message'] = this.message;
data['status'] = this.status;
return data;
}
}
class Data {
int id;
List<String> imgUrls;
String name;
String nickName;
String tel;
int sex;
String birthday;
Data(
{this.id,
this.imgUrls,
this.name,
this.nickName,
this.tel,
this.sex,
this.birthday});
Data.fromJson(Map<String, dynamic> json) {
id = json['id'];
imgUrls = json['imgUrls'].cast<String>();
name = json['name'];
nickName = json['nickName'];
tel = json['tel'];
sex = json['sex'];
birthday = json['birthday'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['id'] = this.id;
data['imgUrls'] = this.imgUrls;
data['name'] = this.name;
data['nickName'] = this.nickName;
data['tel'] = this.tel;
data['sex'] = this.sex;
data['birthday'] = this.birthday;
return data;
}
}

@ -11,7 +11,7 @@ import 'package:akuCommunity/pages/things_page/fixed_submit_page.dart';
import 'package:akuCommunity/pages/visitor_access_page/visitor_access_page.dart';
import 'package:akuCommunity/painters/user_bottom_bar_painter.dart';
import 'package:akuCommunity/provider/user_provider.dart';
import 'package:akuCommunity/utils/net_util.dart';
import 'package:akuCommunity/utils/network/net_util.dart';
import 'package:akuCommunity/widget/grid_buttons.dart';
import 'package:ani_route/ani_route.dart';
import 'package:flutter/material.dart';
@ -137,8 +137,7 @@ class _PersonalIndexState extends State<PersonalIndex>
),
InkWell(
onTap: () {
if (!userProvider.isSigned)
ARoute.push(context, SignInPage());
if (!userProvider.isSigned) SignInPage().to();
},
child: Container(
margin: EdgeInsets.only(left: 16.w),

@ -0,0 +1,23 @@
import 'package:akuCommunity/constants/api.dart';
import 'package:akuCommunity/utils/network/base_model.dart';
import 'package:akuCommunity/utils/network/net_util.dart';
import 'package:dio/dio.dart';
class SignFunc {
static Future sendMessageCode(String phone) async {
BaseModel baseModel = await NetUtil().post(
API.login.sendSMSCode,
params: {'tel': phone},
showMessage: true,
);
return baseModel;
}
static Future<String> login(String phone, String code) async {
Response response = await NetUtil().dio.post(
API.login.loginBySMS,
data: {'tel': phone, 'code': code},
);
return response.data['token'];
}
}

@ -4,6 +4,7 @@ import 'dart:ui';
import 'package:akuCommunity/pages/setting_page/agreement_page/agreement_page.dart';
import 'package:akuCommunity/pages/setting_page/agreement_page/privacy_page.dart';
import 'package:akuCommunity/pages/sign/sign_func.dart';
import 'package:akuCommunity/pages/sign/user_authentication_page.dart';
import 'package:akuCommunity/extensions/num_ext.dart';
import 'package:akuCommunity/const/resource.dart';
@ -182,107 +183,101 @@ class _SignInPageState extends State<SignInPage> {
return Scaffold(
backgroundColor: Colors.white,
appBar: _appBar,
body: SingleChildScrollView(
body: GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () {
FocusScope.of(context).requestFocus(FocusNode());
},
child: Container(
child: GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () {
FocusScope.of(context).requestFocus(FocusNode());
},
child: Container(
color: Colors.white,
child: ListView(
shrinkWrap: true,
children: [
SizedBox(
height: 153.w,
),
_containerImage(),
SizedBox(height: 16.w),
Container(
alignment: Alignment.center,
child: Text(
'欢迎登录小蜜蜂',
style: TextStyle(
fontWeight: FontWeight.w600,
fontSize: BaseStyle.fontSize38,
color: ktextPrimary),
),
),
SizedBox(height: 89.w),
_buildTextField(
hint: '请输入手机号',
controller: _phone,
prefix: Image.asset(
R.ASSETS_IMAGES_PHONE_LOGO_PNG,
height: 50.w,
width: 50.w,
color: Colors.white,
child: ListView(
children: [
153.hb,
_containerImage(),
16.hb,
Container(
alignment: Alignment.center,
child: Text(
'欢迎登录小蜜蜂',
style: TextStyle(
fontWeight: FontWeight.w600,
fontSize: BaseStyle.fontSize38,
color: ktextPrimary),
),
),
89.hb,
_buildTextField(
hint: '请输入手机号',
controller: _phone,
prefix: Image.asset(
R.ASSETS_IMAGES_PHONE_LOGO_PNG,
height: 50.w,
width: 50.w,
),
),
26.hb,
_buildTextField(
prefix: Image.asset(
R.ASSETS_IMAGES_CODE_LOGO_PNG,
height: 50.w,
width: 50.w,
),
hint: '请输入验证码',
controller: _code,
suffix: MaterialButton(
height: 82.w,
shape: StadiumBorder(),
materialTapTargetSize: MaterialTapTargetSize.shrinkWrap,
child: Text(
_timer?.isActive ?? false
? '${60 - _timer.tick}'
: '获取验证码',
style: TextStyle(
color: BaseStyle.color999999,
fontSize: BaseStyle.fontSize28,
fontWeight: FontWeight.w500,
),
),
26.hb,
_buildTextField(
prefix: Image.asset(
R.ASSETS_IMAGES_CODE_LOGO_PNG,
height: 50.w,
width: 50.w,
),
hint: '请输入验证码',
controller: _code,
suffix: MaterialButton(
height: 82.w,
shape: StadiumBorder(),
materialTapTargetSize: MaterialTapTargetSize.shrinkWrap,
onPressed: _canGetCode
? () {
SignFunc.sendMessageCode(_phone.text);
startTick();
}
: null,
),
),
SizedBox(height: 59.w),
_inkWellLogin(),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
FlatButton(
padding: EdgeInsets.zero,
onPressed: () {
ARoute.push(context, AgreementPage());
},
child: Text(
_timer?.isActive ?? false
? '${60 - _timer.tick}'
: '获取验证码',
'《小蜜蜂用户协议》',
style: TextStyle(
color: BaseStyle.color999999,
fontSize: BaseStyle.fontSize28,
fontWeight: FontWeight.w500,
color: Colors.lightBlue,
),
),
onPressed: _canGetCode
? () {
startTick();
}
: null,
),
),
SizedBox(height: 59.w),
_inkWellLogin(),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
FlatButton(
padding: EdgeInsets.zero,
onPressed: () {
ARoute.push(context, AgreementPage());
},
child: Text(
'《小蜜蜂用户协议》',
style: TextStyle(
color: Colors.lightBlue,
),
)),
SizedBox(width: 15.w),
FlatButton(
padding: EdgeInsets.zero,
onPressed: () {
ARoute.push(context, PrivacyPage());
},
child: Text(
'《小蜜蜂隐私政策》',
style: TextStyle(
color: Colors.lightBlue,
),
))
],
),
)),
SizedBox(width: 15.w),
FlatButton(
padding: EdgeInsets.zero,
onPressed: () {
ARoute.push(context, PrivacyPage());
},
child: Text(
'《小蜜蜂隐私政策》',
style: TextStyle(
color: Colors.lightBlue,
),
))
],
)),
),
),
),
],
)),
),
);
}

@ -0,0 +1,39 @@
import 'package:akuCommunity/pages/tab_navigator.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:velocity_x/velocity_x.dart';
//TODO splashPage
class SplashPage extends StatefulWidget {
SplashPage({Key key}) : super(key: key);
@override
_SplashPageState createState() => _SplashPageState();
}
class _SplashPageState extends State<SplashPage> {
Future _initOp() async {
await Future.delayed(Duration(seconds: 2));
}
@override
void initState() {
super.initState();
_initOp().then((value) => Get.offAll(TabNavigator()));
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: SizedBox(
height: 80,
width: 80,
child: Placeholder(),
).centered(),
bottomNavigationBar: SizedBox(
child: CircularProgressIndicator().centered(),
height: 100,
),
);
}
}

@ -1,4 +1,5 @@
import 'package:akuCommunity/extensions/num_ext.dart';
import 'package:common_utils/common_utils.dart';
import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
import 'package:velocity_x/velocity_x.dart';
@ -15,6 +16,7 @@ class LoggerDioErr extends StatelessWidget {
color: Colors.red[100],
onPressed: () {},
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
@ -31,6 +33,7 @@ class LoggerDioErr extends StatelessWidget {
),
],
),
error.response.headers['date'].first.toString().text.make(),
error.message.text.sm.light.make(),
],
),

@ -0,0 +1,20 @@
class BaseModel {
int code;
String message;
bool status;
dynamic data;
BaseModel({
this.code,
this.message,
this.data,
this.status,
});
BaseModel.err({this.message = '未知错误', this.status = false});
BaseModel.fromJson(Map<String, dynamic> json) {
message = json['message'] ?? '';
data = json['data'] ?? null;
status = json['status'] ?? false;
}
}

@ -0,0 +1,21 @@
class LoginModel {
String message;
String token;
bool status;
LoginModel({this.message, this.token, this.status});
LoginModel.fromJson(Map<String, dynamic> json) {
message = json['message'];
token = json['token'];
status = json['status'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['message'] = this.message;
data['token'] = this.token;
data['status'] = this.status;
return data;
}
}

@ -1,6 +1,5 @@
import 'dart:convert';
import 'package:akuCommunity/utils/logger/logger_data.dart';
import 'package:akuCommunity/utils/network/base_model.dart';
import 'package:bot_toast/bot_toast.dart';
import 'package:dio/dio.dart';
@ -14,6 +13,8 @@ class NetUtil {
factory NetUtil() => _netUtil;
Dio get dio => _dio;
NetUtil._internal() {
_logger = Logger(
printer: PrettyPrinter(
@ -21,7 +22,7 @@ class NetUtil {
errorMethodCount: 4,
));
BaseOptions options = BaseOptions(
baseUrl: API.host,
baseUrl: '${API.host}/app',
connectTimeout: API.networkTimeOut,
receiveTimeout: API.networkTimeOut,
sendTimeout: API.networkTimeOut,
@ -39,6 +40,7 @@ class NetUtil {
Future<BaseModel> get(
String path, {
Map<String, dynamic> params,
bool showMessage = false,
}) async {
try {
Response res = await _dio.get(path, queryParameters: params);
@ -49,7 +51,33 @@ class NetUtil {
'data': res.data,
});
LoggerData.addData(res);
return BaseModel.fromJson(res.data);
BaseModel baseModel = BaseModel.fromJson(res.data);
_parseRequestError(baseModel, showMessage: showMessage);
return baseModel;
} on DioError catch (e) {
_parseErr(e);
}
return BaseModel.err();
}
Future<BaseModel> post(
String path, {
Map<String, dynamic> params,
bool showMessage = false,
}) async {
try {
Response res = await _dio.post(path, data: params);
_logger.v({
'path': res.request.path,
'header': res.request.headers,
'params': res.request.queryParameters,
'data': res.data,
});
LoggerData.addData(res);
BaseModel baseModel = BaseModel.fromJson(res.data);
_parseRequestError(baseModel, showMessage: showMessage);
return baseModel;
} on DioError catch (e) {
_parseErr(e);
}
@ -82,29 +110,10 @@ class NetUtil {
break;
}
}
}
class BaseModel {
int code;
String message;
dynamic data;
BaseModel({
this.code,
this.message,
this.data,
});
BaseModel.err({this.message = '未知错误', this.code = 0});
factory BaseModel.fromMap(Map<String, dynamic> map) {
if (map == null) return null;
return BaseModel(
code: map['code'] ?? 0,
message: map['message'] ?? '',
data: map['data'],
);
_parseRequestError(BaseModel model, {bool showMessage = false}) {
if (!model.status || showMessage) {
BotToast.showText(text: model.message);
}
}
factory BaseModel.fromJson(String source) =>
BaseModel.fromMap(json.decode(source));
}
Loading…
Cancel
Save