更新登录布局

This commit is contained in:
wyf
2025-06-07 18:00:29 +08:00
parent 48b3b06f17
commit 71a4504f78
17 changed files with 2651 additions and 108 deletions

View File

@@ -0,0 +1,189 @@
import 'package:ef/ef.dart';
import 'package:flutter/material.dart';
import 'package:flutterflow_ui/flutterflow_ui.dart';
import 'package:fluwx/fluwx.dart';
import 'package:json_annotation/json_annotation.dart';
import 'package:vbvs_app/common/util/MyUtils.dart';
import 'package:vbvs_app/component/tool/TopSlideNotification.dart';
import 'package:vbvs_app/pages/mh_page/user/controller/mht_register_controller.dart';
part 'mht_login_controller.g.dart';
@JsonSerializable()
class LoginModel {
//版本id
int? loginStyle = 1; //1.密码登录 2.短信登录
String? account = '17649984946'; //账户
// String? account = '13953240733'; //账户
String? password = 'wyf123,.'; //密码
// String? account = '15255134931'; //账户
// String? password = 'mht123,.'; //密码
// String? account = '18607922869'; //账户
// String? password = '373068'; //密码
// String? account = ''; //账户
// String? password = ''; //密码
String? phone; //手机号
String? code; //验证码
String? register_code;
bool? showPd = true;
int? forceLogin = 0;
bool? isIos; //是否为ios设备
bool? isWeChatNotInstalled; //是否安装微信
LoginModel();
static LoginModel fromJson(Map<String, dynamic> json) =>
_$LoginModelFromJson(json);
Map<String, dynamic> toJson() => _$LoginModelToJson(this);
}
class MHTLoginController extends GetControllerEx<LoginModel> {
// 初始化实例
final Fluwx fluwx = Fluwx();
// 微信监听返回值
FluwxCancelable? fluwxCancelable;
MHTLoginController() {
attr = GetModel(LoginModel()).obs;
}
MHTRegisterController registerController = Get.find();
//登录
Future<String> login(BuildContext context) async {
String message = '';
String account = '';
String password = '';
if (model.loginStyle == null) {
message = '请选择登录方式'.tr;
TopSlideNotification.show(context,
text: message, textColor: stringToColor("#FF7159"));
return message;
}
if (model.loginStyle == 1) {
//账号登录
if (model.account == null || model.account!.isEmpty) {
message = '账户不能为空'.tr;
TopSlideNotification.show(context,
text: message, textColor: stringToColor("#FF7159"));
return message;
}
if (model.password == null || model.password!.isEmpty) {
message = '密码不能为空'.tr;
TopSlideNotification.show(context,
text: message, textColor: stringToColor("#FF7159"));
return message;
}
account = model.account!;
password = model.password!;
}
if (model.loginStyle == 2) {
//账号登录
if (model.phone == null || model.phone!.isEmpty) {
message = '请输入手机号'.tr;
TopSlideNotification.show(context,
text: message, textColor: stringToColor("#FF7159"));
return message;
}
if (!MyUtils.isValidPhoneNumber(model.phone!)) {
message = '请输入正确的手机号'.tr;
TopSlideNotification.show(context,
text: message, textColor: stringToColor("#FF7159"));
return message;
}
if (model.code == null || model.code!.isEmpty) {
message = '验证码不能为空'.tr;
TopSlideNotification.show(context,
text: message, textColor: stringToColor("#FF7159"));
return message;
}
account = model.phone!;
password = model.code!;
}
if (registerController.model.register_agree == null ||
registerController.model.register_agree != true) {
message = "需要同意协议".tr;
showToast(message);
return message;
}
model.forceLogin = 0;
return message;
}
Future<String> getCode(BuildContext context) async {
String message = "";
if (registerController.model.register_agree == null ||
registerController.model.register_agree != true) {
message = "需要同意协议".tr;
showToast(message);
return message;
}
if (model.phone == null || model.phone!.isEmpty) {
message = "请输入手机号".tr;
showToast(message);
return message;
}
if (!MyUtils.isValidPhoneNumber(model.phone!)) {
message = '请输入正确的手机号'.tr;
showToast(message);
return message;
}
return '';
}
//微信登录
Future<void> wxLoginSendAuth() async {
/*
1、目前移动应用上微信登录只提供原生的登录方式需要用户安装微信客户端才能配合使用。
2、对于Android应用建议总是显示微信登录按钮当用户手机没有安装微信客户端时请引导用户下载安装微信客户端。
3、对于iOS应用考虑到iOS应用商店审核指南中的相关规定建议开发者接入微信登录时先检测用户手机是否已安装微信客户端
使用sdk中isWXAppInstalled函数 ),对未安装的用户隐藏微信登录按钮,只提供其他登录方式(比如手机号注册登录、游客登录等)
*/
if (isAndroid) {
bool isWeChatInstalled = await fluwx.isWeChatInstalled;
debugPrint('is wechat installed: $isWeChatInstalled');
if (!isWeChatInstalled) {
showToast("请先安装微信APP再使用微信登录");
return;
}
}
fluwx
.authBy(
which: NormalAuth(
scope: 'snsapi_userinfo',
state: 'wechat_sdk_zhmht_wxlogin',
))
.then((data) {
//返回true表示成功或者false表示失败这边没有意义从login_controller页面构造函数监听中去处理
debugPrint('msg:$data');
});
}
//退出登录
Future<void> logout() async {
// await repository.logout();
}
loginByWechatCode(String code) async {
// return await repository.loginByWechatCode(code);
}
//注销账号
deletedAccount() async {
// return await repository.deletedAccount();
}
}

