parent
baf8af8c43
commit
f69decf4ae
@ -0,0 +1,10 @@
|
||||
part of 'sars_api.dart';
|
||||
|
||||
class _ProfileApi {
|
||||
_MyHouse house = _MyHouse();
|
||||
}
|
||||
|
||||
class _MyHouse {
|
||||
///查询所有我的房屋
|
||||
String get userHouse => '/app/user/myEstate/findAllMyEstate';
|
||||
}
|
@ -0,0 +1,34 @@
|
||||
import 'package:json_annotation/json_annotation.dart';
|
||||
|
||||
part 'my_house_model.g.dart';
|
||||
|
||||
@JsonSerializable()
|
||||
class MyHouseModel {
|
||||
final int id;
|
||||
final String addressName;
|
||||
final String communityName;
|
||||
final String buildingName;
|
||||
final String estateName;
|
||||
final String unitName;
|
||||
final String manageEstateTypeName;
|
||||
final int identity;
|
||||
final String name;
|
||||
final String tel;
|
||||
final String isDefault;
|
||||
factory MyHouseModel.fromJson(Map<String, dynamic> json) =>
|
||||
_$MyHouseModelFromJson(json);
|
||||
|
||||
const MyHouseModel({
|
||||
required this.id,
|
||||
required this.addressName,
|
||||
required this.communityName,
|
||||
required this.buildingName,
|
||||
required this.estateName,
|
||||
required this.unitName,
|
||||
required this.manageEstateTypeName,
|
||||
required this.identity,
|
||||
required this.name,
|
||||
required this.tel,
|
||||
required this.isDefault,
|
||||
});
|
||||
}
|
@ -0,0 +1,21 @@
|
||||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||
|
||||
part of 'my_house_model.dart';
|
||||
|
||||
// **************************************************************************
|
||||
// JsonSerializableGenerator
|
||||
// **************************************************************************
|
||||
|
||||
MyHouseModel _$MyHouseModelFromJson(Map<String, dynamic> json) => MyHouseModel(
|
||||
id: json['id'] as int,
|
||||
addressName: json['addressName'] as String,
|
||||
communityName: json['communityName'] as String,
|
||||
buildingName: json['buildingName'] as String,
|
||||
estateName: json['estateName'] as String,
|
||||
unitName: json['unitName'] as String,
|
||||
manageEstateTypeName: json['manageEstateTypeName'] as String,
|
||||
identity: json['identity'] as int,
|
||||
name: json['name'] as String,
|
||||
tel: json['tel'] as String,
|
||||
isDefault: json['isDefault'] as String,
|
||||
);
|
@ -1,47 +1,48 @@
|
||||
import 'package:aku_new_community/model/common/img_model.dart';
|
||||
import 'package:flustars/flustars.dart';
|
||||
import 'package:json_annotation/json_annotation.dart';
|
||||
|
||||
part 'user_info_model.g.dart';
|
||||
|
||||
@JsonSerializable()
|
||||
class UserInfoModel {
|
||||
int id;
|
||||
List<ImgModel> imgUrls;
|
||||
String? name;
|
||||
String nickName;
|
||||
String tel;
|
||||
final int id;
|
||||
final int communityId;
|
||||
final String? name;
|
||||
final String tel;
|
||||
final List<ImgModel> imgUrls;
|
||||
|
||||
/// 性别 1.男 2.女
|
||||
int? sex;
|
||||
String? birthday;
|
||||
/// 性别 1.男 2.女 3.保密
|
||||
final int? sex;
|
||||
final String? nickName;
|
||||
final bool isExistPassword;
|
||||
|
||||
String get sexValue {
|
||||
if (sex == null) return '未设置';
|
||||
if (sex == 1) return '男';
|
||||
if (sex == 2) return '女';
|
||||
if (sex == 3) return '保密';
|
||||
return '未设置';
|
||||
}
|
||||
|
||||
DateTime? get birthdayDate => DateUtil.getDateTime(birthday ?? '');
|
||||
// DateTime? get birthdayDate => DateUtil.getDateTime(birthday ?? '');
|
||||
|
||||
String get birthdayValue {
|
||||
if (TextUtil.isEmpty(birthday))
|
||||
return '未设置';
|
||||
else
|
||||
return DateUtil.formatDate(birthdayDate, format: 'yyyy-MM-dd');
|
||||
}
|
||||
// String get birthdayValue {
|
||||
// if (TextUtil.isEmpty(birthday))
|
||||
// return '未设置';
|
||||
// else
|
||||
// return DateUtil.formatDate(birthdayDate, format: 'yyyy-MM-dd');
|
||||
// }
|
||||
|
||||
factory UserInfoModel.fromJson(Map<String, dynamic> json) =>
|
||||
_$UserInfoModelFromJson(json);
|
||||
|
||||
UserInfoModel({
|
||||
const UserInfoModel({
|
||||
required this.id,
|
||||
required this.imgUrls,
|
||||
required this.communityId,
|
||||
this.name,
|
||||
required this.nickName,
|
||||
required this.tel,
|
||||
required this.imgUrls,
|
||||
this.sex,
|
||||
this.birthday,
|
||||
this.nickName,
|
||||
required this.isExistPassword,
|
||||
});
|
||||
}
|
||||
|
@ -0,0 +1,137 @@
|
||||
import 'package:aku_new_community/pages/sign/sign_func.dart';
|
||||
import 'package:aku_new_community/widget/bee_scaffold.dart';
|
||||
import 'package:aku_new_community/widget/others/user_tool.dart';
|
||||
import 'package:bot_toast/bot_toast.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
import 'package:sms_autofill/sms_autofill.dart';
|
||||
import 'package:velocity_x/velocity_x.dart';
|
||||
|
||||
class CodeMessagePage extends StatefulWidget {
|
||||
final String tel;
|
||||
|
||||
const CodeMessagePage({Key? key, required this.tel}) : super(key: key);
|
||||
|
||||
@override
|
||||
_CodeMessagePageState createState() => _CodeMessagePageState();
|
||||
}
|
||||
|
||||
class _CodeMessagePageState extends State<CodeMessagePage> {
|
||||
String? _errorMessage;
|
||||
TextEditingController _controller = TextEditingController();
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
Future.delayed(Duration(milliseconds: 0), () async {
|
||||
await SmsAutoFill().listenForCode();
|
||||
});
|
||||
super.initState();
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
_controller.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return BeeScaffold(
|
||||
title: '',
|
||||
body: SafeArea(
|
||||
child: Padding(
|
||||
padding: EdgeInsets.symmetric(horizontal: 48.w, vertical: 24.w),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
46.w.heightBox,
|
||||
'请输入验证码'
|
||||
.text
|
||||
.size(36.sp)
|
||||
.color(Colors.black.withOpacity(0.65))
|
||||
.bold
|
||||
.make(),
|
||||
16.w.heightBox,
|
||||
_errorMessage == null
|
||||
? '${_errorMessage}'.text.color(Colors.red).size(28.sp).make()
|
||||
: '验证码已发送至'
|
||||
.richText
|
||||
.withTextSpanChildren([
|
||||
'${widget.tel}'
|
||||
.textSpan
|
||||
.size(28.sp)
|
||||
.color(Color(0xFFCF1322).withOpacity(0.8))
|
||||
.make(),
|
||||
])
|
||||
.size(28.sp)
|
||||
.color(Colors.black.withOpacity(0.45))
|
||||
.make(),
|
||||
80.w.heightBox,
|
||||
PinFieldAutoFill(
|
||||
inputFormatters: [FilteringTextInputFormatter.digitsOnly],
|
||||
codeLength: 6,
|
||||
onCodeChanged: (code) async {
|
||||
if (code!.length >= 6) {
|
||||
var re = await SignFunc.loginBySms(
|
||||
widget.tel,
|
||||
code,
|
||||
UserTool.appProveider.pickedCityAndCommunity!
|
||||
.communityModel!.id);
|
||||
if (re.data['success']) {
|
||||
UserTool.userProvider.setLogin(re.data['data']);
|
||||
var success =
|
||||
await UserTool.userProvider.updateUserInfo();
|
||||
if (!success) {
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
_errorMessage = re.data['message'];
|
||||
BotToast.showText(text: re.data['message']);
|
||||
_controller.clear();
|
||||
}
|
||||
}
|
||||
},
|
||||
decoration: UnderlineDecoration(
|
||||
colorBuilder: FixedColorListBuilder([
|
||||
Colors.black.withOpacity(0.3),
|
||||
Colors.black.withOpacity(0.3),
|
||||
Colors.black.withOpacity(0.3),
|
||||
Colors.black.withOpacity(0.3),
|
||||
Colors.black.withOpacity(0.3),
|
||||
Colors.black.withOpacity(0.3),
|
||||
])),
|
||||
),
|
||||
24.w.heightBox,
|
||||
Row(
|
||||
children: [
|
||||
Spacer(),
|
||||
TextButton(
|
||||
onPressed: () async {
|
||||
var base = await SignFunc.sendMessageCode(
|
||||
widget.tel,
|
||||
UserTool.appProveider.pickedCityAndCommunity!
|
||||
.communityModel!.id);
|
||||
if (base.success) {
|
||||
_errorMessage = null;
|
||||
UserTool.appProveider.startTimer();
|
||||
} else {
|
||||
BotToast.showText(text: base.message);
|
||||
}
|
||||
},
|
||||
child: (UserTool.appProveider.second >= 60
|
||||
? '重新发送验证码'
|
||||
: '${UserTool.appProveider.second}秒后可重新发送')
|
||||
.text
|
||||
.size(28.sp)
|
||||
.color(Color(0xFF5096F1))
|
||||
.make()),
|
||||
],
|
||||
)
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
@ -0,0 +1,196 @@
|
||||
import 'package:aku_new_community/pages/sign/login/code_message_page.dart';
|
||||
import 'package:aku_new_community/pages/sign/login/login_page.dart';
|
||||
import 'package:aku_new_community/pages/sign/sign_func.dart';
|
||||
import 'package:aku_new_community/pages/sign/widget/login_button_widget.dart';
|
||||
import 'package:aku_new_community/pages/sign/widget/psd_text_field.dart';
|
||||
import 'package:aku_new_community/pages/sign/widget/tel_text_field.dart';
|
||||
import 'package:aku_new_community/provider/app_provider.dart';
|
||||
import 'package:aku_new_community/widget/bee_scaffold.dart';
|
||||
import 'package:aku_new_community/widget/others/user_tool.dart';
|
||||
import 'package:bot_toast/bot_toast.dart';
|
||||
import 'package:flustars/flustars.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:velocity_x/velocity_x.dart';
|
||||
|
||||
class OtherLoginPage extends StatefulWidget {
|
||||
const OtherLoginPage({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
_OtherLoginPageState createState() => _OtherLoginPageState();
|
||||
}
|
||||
|
||||
class _OtherLoginPageState extends State<OtherLoginPage> {
|
||||
PageController _controller = PageController();
|
||||
List<String> _tabs = ['账号登录', '验证码登录'];
|
||||
int _currentIndex = 0;
|
||||
TextEditingController _tel = TextEditingController();
|
||||
TextEditingController _psd = TextEditingController();
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
_controller.dispose();
|
||||
_tel.dispose();
|
||||
_psd.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return BeeScaffold(
|
||||
title: '',
|
||||
bodyColor: Colors.white,
|
||||
body: Column(
|
||||
children: [
|
||||
Row(
|
||||
children: [
|
||||
24.w.widthBox,
|
||||
..._tabs
|
||||
.mapIndexed((e, index) => _tab(e, index, onTap: (value) {
|
||||
_currentIndex = value;
|
||||
_controller.jumpToPage(_currentIndex);
|
||||
setState(() {});
|
||||
}))
|
||||
.toList(),
|
||||
],
|
||||
),
|
||||
Flexible(
|
||||
child: PageView(
|
||||
controller: _controller,
|
||||
children: [_accountView(), _verificationView()],
|
||||
),
|
||||
),
|
||||
BottomTip(),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget _accountView() {
|
||||
return ListView(
|
||||
padding: EdgeInsets.symmetric(horizontal: 32.w),
|
||||
children: [
|
||||
140.w.heightBox,
|
||||
CommunityWidget(
|
||||
align: MainAxisAlignment.start,
|
||||
),
|
||||
40.w.heightBox,
|
||||
TelTextField(
|
||||
controller: _tel,
|
||||
),
|
||||
40.w.heightBox,
|
||||
PsdTextField(
|
||||
controller: _psd,
|
||||
),
|
||||
100.w.heightBox,
|
||||
LoginButtonWidget(
|
||||
onTap: () async {
|
||||
var check = checkInput();
|
||||
if (!check) {
|
||||
return;
|
||||
}
|
||||
var cancel = BotToast.showLoading();
|
||||
var response = await SignFunc.login(
|
||||
_tel.text,
|
||||
_psd.text,
|
||||
UserTool
|
||||
.appProveider.pickedCityAndCommunity!.communityModel!.id);
|
||||
if (response.data['success']) {
|
||||
UserTool.userProvider.setLogin(response.data['data']);
|
||||
var success = await UserTool.userProvider.updateUserInfo();
|
||||
if (!success) {
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
BotToast.showText(text: response.data['message']);
|
||||
}
|
||||
cancel();
|
||||
},
|
||||
text: '登录'),
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
bool checkInput() {
|
||||
if (!RegexUtil.isTel(_tel.text)) {
|
||||
BotToast.showText(text: '请输入正确的手机号!');
|
||||
return false;
|
||||
}
|
||||
if (UserTool.appProveider.pickedCityAndCommunity == null) {
|
||||
BotToast.showText(text: '请先选择小区!');
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
Widget _verificationView() {
|
||||
AppProvider appProvider = Provider.of<AppProvider>(context);
|
||||
return ListView(
|
||||
padding: EdgeInsets.symmetric(horizontal: 32.w),
|
||||
children: [
|
||||
140.w.heightBox,
|
||||
CommunityWidget(
|
||||
align: MainAxisAlignment.start,
|
||||
),
|
||||
40.w.heightBox,
|
||||
TelTextField(controller: _tel),
|
||||
100.w.heightBox,
|
||||
LoginButtonWidget(
|
||||
onTap: () async {
|
||||
var check = checkInput();
|
||||
if (!check) {
|
||||
return;
|
||||
}
|
||||
var base = await SignFunc.sendMessageCode(
|
||||
_tel.text,
|
||||
UserTool
|
||||
.appProveider.pickedCityAndCommunity!.communityModel!.id);
|
||||
if (base.success) {
|
||||
Get.to(() => CodeMessagePage(tel: _tel.text));
|
||||
appProvider.startTimer();
|
||||
} else {
|
||||
BotToast.showText(text: base.message);
|
||||
}
|
||||
},
|
||||
text: appProvider.timerStart
|
||||
? '${appProvider.second}秒后重新获取'
|
||||
: '获取验证码'),
|
||||
24.w.heightBox,
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
'未注册的手机验证后会自动创建账号'
|
||||
.text
|
||||
.size(28.sp)
|
||||
.color(Colors.black.withOpacity(0.25))
|
||||
.make(),
|
||||
],
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
Widget _tab(String text, int index, {required Function(int) onTap}) {
|
||||
return GestureDetector(
|
||||
behavior: HitTestBehavior.opaque,
|
||||
onTap: () => onTap(index),
|
||||
child: Container(
|
||||
padding: EdgeInsets.symmetric(horizontal: 24.w, vertical: 24.w),
|
||||
alignment: Alignment.center,
|
||||
child: text.text
|
||||
.size(_currentIndex == index ? 36.sp : 32.sp)
|
||||
.lineHeight(_currentIndex == index ? 1.2 : 1.2)
|
||||
.color(
|
||||
Colors.black.withOpacity(_currentIndex == index ? 0.65 : 0.45))
|
||||
.make(),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
@ -0,0 +1,36 @@
|
||||
import 'package:flustars/flustars.dart';
|
||||
|
||||
enum PSDVERIFY { shorLength, Insufficient, different, correct, empty }
|
||||
|
||||
class PsdVerify {
|
||||
//检测含有字母、数字、符号中两种的正则表达式
|
||||
static String reg = r'^(?![\d]+$)(?![a-zA-Z]+$)(?![^\da-zA-Z]+$).*';
|
||||
static PSDVERIFY check(String psd, String confirmPsd) {
|
||||
if (psd.isEmpty || confirmPsd.isEmpty) {
|
||||
return PSDVERIFY.empty;
|
||||
} else if (psd != confirmPsd) {
|
||||
return PSDVERIFY.different;
|
||||
} else if (psd.length < 6) {
|
||||
return PSDVERIFY.shorLength;
|
||||
} else if (!RegexUtil.matches(reg, psd)) {
|
||||
return PSDVERIFY.Insufficient;
|
||||
} else {
|
||||
return PSDVERIFY.correct;
|
||||
}
|
||||
}
|
||||
|
||||
static String checkString(PSDVERIFY enu) {
|
||||
switch (enu) {
|
||||
case PSDVERIFY.shorLength:
|
||||
return '密码不能小于6位';
|
||||
case PSDVERIFY.Insufficient:
|
||||
return '密码至少由两种类型组成';
|
||||
case PSDVERIFY.different:
|
||||
return '您输入的确认密码和新密码不一致,请检查后重新输入';
|
||||
case PSDVERIFY.correct:
|
||||
return '';
|
||||
case PSDVERIFY.empty:
|
||||
return '';
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,30 @@
|
||||
import 'package:aku_new_community/base/base_style.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
|
||||
class LoginButtonWidget extends StatelessWidget {
|
||||
final VoidCallback? onTap;
|
||||
final String text;
|
||||
const LoginButtonWidget({Key? key, required this.onTap, required this.text})
|
||||
: super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return MaterialButton(
|
||||
minWidth: 686.w,
|
||||
height: 97.w,
|
||||
onPressed: onTap,
|
||||
elevation: 0,
|
||||
child: Text(
|
||||
text,
|
||||
style: TextStyle(
|
||||
fontSize: 32.sp,
|
||||
),
|
||||
),
|
||||
disabledTextColor: Colors.black.withOpacity(0.45),
|
||||
disabledColor: Colors.black.withOpacity(0.06),
|
||||
color: kPrimaryColor,
|
||||
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(60.w)),
|
||||
);
|
||||
}
|
||||
}
|
@ -0,0 +1,66 @@
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
|
||||
class PsdTextField extends StatefulWidget {
|
||||
final TextEditingController controller;
|
||||
final String? hintText;
|
||||
|
||||
const PsdTextField({
|
||||
Key? key,
|
||||
required this.controller,
|
||||
this.hintText,
|
||||
}) : super(key: key);
|
||||
|
||||
@override
|
||||
_PsdTextFieldState createState() => _PsdTextFieldState();
|
||||
}
|
||||
|
||||
class _PsdTextFieldState extends State<PsdTextField> {
|
||||
bool visible = false;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Container(
|
||||
width: 686.w,
|
||||
height: 94.w,
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.circular(60.w),
|
||||
color: Colors.black.withOpacity(0.06),
|
||||
),
|
||||
child: TextField(
|
||||
maxLength: 20,
|
||||
onChanged: (text) {
|
||||
setState(() {});
|
||||
},
|
||||
controller: widget.controller,
|
||||
obscureText: !visible,
|
||||
obscuringCharacter: '*',
|
||||
decoration: InputDecoration(
|
||||
isDense: false,
|
||||
contentPadding:
|
||||
EdgeInsets.symmetric(horizontal: 24.w, vertical: 24.w),
|
||||
border: InputBorder.none,
|
||||
hintText: widget.hintText ?? '请输入密码',
|
||||
counterText: '',
|
||||
suffixIconConstraints:
|
||||
BoxConstraints(minHeight: 50.w, maxHeight: 50.w),
|
||||
suffixIcon: GestureDetector(
|
||||
onTap: () {
|
||||
visible = !visible;
|
||||
setState(() {});
|
||||
},
|
||||
child: Padding(
|
||||
padding: EdgeInsets.only(right: 20.w),
|
||||
child: Icon(
|
||||
visible ? CupertinoIcons.eye : CupertinoIcons.eye_slash,
|
||||
color: Colors.black.withOpacity(0.4),
|
||||
),
|
||||
),
|
||||
),
|
||||
hintStyle: TextStyle(
|
||||
color: Colors.black.withOpacity(0.25), fontSize: 28.sp)),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
@ -1,21 +1,25 @@
|
||||
import 'package:json_annotation/json_annotation.dart';
|
||||
|
||||
part 'base_model.g.dart';
|
||||
|
||||
@JsonSerializable()
|
||||
class BaseModel {
|
||||
int? code;
|
||||
String? message;
|
||||
bool? status;
|
||||
int code;
|
||||
String message;
|
||||
bool success;
|
||||
dynamic data;
|
||||
factory BaseModel.fromJson(Map<String, dynamic> json) =>
|
||||
_$BaseModelFromJson(json);
|
||||
BaseModel.err(
|
||||
{this.message = '未知错误',
|
||||
this.success = false,
|
||||
this.data = null,
|
||||
this.code = 0});
|
||||
|
||||
BaseModel({
|
||||
this.code,
|
||||
this.message,
|
||||
this.data,
|
||||
this.status,
|
||||
required this.code,
|
||||
required this.message,
|
||||
required this.success,
|
||||
required this.data,
|
||||
});
|
||||
|
||||
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,14 @@
|
||||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||
|
||||
part of 'base_model.dart';
|
||||
|
||||
// **************************************************************************
|
||||
// JsonSerializableGenerator
|
||||
// **************************************************************************
|
||||
|
||||
BaseModel _$BaseModelFromJson(Map<String, dynamic> json) => BaseModel(
|
||||
code: json['code'] as int,
|
||||
message: json['message'] as String,
|
||||
success: json['success'] as bool,
|
||||
data: json['data'],
|
||||
);
|
Loading…
Reference in new issue