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

调试接口

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