View File

@@ -0,0 +1,33 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'mht_login_controller.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
LoginModel _$LoginModelFromJson(Map<String, dynamic> json) => LoginModel()
..loginStyle = (json['loginStyle'] as num?)?.toInt()
..account = json['account'] as String?
..password = json['password'] as String?
..phone = json['phone'] as String?
..code = json['code'] as String?
..register_code = json['register_code'] as String?
..showPd = json['showPd'] as bool?
..forceLogin = (json['forceLogin'] as num?)?.toInt()
..isIos = json['isIos'] as bool?
..isWeChatNotInstalled = json['isWeChatNotInstalled'] as bool?;
Map<String, dynamic> _$LoginModelToJson(LoginModel instance) =>
<String, dynamic>{
'loginStyle': instance.loginStyle,
'account': instance.account,
'password': instance.password,
'phone': instance.phone,
'code': instance.code,
'register_code': instance.register_code,
'showPd': instance.showPd,
'forceLogin': instance.forceLogin,
'isIos': instance.isIos,
'isWeChatNotInstalled': instance.isWeChatNotInstalled,
};

View File

@@ -0,0 +1,131 @@
import 'package:ef/ef.dart';
import 'package:flutter/src/widgets/framework.dart';
import 'package:json_annotation/json_annotation.dart';
import 'package:vbvs_app/common/util/MyUtils.dart';
import 'package:vbvs_app/component/tool/TopSlideNotification.dart';
part 'mht_register_controller.g.dart';
@JsonSerializable()
class RegisterModel {
String? register_phone; //注册手机号
String? register_pd; //注册密码
String? register_confirm_pd; //注册确认密码
String? register_code; //注册验证码
bool? register_agree = false; //注册协议
bool? save_password = false; //记住密码
bool? pdshow = true; //是否显示密码
bool? cpdshow = true; //是否显示密码
RegisterModel();
static RegisterModel fromJson(Map<String, dynamic> json) =>
_$RegisterModelFromJson(json);
Map<String, dynamic> toJson() => _$RegisterModelToJson(this);
}
class MHTRegisterController extends GetControllerEx<RegisterModel> {
MHTRegisterController() {
attr = GetModel(RegisterModel()).obs;
}
Future<String> registerUser(BuildContext context) async {
String message = "";
if (model.register_phone == null || model.register_phone!.isEmpty) {
message = "请输入手机号".tr;
TopSlideNotification.show(context,
text: message, textColor: stringToColor("#FF7159"));
return message;
}
if (!MyUtils.isValidPhoneNumber(model.register_phone!)) {
message = '请输入正确的手机号'.tr;
TopSlideNotification.show(context,
text: message, textColor: stringToColor("#FF7159"));
return message;
}
if (model.register_pd == null || model.register_pd!.isEmpty) {
message = "请输入密码".tr;
TopSlideNotification.show(context,
text: message, textColor: stringToColor("#FF7159"));
return message;
}
String passwordMsg = "密码格式提示".tr;
bool hasUppercase = model.register_pd!.contains(RegExp(r'[A-Z]'));
bool hasDigit = model.register_pd!.contains(RegExp(r'[0-9]'));
bool hasSpecialCharacters =
model.register_pd!.contains(RegExp(r'[!@#$%^&*(),.?":{}|<>]'));
bool hasLetter = model.register_pd!.contains(RegExp(r'[a-zA-Z]'));
if (model.register_pd!.length < 8) {
message = passwordMsg;
TopSlideNotification.show(context,
text: message, textColor: stringToColor("#FF7159"));
return message;
}
if (!hasLetter || !hasDigit) {
message = passwordMsg;
TopSlideNotification.show(context,
text: message, textColor: stringToColor("#FF7159"));
return message;
}
if (!(hasSpecialCharacters || hasUppercase)) {
message = passwordMsg;
TopSlideNotification.show(context,
text: message, textColor: stringToColor("#FF7159"));
return message;
}
if (model.register_confirm_pd == null ||
model.register_confirm_pd!.isEmpty) {
message = "请输入确认密码".tr;
TopSlideNotification.show(context,
text: message, textColor: stringToColor("#FF7159"));
return message;
}
if (model.register_pd != model.register_confirm_pd) {
message = "两次密码不一致".tr;
TopSlideNotification.show(context,
text: message, textColor: stringToColor("#FF7159"));
return message;
}
if (model.register_code == null || model.register_code!.isEmpty) {
message = "请输入验证码".tr;
TopSlideNotification.show(context,
text: message, textColor: stringToColor("#FF7159"));
return message;
}
if (model.register_agree == null || model.register_agree != true) {
message = "需要同意协议".tr;
TopSlideNotification.show(context,
text: message, textColor: stringToColor("#FF7159"));
return message;
}
// message = await repository.createUser(
// model.register_pd!, model.register_phone!, model.register_code!);
// if (message.isNotEmpty) {
// showToast(message);
// return message;
// }
return "";
}
Future<String> getCode(BuildContext context) async {
String message = "";
if (model.register_phone == null || model.register_phone!.isEmpty) {
message = "请输入手机号".tr;
TopSlideNotification.show(context,
text: message, textColor: stringToColor("#FF7159"));
return message;
}
if (!MyUtils.isValidPhoneNumber(model.register_phone!)) {
message = '请输入正确的手机号'.tr;
TopSlideNotification.show(context,
text: message, textColor: stringToColor("#FF7159"));
return message;
}
return '';
}
}

View File

@@ -0,0 +1,28 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'mht_register_controller.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
RegisterModel _$RegisterModelFromJson(Map<String, dynamic> json) =>
RegisterModel()
..register_phone = json['register_phone'] as String?
..register_pd = json['register_pd'] as String?
..register_confirm_pd = json['register_confirm_pd'] as String?
..register_code = json['register_code'] as String?
..register_agree = json['register_agree'] as bool?
..pdshow = json['pdshow'] as bool?
..cpdshow = json['cpdshow'] as bool?;
Map<String, dynamic> _$RegisterModelToJson(RegisterModel instance) =>
<String, dynamic>{
'register_phone': instance.register_phone,
'register_pd': instance.register_pd,
'register_confirm_pd': instance.register_confirm_pd,
'register_code': instance.register_code,
'register_agree': instance.register_agree,
'pdshow': instance.pdshow,
'cpdshow': instance.cpdshow,
};