From a8af424561e3f05904d54e86c790ea86847b8e8d Mon Sep 17 00:00:00 2001 From: zhangmeng <494089941@qq.com> Date: Sun, 25 Apr 2021 17:04:33 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=B3=A8=E9=94=80=E9=AA=8C?= =?UTF-8?q?=E8=AF=81=E7=A0=81=E5=8A=9F=E8=83=BD=20=E5=AF=B9=E6=8E=A5?= =?UTF-8?q?=EF=BC=9A=E5=8F=91=E9=80=81=E6=B3=A8=E9=94=80=E9=AA=8C=E8=AF=81?= =?UTF-8?q?=E7=A0=81=20=E5=AF=B9=E6=8E=A5=EF=BC=9A=E6=B3=A8=E9=94=80?= =?UTF-8?q?=E8=B4=A6=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/constants/api_v2.dart | 6 + .../delete_account_page.dart | 63 ++--- .../delete_account_validation_page.dart | 221 ++++++++++++++++++ 3 files changed, 260 insertions(+), 30 deletions(-) create mode 100644 lib/pages/user/account_and_safety/delete_account_validation_page.dart diff --git a/lib/constants/api_v2.dart b/lib/constants/api_v2.dart index e018cb2..d415ea8 100644 --- a/lib/constants/api_v2.dart +++ b/lib/constants/api_v2.dart @@ -96,6 +96,12 @@ class UserAPI { ///二维码扫描 String get getScanResult => '/v2/app/operate/scan'; + + ///注销短信发送 + String get getDeleteMessage => '/v2/app/message/destroy/send'; + + ///注销账户 + String get deleteAccount => '/v2/app/user/operation/destroy'; } class BenefitAPI { diff --git a/lib/pages/user/account_and_safety/delete_account_page.dart b/lib/pages/user/account_and_safety/delete_account_page.dart index 4eb74e2..d374169 100644 --- a/lib/pages/user/account_and_safety/delete_account_page.dart +++ b/lib/pages/user/account_and_safety/delete_account_page.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; +import 'package:get/get.dart'; import 'package:oktoast/oktoast.dart'; @@ -7,6 +8,7 @@ import 'package:recook/constants/api.dart'; import 'package:recook/constants/header.dart'; import 'package:recook/manager/http_manager.dart'; import 'package:recook/manager/user_manager.dart'; +import 'package:recook/pages/user/account_and_safety/delete_account_validation_page.dart'; import 'package:recook/widgets/alert.dart'; import 'package:recook/widgets/custom_app_bar.dart'; @@ -55,36 +57,37 @@ class _DeleteAccountPageState extends State { padding: EdgeInsets.zero, color: Color(0xFFF0F0F0), onPressed: () { - showDialog( - context: context, - builder: (context) => NormalTextDialog( - title: '注销提示', - content: '确定注销账户?', - items: ['取消'], - type: NormalTextDialogType.delete, - listener: (index) { - switch (index) { - case 0: - Navigator.pop(context); - break; - } - }, - deleteItem: '确定', - deleteListener: () { - //TODO 注销账号 - HttpManager.post(UserApi.deleteAccount, { - "user_id": UserManager.instance.user.info.id, - }).then((value) { - if (value.data['code'] == "SUCCESS") { - UserManager.logout(); - } else { - showToast('注销失败${value.data['msg']}'); - Navigator.pop(context); - } - }); - }, - ), - ); + Get.to(() => DeleteAcountValidationPage()); + // showDialog( + // context: context, + // builder: (context) => NormalTextDialog( + // title: '注销提示', + // content: '确定注销账户?', + // items: ['取消'], + // type: NormalTextDialogType.delete, + // listener: (index) { + // switch (index) { + // case 0: + // Navigator.pop(context); + // break; + // } + // }, + // deleteItem: '确定', + // deleteListener: () { + // //TODO 注销账号 + // HttpManager.post(UserApi.deleteAccount, { + // "user_id": UserManager.instance.user.info.id, + // }).then((value) { + // if (value.data['code'] == "SUCCESS") { + // UserManager.logout(); + // } else { + // showToast('注销失败${value.data['msg']}'); + // Navigator.pop(context); + // } + // }); + // }, + // ), + // ); }, textColor: Color(0xFF666666), child: Padding( diff --git a/lib/pages/user/account_and_safety/delete_account_validation_page.dart b/lib/pages/user/account_and_safety/delete_account_validation_page.dart new file mode 100644 index 0000000..a4512bb --- /dev/null +++ b/lib/pages/user/account_and_safety/delete_account_validation_page.dart @@ -0,0 +1,221 @@ +import 'dart:async'; + +import 'package:flustars/flustars.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:get/get.dart'; +import 'package:pin_input_text_field/pin_input_text_field.dart'; +import 'package:recook/constants/api_v2.dart'; +import 'package:recook/manager/http_manager.dart'; +import 'package:recook/manager/user_manager.dart'; +import 'package:recook/models/base_model.dart'; +import 'package:recook/pages/tabBar/TabbarWidget.dart'; +import 'package:recook/widgets/alert.dart'; +import 'package:recook/widgets/progress/re_toast.dart'; +import 'package:recook/widgets/recook/recook_scaffold.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:velocity_x/velocity_x.dart'; + +class DeleteAcountValidationPage extends StatefulWidget { + DeleteAcountValidationPage({Key key}) : super(key: key); + + @override + _DeleteAcountValidationPageState createState() => + _DeleteAcountValidationPageState(); +} + +class _DeleteAcountValidationPageState + extends State { + TextEditingController _controller = TextEditingController(); + Timer _timer; + int _timeCount = 60; + + @override + void initState() { + super.initState(); + } + + @override + void dispose() { + super.dispose(); + _timer?.cancel(); + _timer = null; + } + + @override + Widget build(BuildContext context) { + return RecookScaffold( + title: '身份验证', + body: Center( + child: Column( + children: [ + 64.w.heightBox, + '请输入短信验证码'.text.color(Color(0xFF333333)).size(60.sp).make(), + 30.w.heightBox, + '我们将发送短信验证码到你的手机号'.text.color(Color(0xFF888888)).size(34.sp).make(), + hidePhone(UserManager.instance.user.info.phone) + .text + .color(Color(0xFF333333)) + .size(48.sp) + .make(), + 72.w.heightBox, + _validationCode(), + 28.w.heightBox, + _sendMessage(), + ], + ), + ), + bottomNavi: _bottomButton(), + ); + } + + Widget _bottomButton() { + return MaterialButton( + padding: EdgeInsets.symmetric(vertical: 22.w), + minWidth: 686.w, + height: 94.w, + color: Color(0xFFD5101A), + onPressed: () { + if (_controller.text.isEmptyOrNull) { + ReToast.err(text: '验证码不能为空'); + } else { + _showDeleteDialog(); + } + }, + child: '下一步'.text.color(Colors.white).size(36.sp).make(), + ).pOnly(bottom: MediaQuery.of(context).padding.bottom); + } + + String hidePhone(String phone) { + if (phone.length != 11) { + return '手机号不正确'; + } else { + return phone.substring(0, 3) + '****' + phone.substring(7, 11); + } + } + + _showDeleteDialog() { + return showDialog( + context: context, + builder: (context) => NormalTextDialog( + title: '注销提示', + content: '确定注销账户?', + items: ['取消'], + type: NormalTextDialogType.delete, + listener: (index) { + switch (index) { + case 0: + Get.offAll(() => TabBarWidget()); + break; + } + }, + deleteItem: '确定', + deleteListener: () { + _deleteAcount(); + }, + ), + ); + } + + Future _deleteAcount() async { + ResultData resultData = + await HttpManager.post(APIV2.userAPI.deleteAccount, { + "user_id": UserManager.instance.user.info.id, + "code": _controller.text, + }); + + if (!resultData.result) { + _controller?.clear(); + ReToast.err(text: resultData.msg); + return; + } + BaseModel baseModel = BaseModel.fromJson(resultData.data); + if (baseModel.code != HttpStatus.SUCCESS) { + _controller?.clear(); + ReToast.err(text: resultData.msg); + return; + } + UserManager.logout(); + } + + Widget _validationCode() { + return SizedBox( + height: 112.w, + width: 300.w + 114.w * 2, + child: PinInputTextField( + controller: _controller, + decoration: BoxLooseDecoration( + radius: Radius.circular(0), + bgColorBuilder: FixedColorBuilder(Colors.white), + strokeColorBuilder: FixedColorBuilder( + Color(0xFFAAAAAA), + ), + textStyle: TextStyle( + color: Color(0xFF000000), + fontSize: 80.sp, + // fontWeight: FontWeight.bold, + ), + ), + cursor: Cursor( + color: Colors.black, + height: 80.w, + enabled: true, + width: 2.w, + ), + pinLength: 4, + keyboardType: TextInputType.number, + onChanged: (value) { + setState(() {}); + }, + inputFormatters: [ + FilteringTextInputFormatter.digitsOnly, + LengthLimitingTextInputFormatter(4), + ], + ), + ); + } + + Widget _sendMessage() { + return GestureDetector( + onTap: _timer != null + ? null + : () async { + await _getValidationCode(); + }, + child: '${_timer != null ? '验证码已发送' : '点击发送验证码'}' + .text + .color(Color(0xFFD5101A)) + .size(34.sp) + .make()); + } + + Future _getValidationCode() async { + ResultData resultData = + await HttpManager.post(APIV2.userAPI.getDeleteMessage, null); + if (!resultData.result) { + ReToast.err(text: resultData.msg); + return; + } + BaseModel baseModel = BaseModel.fromJson(resultData.data); + if (baseModel.code != HttpStatus.SUCCESS) { + ReToast.err(text: resultData.msg); + return; + } + startTimer(); + ReToast.success(text: '发送成功'); + } + + startTimer() { + _timer = Timer.periodic(Duration(milliseconds: 1000), (timer) { + if (_timeCount <= 0) { + _timeCount = 60; + _controller?.clear(); + _timer.cancel(); + _timer = null; + setState(() {}); + } + _timeCount--; + setState(() {}); + }); + } +}