提交 0f979ee6 authored 作者: yueweilu's avatar yueweilu

调试接口

上级 b9e13fce
......@@ -9,9 +9,9 @@ abstract class AccountAPI {
String? password,
String? code,
}) async {
assert((password != null && code == null) ||
(password == null && code != null),
'Provide either a password or a verification code, not both.');
// assert((password != null && code == null) ||
// (password == null && code != null),
// 'Provide either a password or a verification code, not both.');
Map<String,dynamic> params = {
'phone' : phone,
......@@ -24,7 +24,7 @@ abstract class AccountAPI {
}
// 验证码登录
if(type == '2'){
params['password'] = password;
params['code'] = code;
}
final result = await HttpService.to.post(
'/v1/members/login/login',
......@@ -39,7 +39,6 @@ abstract class AccountAPI {
/// 退出登录
static Future logout() async{
print('--------------------------------logout');
final result = await HttpService.to.post(
'/v1/members/login/logout',
params: {}
......@@ -50,6 +49,18 @@ abstract class AccountAPI {
return false;
}
/// 注销
static Future delete() async{
final result = await HttpService.to.post(
'/v1/members/login/del',
params: {}
);
if (result.data is Map && result.data['is_success'] == 1){
return true;
}
return false;
}
/// 发送验证码
static Future sendCode({
required String phone,
......@@ -57,10 +68,44 @@ abstract class AccountAPI {
}) async {
final result = await HttpService.to.post(
'/v1/members/login/sendCode',
params: {
'phone': phone,
'types': type
},
excludeToken: true,
showLoading: true,
);
if (result.data is Map && result.data['is_success'] == 1){
return true;
}
return false;
}
/// 重置密码
static Future resetPassword({
required String phone,
required String code,
required String password,
required String rePassword,
}) async {
final result = await HttpService.to.post(
'/v1/members/login/editPassword',
params: {
'phone': phone,
'code': code,
'password': password,
'repassword': rePassword
},
excludeToken: true,
showLoading: true,
);
if (result.data is Map && result.data['is_success'] == 1){
return true;
}
return false;
}
......
......@@ -10,6 +10,7 @@ import 'package:flutter_book/theme.dart';
import 'package:flutter_book/widgets/index.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:oktoast/oktoast.dart';
import 'package:pull_to_refresh_flutter3/pull_to_refresh_flutter3.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
......@@ -49,7 +50,13 @@ class MyApp extends StatelessWidget {
builder: (context, child) {
return ScrollConfiguration(
behavior: _NoShadowScrollBehavior(),
child: OKToast(
radius: 8.0,
backgroundColor: AppTheme.primary,
textPadding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 10.0),
position: ToastPosition.bottom,
child: child ?? const Material(),
),
);
},
),
......
......@@ -43,7 +43,7 @@ class ForgetPwdController extends GetxController {
}
void setCanClick(){
if (phoneInput.text.length == 11 && codeInput.text.length == 4){
if (phoneInput.text.length == 11 && codeInput.text.length == 6){
_enable = true;
}
else{
......@@ -73,4 +73,17 @@ class ForgetPwdController extends GetxController {
_isCounting = false;
super.onClose();
}
void sendCode() async {
final result = await AccountAPI.sendCode(phone: phoneInput.text, type: 'login');
if (result){
Toast.show('发送成功');
start();
}
else{
Toast.show('发送失败');
}
}
}
\ No newline at end of file
......@@ -8,6 +8,7 @@ import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:go_router/go_router.dart';
import '../../apis/index.dart';
import '../../routes/index.dart';
import '../../theme.dart';
import '../../utils/index.dart';
......
......@@ -58,7 +58,9 @@ class _ForgetPwdPageState extends State<ForgetPwdPage> {
color: Colors.yellow,
child: Text(controller.isCounting?'${controller.countDown}':'获取验证码',style: const TextStyle(fontSize: 11,color: AppTheme.primary,height: 1.4),)),
onTap: (){
controller.start();
if (controller.isCounting == false){
controller.sendCode();
}
},
),
],
......@@ -69,9 +71,9 @@ class _ForgetPwdPageState extends State<ForgetPwdPage> {
Gaps.vGaps40,
CustomGradientButton(
text: '下一步',
isEnabled: !controller.enable,
isEnabled: controller.enable,
onPressed: () {
context.pushNamed(Routes.resetPwd);
context.pushNamed(Routes.resetPwd,queryParameters: {'phone': controller.phoneInput.text,'code': controller.codeInput.text});
},
)
],
......
......@@ -34,6 +34,7 @@ class LoginController extends GetxController {
bool get agree => _agree;
void setAgree() {
_agree = !_agree;
update();
}
// 开启定时器
......@@ -103,12 +104,22 @@ class LoginController extends GetxController {
/// 登录
void onLogin(BuildContext context) async {
if (!agree) {
Toast.show('请先阅读并同意《用户协议》和《隐私政策》');
return;
}
String type = '1';
if (loginType == 1) {
type = '2';
}
final result = await AccountAPI.login(
phone: phoneInput.text,
password: EncryptUtil.encodeMd5(EncryptUtil.encodeMd5(passwordInput.text)),
type: '1'
code: codeInput.text,
type: type
);
if((result.token ?? '').isEmpty) return;
......@@ -132,4 +143,16 @@ class LoginController extends GetxController {
}
void sendCode() async {
final result = await AccountAPI.sendCode(phone: phoneInput.text, type: 'login');
if (result){
Toast.show('发送成功');
start();
}
else{
Toast.show('发送失败');
}
}
}
\ No newline at end of file
......@@ -16,6 +16,7 @@ import 'package:get/get_state_manager/src/simple/get_controllers.dart';
import 'package:go_router/go_router.dart';
import 'package:ionicons/ionicons.dart';
import '../../models/user_model.dart';
import '../../routes/index.dart';
import '../../services/index.dart';
import '../../widgets/index.dart';
......
......@@ -20,6 +20,7 @@ class _LoginPageState extends State<LoginPage> {
builder:(controller) => GestureDetector(
onTap: () => Tools.unfocus(),
child: Scaffold(
resizeToAvoidBottomInset: false,
appBar: CustomAppBar(
systemOverlayStyle: Theme.of(context).brightness == Brightness.light
? SystemUiOverlayStyle.dark
......@@ -89,7 +90,11 @@ class _LoginPageState extends State<LoginPage> {
obscureText: !value,
hintText: '请输入密码',
iconData:
value ? Icons.visibility : Icons.visibility_off,
value ? Image.asset(
'assets/images/eye_open.png',
) : Image.asset(
'assets/images/eye_close.png',
),
controller: controller.passwordInput,
onChanged: (text){
controller.setCanClick();
......@@ -115,10 +120,12 @@ class _LoginPageState extends State<LoginPage> {
GestureDetector(
child: Container(
padding: const EdgeInsets.symmetric(vertical: 10),
color: Colors.yellow,
// color: Colors.yellow,
child: Text(controller.isCounting?'${controller.countDown}':'获取验证码',style: const TextStyle(fontSize: 11,color: AppTheme.primary,height: 1.4),)),
onTap: (){
controller.start();
if (controller.isCounting == false){
controller.sendCode();
}
},
),
],
......@@ -171,19 +178,24 @@ class _LoginPageState extends State<LoginPage> {
),
Row(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
GestureDetector(
onTap: (){
///TODO: 同意协议
controller.setAgree();
},
child: Row(
children: [
Container(
SizedBox(
width: 10.w,
height: 10.w,
color: AppTheme.primary,
// color: AppTheme.primary,
child: Image.asset(
controller.agree?'assets/images/check_box_select.png':'assets/images/uncheck.png',
),
Gaps.hGaps10,
),
Gaps.hGaps5,
const Text('我已阅读并同意',style: TextStyle(color: Colours.c9,fontSize:10)),
],
),
......
part of reset_pwd;
class ResetPwdController extends GetxController {
final String phone;
final String code;
ResetPwdController({required this.phone, required this.code});
// 新密码
final TextEditingController pwdInput = TextEditingController();
// 确认密码
......@@ -19,7 +24,8 @@ class ResetPwdController extends GetxController {
void onShowPassword2() => showPassword2.value = !showPassword2.value;
void setCanClick(){
if (pwdInput.text == pwd2Input.text){
if (ValidatorTool.isValidPassword(pwdInput.text) && ValidatorTool.isValidPassword(pwd2Input.text) && (pwdInput.text == pwd2Input.text)){
Console.log('-------${pwdInput.text}-------------${pwd2Input.text}');
_enable = true;
}
else{
......@@ -36,4 +42,21 @@ class ResetPwdController extends GetxController {
pwdInput.dispose();
super.onClose();
}
void resetPassword(BuildContext context) async {
final result = await AccountAPI.resetPassword(
phone: phone,
code: code,
password: pwdInput.text,
rePassword: pwd2Input.text
);
if (result){
if (context.mounted){
context.goNamed(Routes.login);
}
}
else{
}
}
}
......@@ -4,7 +4,10 @@ import 'package:flutter_book/utils/index.dart';
import 'package:get/get.dart';
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import '../../apis/index.dart';
import '../../routes/index.dart';
import '../../widgets/index.dart';
......
part of reset_pwd;
class ResetPwdPage extends StatefulWidget {
const ResetPwdPage({Key? key}) : super(key: key);
final String phone;
final String code;
const ResetPwdPage({
Key? key ,
required this.phone,
required this.code,
}) : super(key: key);
// const ResetPwdPage({Key? key}) : super(key: key);
@override
State<ResetPwdPage> createState() => _ResetPwdPageState();
......@@ -11,7 +18,7 @@ class _ResetPwdPageState extends State<ResetPwdPage> {
@override
Widget build(BuildContext context) {
return GetBuilder<ResetPwdController>(
init: ResetPwdController(),
init: ResetPwdController(phone: widget.phone, code: widget.code),
builder: (controller) =>Scaffold(
appBar: AppBar(
centerTitle: true,
......@@ -28,7 +35,11 @@ class _ResetPwdPageState extends State<ResetPwdPage> {
obscureText: !value,
hintText: '请输入新密码',
iconData:
value ? Icons.visibility : Icons.visibility_off,
value ? Image.asset(
'assets/images/eye_open.png',
) : Image.asset(
'assets/images/eye_close.png',
),
controller: controller.pwdInput,
onChanged: (text){
controller.setCanClick();
......@@ -36,13 +47,18 @@ class _ResetPwdPageState extends State<ResetPwdPage> {
onIcon: controller.onShowPassword,
),
),
Gaps.vGaps10,
ValueListenableBuilder<bool>(
valueListenable: controller.showPassword2,
builder:(context, value, child) => CustomFormInput(
obscureText: !value,
hintText: '请再次输入密码',
iconData:
value ? Icons.visibility : Icons.visibility_off,
value ? Image.asset(
'assets/images/eye_open.png',
) : Image.asset(
'assets/images/eye_close.png',
),
controller: controller.pwd2Input,
onChanged: (text){
controller.setCanClick();
......@@ -53,6 +69,15 @@ class _ResetPwdPageState extends State<ResetPwdPage> {
Container(
margin: const EdgeInsets.only(left: 5,top: 5),
child: const Text('密码必须是6-20个英文字母、数字或符号',style: TextStyle(fontSize: 10,color: Colours.c9),),
),
Gaps.vGaps40,
CustomGradientButton(
text: '确认修改',
isEnabled: controller.enable,
onPressed: () {
controller.resetPassword(context);
// context.goNamed(Routes.login);
},
)
],
),
......
......@@ -125,7 +125,10 @@ abstract class Routes {
pageBuilder: (context, state) =>CupertinoPage(
name: state.uri.toString(),
key: state.pageKey,
child: const ResetPwdPage()
child: ResetPwdPage(
phone: state.uri.queryParameters['phone'].toString(),
code: state.uri.queryParameters['code'].toString(),
)
)
),
GoRoute(
......
......@@ -84,6 +84,8 @@ class HttpService extends GetxService {
try {
final requestOptions = options ?? Options();
requestOptions.headers = _getHeaders(excludeToken: excludeToken,params: params,url: url);
Console.log('----headers------${requestOptions.headers}');
Console.log('----params------$params');
final response = await _dio.post(
url,
data: params,
......
......@@ -10,6 +10,7 @@ import 'package:intl/intl.dart';
import 'package:logger/logger.dart';
import 'package:crypto/crypto.dart';
import 'package:convert/convert.dart';
import 'package:oktoast/oktoast.dart';
part 'constants.dart';
......@@ -21,3 +22,4 @@ part 'encrypt_util.dart';
part 'tools.dart';
part 'styles.dart';
part 'validator.dart';
part 'toast_utils.dart';
part of utils;
/// Toast工具类
class Toast {
static void show(String msg, {int duration = 2000}) {
if (msg == null) {
return;
}
showToast(
msg,
duration: Duration(milliseconds: duration),
dismissOtherToast: true
);
}
static void cancelToast() {
dismissAllToast();
}
}
......@@ -10,7 +10,7 @@ class CustomFormInput extends FormField<String> {
final bool readOnly;
final bool obscureText;
final bool autofocus;
final IconData? iconData;
final Widget? iconData;
final int? maxLines;
final void Function()? onTap;
final void Function()? onIcon;
......@@ -183,7 +183,7 @@ class CustomInput extends StatelessWidget {
final bool required;
final bool readOnly;
final bool obscureText;
final IconData? iconData;
final Widget? iconData;
final int? minLines;
final int? maxLines;
final void Function()? onTap;
......@@ -316,7 +316,11 @@ class CustomInput extends StatelessWidget {
),
child: GestureDetector(
onTap: onIcon,
child: Icon(iconData!, size: 24.w),
child: SizedBox(
width: 24,
height: 24,
child: iconData,
)
),
);
}
......
......@@ -365,6 +365,14 @@ packages:
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.0.0"
oktoast:
dependency: "direct main"
description:
name: oktoast
sha256: f1366c5c793ddfb8f55bc6fc3e45db43c45debf173b765fb4c5ec096cbdeb84a
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.4.0"
path:
dependency: transitive
description:
......
......@@ -77,6 +77,8 @@ dependencies:
carousel_slider: 4.2.1
# 评星
flutter_star: ^1.2.0
# toast
oktoast: ^3.0.0
dev_dependencies:
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论