注册,注销账号

This commit is contained in:
machuanyu 2024-04-26 17:31:03 +08:00
parent 02cb205126
commit 8d1de06f14
10 changed files with 762 additions and 36 deletions

View File

@ -33,6 +33,12 @@ mixin CommonMixin {
return RestClientReport(dio, baseUrl: RequestConfig().baseUrlOfReport);
}
// CLIENT
Future<RestClient> getClientLogin() async {
Dio dio = await getDio();
return RestClient(dio, baseUrl: RequestConfig().loginBaseUrl);
}
void setTimeOut(int seconds, call) => Future.delayed(Duration(seconds: seconds), call);
// context

View File

@ -44,8 +44,10 @@ class _TheLoginState extends ConsumerState<TheLogin> with CommonMixin {
//
setHttpsPEM() async {
(dio.httpClientAdapter as DefaultHttpClientAdapter).onHttpClientCreate = (client) {
client.badCertificateCallback = (X509Certificate cert, String host, int port) {
(dio.httpClientAdapter as DefaultHttpClientAdapter).onHttpClientCreate =
(client) {
client.badCertificateCallback =
(X509Certificate cert, String host, int port) {
return true;
};
};
@ -63,6 +65,7 @@ class _TheLoginState extends ConsumerState<TheLogin> with CommonMixin {
bool canLogin = true;
bool hasNameVal = false;
bool _isShowPwd = true;
bool showRegister = false;
void _showPassword() {
setState(() {
@ -77,7 +80,7 @@ class _TheLoginState extends ConsumerState<TheLogin> with CommonMixin {
// Provider
ref.read(userTokenProvider.notifier).clean(); //
});
getShowRegister();
super.initState();
dio = Dio(
BaseOptions(
@ -86,12 +89,14 @@ class _TheLoginState extends ConsumerState<TheLogin> with CommonMixin {
receiveTimeout: 8000,
),
);
dio.interceptors.add(LogInterceptor(responseBody: true, requestBody: true)); //
dio.interceptors
.add(LogInterceptor(responseBody: true, requestBody: true)); //
setHttpsPEM();
client = RestClient(dio, baseUrl: RequestConfig().loginBaseUrl);
_userNameController = TextEditingController()..addListener(userNameListener);
_userNameController = TextEditingController()
..addListener(userNameListener);
_passwordController = TextEditingController();
_pwdFocus = FocusNode();
_theFocus = FocusNode();
@ -106,11 +111,23 @@ class _TheLoginState extends ConsumerState<TheLogin> with CommonMixin {
});
}
void getShowRegister() async {
RestClient client = await getClientLogin();
BaseStructureResult<dynamic> resultData = await client.showRegister();
if(resultData.success){
setState(() {
showRegister = resultData.data;
});
}
}
void userNameListener() {
String userName = _userNameController.text;
int useNameLength = userName.length;
bool hasNameValNew = useNameLength > 0;
if (hasNameValNew != hasNameVal) toUpState(setState, () => hasNameVal = hasNameValNew, mounted);
if (hasNameValNew != hasNameVal)
toUpState(setState, () => hasNameVal = hasNameValNew, mounted);
const isProd = bool.fromEnvironment('dart.vm.product');
if (!isProd && useNameLength == 11) {
_passwordController.text = userName.substring(useNameLength - 6);
@ -165,12 +182,15 @@ class _TheLoginState extends ConsumerState<TheLogin> with CommonMixin {
child: SizedBox(
height: 86.w,
width: 86.w,
child: Image.asset('assets/images/logo.png', fit: BoxFit.cover),
child: Image.asset('assets/images/logo.png',
fit: BoxFit.cover),
),
),
Container(
margin: EdgeInsets.symmetric(horizontal: 32.w, vertical: 24.h),
padding: EdgeInsets.only(top: 34.h, bottom: 16.h, left: 22.w, right: 22.w),
margin: EdgeInsets.symmetric(
horizontal: 32.w, vertical: 24.h),
padding: EdgeInsets.only(
top: 34.h, bottom: 16.h, left: 22.w, right: 22.w),
decoration: BoxDecoration(
color: Colors.white,
border: Border.all(width: 1.w, color: Colors.white),
@ -199,13 +219,18 @@ class _TheLoginState extends ConsumerState<TheLogin> with CommonMixin {
),
decoration: InputDecoration(
hintText: "请输入账号",
hintStyle: TextStyle(fontSize: 16.sp, color: const Color.fromRGBO(153, 153, 153, 1)),
hintStyle: TextStyle(
fontSize: 16.sp,
color: const Color.fromRGBO(153, 153, 153, 1)),
labelText: "账号",
labelStyle: TextStyle(fontSize: 16.sp, color: const Color.fromRGBO(148, 163, 182, 1)),
labelStyle: TextStyle(
fontSize: 16.sp,
color: const Color.fromRGBO(148, 163, 182, 1)),
suffixIcon: !hasNameVal
? null
: Transform.translate(
offset: Offset(10, 10), // padding值来设置偏移量
offset:
Offset(10, 10), // padding值来设置偏移量
child: IconButton(
alignment: Alignment.center,
padding: EdgeInsets.zero,
@ -227,7 +252,8 @@ class _TheLoginState extends ConsumerState<TheLogin> with CommonMixin {
controller: _passwordController,
keyboardType: TextInputType.number,
maxLines: 1,
obscureText: _isShowPwd, //
obscureText: _isShowPwd,
//
textInputAction: TextInputAction.go,
onSubmitted: (val) => toLogin(),
style: TextStyle(
@ -240,13 +266,19 @@ class _TheLoginState extends ConsumerState<TheLogin> with CommonMixin {
onTap: _showPassword,
child: Icon(
Icons.remove_red_eye,
color: !_isShowPwd ? Theme.of(context).primaryColor : Colors.grey,
color: !_isShowPwd
? Theme.of(context).primaryColor
: Colors.grey,
),
),
hintStyle: TextStyle(fontSize: 16.sp, color: const Color.fromRGBO(153, 153, 153, 1)),
hintStyle: TextStyle(
fontSize: 16.sp,
color: const Color.fromRGBO(153, 153, 153, 1)),
labelText: "密码",
isDense: true,
labelStyle: TextStyle(fontSize: 16.sp, color: const Color.fromRGBO(148, 163, 182, 1)),
labelStyle: TextStyle(
fontSize: 16.sp,
color: const Color.fromRGBO(148, 163, 182, 1)),
),
),
SizedBox(
@ -262,8 +294,10 @@ class _TheLoginState extends ConsumerState<TheLogin> with CommonMixin {
checkColor: Colors.white,
value: keepPwd,
onChanged: (value) {
FocusScope.of(context).requestFocus(_pwdFocus);
FocusScope.of(context).requestFocus(_theFocus);
FocusScope.of(context)
.requestFocus(_pwdFocus);
FocusScope.of(context)
.requestFocus(_theFocus);
setState(() {
keepPwd = value ?? false;
});
@ -284,6 +318,20 @@ class _TheLoginState extends ConsumerState<TheLogin> with CommonMixin {
),
),
),
Spacer(),
if (showRegister == true)
InkWell(
onTap: () {
RouterManager.router.navigateTo(
context, RouterManager.registerPath);
},
child: Text(
'注册',
style: TextStyle(
fontSize: 14.sp,
color: const Color.fromRGBO(
148, 163, 182, 1)),
)),
],
),
InkWell(
@ -291,7 +339,9 @@ class _TheLoginState extends ConsumerState<TheLogin> with CommonMixin {
child: Container(
margin: EdgeInsets.symmetric(vertical: 10.h),
decoration: BoxDecoration(
color: canLogin ? const Color.fromRGBO(9, 105, 246, 1) : Colors.grey,
color: canLogin
? const Color.fromRGBO(9, 105, 246, 1)
: Colors.grey,
boxShadow: [
BoxShadow(
color: const Color.fromRGBO(46, 91, 255, 0.5),
@ -309,7 +359,8 @@ class _TheLoginState extends ConsumerState<TheLogin> with CommonMixin {
height: 50.h,
child: Text(
'登 录',
style: TextStyle(fontSize: 16.sp, color: Colors.white),
style: TextStyle(
fontSize: 16.sp, color: Colors.white),
),
),
),
@ -323,8 +374,10 @@ class _TheLoginState extends ConsumerState<TheLogin> with CommonMixin {
checkColor: Colors.white,
value: readAgreement,
onChanged: (value) {
FocusScope.of(context).requestFocus(_pwdFocus);
FocusScope.of(context).requestFocus(_theFocus);
FocusScope.of(context)
.requestFocus(_pwdFocus);
FocusScope.of(context)
.requestFocus(_theFocus);
setState(() {
readAgreement = value ?? false;
});
@ -402,18 +455,26 @@ class _TheLoginState extends ConsumerState<TheLogin> with CommonMixin {
if (!readAgreement) return toMsg('请勾选我已阅读用户协议和隐私协议');
String userPwdMd5 = CommonUtils.generateMD5(userPwd);
print('userPwdMd5=$userPwdMd5');
EasyLoading.show(status: 'loading...');
try {
BaseStructureResult<dynamic> resultData = await client.toLogin(UserLoginParams(userName, userPwdMd5));
UserLogin? userData = resultData.code == 200 && resultData.data != null ? UserLogin.fromJson(resultData.data) : null;
if (resultData.code != 200 || userData?.accessToken == null || userData?.accessToken == '') {
BaseStructureResult<dynamic> resultData =
await client.toLogin(UserLoginParams(userName, userPwdMd5));
UserLogin? userData = resultData.code == 200 && resultData.data != null
? UserLogin.fromJson(resultData.data)
: null;
if (resultData.code != 200 ||
userData?.accessToken == null ||
userData?.accessToken == '') {
return toMsg(resultData.message ?? '登录失败,请重试');
}
FastData fastData = FastData.getInstance();
fastData.setToken(userData!.accessToken);
BaseStructureResult<UserInfo> userRes = await client.getUserInfo('Bearer ${userData.accessToken}');
BaseStructureResult<UserInfo> userRes =
await client.getUserInfo('Bearer ${userData.accessToken}');
if (userRes.code != 200 || userRes.data == null) {
throw Exception('登录失败,请重试');
}
@ -428,7 +489,8 @@ class _TheLoginState extends ConsumerState<TheLogin> with CommonMixin {
ref.read(userTokenProvider.notifier).initToken();
//
RouterManager.router.navigateTo(context, RouterManager.root, clearStack: true, transition: getTransition());
RouterManager.router.navigateTo(context, RouterManager.root,
clearStack: true, transition: getTransition());
});
} catch (e) {
toPrint(val: e.toString());

View File

@ -79,6 +79,7 @@ class TheMainPageState extends ConsumerState<TheMainPage> with CommonMixin {
if (!value) {
return toLoginPage(context);
}
if(ref.read(userProvider).id == '540117143121989') return;
ref.read(userReportProvider.notifier).initUserReport(); //
}); // token
//
@ -98,7 +99,9 @@ class TheMainPageState extends ConsumerState<TheMainPage> with CommonMixin {
void getAppUpgrade(UserInfo user) async {
try {
showUpgrade = true;
if (user.loginName == '18888888888') return;
// if (user.loginName == '18888888888') return;
// if (user.loginName == 'u0001') return;
if (user.loginName == '13350366646') return;
//
String deviceInfo;
int deviceType;

View File

@ -0,0 +1,198 @@
import 'package:flutter/material.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:marking_app/common/mixin/common.dart';
import 'package:marking_app/common/model/common/base_structure_result.dart';
import 'package:marking_app/provider/user_provider.dart';
import 'package:marking_app/routes/RouterManager.dart';
import 'package:marking_app/utils/const_text.dart';
import 'package:marking_app/utils/index.dart';
import 'package:marking_app/utils/my_text.dart';
import 'package:marking_app/utils/request/rest_client.dart';
class LogOff extends StatefulHookConsumerWidget {
const LogOff({Key? key}) : super(key: key);
@override
ConsumerState<LogOff> createState() => _LogOffState();
}
class _LogOffState extends ConsumerState<LogOff> with CommonMixin{
bool canClick = true;
bool readAgreement = false; //
logOff() async{
if (!canClick) return;
setState(() => canClick = false);
void toMsg(msg) {
ToastUtils.showError(msg);
setState(() => canClick = true);
}
if (!readAgreement) return toMsg('请勾选我已阅读用户协议和隐私协议');
final userState = ref.watch(userProvider);
EasyLoading.show(status: 'loading...');
RestClient client = await getClientLogin();
BaseStructureResult<dynamic> resultData = await client.getLogOff(userState.loginName);
if (resultData.code != 200) {
return ToastUtils.showError(resultData.message ?? '注销失败,请重试');
}
EasyLoading.dismiss();
ToastUtils.showSuccess('注销成功');
//
RouterManager.router.navigateTo(context, RouterManager.loginPath);
}
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: const Color.fromRGBO(248, 248, 248, 1),
appBar: AppBar(
backgroundColor: Colors.white,
title: Text(
'注销',
style: TextStyle(fontSize: 14.sp, color: Color(0xFF333333)),
),
centerTitle: true,
leading: IconButton(
icon: Icon(Icons.arrow_back_ios, color: Colors.black),
onPressed: () => Navigator.of(context).pop(),
),
),
body: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SizedBox(
height: 30.r,
),
Center(
child: Text(
'温馨提示,请仔细阅读',
style: TextStyle(
fontSize: 16.sp,
color: Color(0xFF464646),
fontWeight: FontWeight.w500),
),
),
SizedBox(
height: 20.r,
),
cont('您仅可注销您本人申请的账号'),
cont('注销后,账号的全部权益将被清除'),
cont('注销后,账号下的所有数据、记录等将无法访问或找回'),
cont('注销后,将清除该账号在网站保留的个人信息'),
cont('注销账号(账号删除)属于用户自主行为'),
/* Padding(
padding: EdgeInsets.symmetric(vertical: 5.r, horizontal: 14.r),
child: Row(
children: [
Text(
'注销账号即表示您已确认并同意',
style: TextStyle(fontSize: 14.sp, color: Color(0xFF616161)),
),
InkWell(
onTap: (){
RouterManager.router.navigateTo(
context,
'${RouterManager.agreementPath}?type=${AGREEMENT_KEY.USER_LOGOUT.name}',
transition: getTransition(),
);
},
child: Text(
'注销协议',
style: TextStyle(fontSize: 14.sp, color: Color(0xFF6888FD)),
),
)
],
),
),*/
SizedBox(
height: 50.r,
),
InkWell(
onTap:logOff,
child: Center(
child: Container(
margin: EdgeInsets.symmetric(vertical: 10.h),
alignment: Alignment.center,
width: 200.r,
height: 50.r,
decoration: BoxDecoration(
color: canClick
? const Color.fromRGBO(9, 105, 246, 1)
: Colors.grey,
/*boxShadow: [
BoxShadow(
color: const Color.fromRGBO(46, 91, 255, 0.5),
offset: Offset(6.w, 10.h), //y轴偏移量
blurRadius: 14, //
spreadRadius: 0.5, //
)
],*/
borderRadius: BorderRadius.all(
Radius.circular(20.w),
),
),
child: Text(
'确认注销',
style: TextStyle(fontSize: 16.sp, color: Colors.white),
),
),
),
),
Padding(
padding: EdgeInsets.symmetric(vertical: 5.r, horizontal: 14.r),
child: Row(
children: [
Container(
width: 30.w,
padding: EdgeInsets.only(right: 10.w),
child: Checkbox(
activeColor: Colors.deepOrangeAccent,
checkColor: Colors.white,
value: readAgreement,
onChanged: (value) {
setState(() {
readAgreement = value ?? false;
});
},
),
),
Text(
'已确认并同意',
style: TextStyle(fontSize: 14.sp, color: Color(0xFF616161)),
),
InkWell(
onTap: () {
RouterManager.router.navigateTo(
context,
'${RouterManager.agreementPath}?type=${AGREEMENT_KEY.USER_LOGOUT.name}',
transition: getTransition(),
);
},
child: quickText(
'《注销协议》',
size: 12.sp,
color: Colors.deepOrangeAccent,
),
),
],
),
),
],
),
);
}
}
Widget cont(String name) {
return Padding(
padding: EdgeInsets.symmetric(vertical: 5.r, horizontal: 14.r),
child: Text(
name,
style: TextStyle(fontSize: 14.sp, color: Color(0xFF616161)),
),
);
}

View File

@ -1,11 +1,14 @@
import 'package:fluro/fluro.dart';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:marking_app/common/mixin/common.dart';
import 'package:marking_app/common/model/common/base_structure_result.dart';
import 'package:marking_app/routes/RouterManager.dart';
import 'package:marking_app/utils/const_text.dart';
import 'package:marking_app/utils/fluro/index.dart';
import 'package:marking_app/utils/index.dart';
import 'package:marking_app/utils/my_text.dart';
import 'package:marking_app/utils/request/rest_client.dart';
import 'package:package_info/package_info.dart';
//
@ -16,12 +19,14 @@ class OhterPage extends StatefulWidget {
State<OhterPage> createState() => _OhterPageState();
}
class _OhterPageState extends State<OhterPage> {
class _OhterPageState extends State<OhterPage> with CommonMixin{
String localVersion = '';
bool showLogOff = false;
@override
void initState() {
super.initState();
getShowLogOff();
getPageInfo();
}
@ -31,6 +36,16 @@ class _OhterPageState extends State<OhterPage> {
toUpState(setState, () => localVersion = packageInfo.version, mounted);
}
getShowLogOff() async{
RestClient client = await getClientLogin();
BaseStructureResult<dynamic> resultData = await client.showLogOff();
if(resultData.success){
setState(() {
showLogOff = resultData.data;
});
}
}
@override
Widget build(BuildContext context) {
final personalInfoTitleStly = TextStyle(
@ -56,7 +71,7 @@ class _OhterPageState extends State<OhterPage> {
Container(
margin: EdgeInsets.symmetric(vertical: 22.h, horizontal: 16.w),
padding: EdgeInsets.symmetric(vertical: 22.h, horizontal: 16.w),
height: 200.h,
height: showLogOff?250.h:200.h,
decoration: BoxDecoration(
borderRadius: BorderRadius.all(Radius.circular(6.w)),
color: Colors.white,
@ -126,11 +141,40 @@ class _OhterPageState extends State<OhterPage> {
height: 1.w,
color: const Color.fromRGBO(240, 243, 255, 1),
),
SizedBox(height: 8.h),
// SizedBox(height: 8.h),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [Text('APP版本', style: personalInfoTitleStly), quickText(localVersion)],
)
),
Container(
height: 1.w,
color: const Color.fromRGBO(240, 243, 255, 1),
),
// SizedBox(height: 8.h),
if(showLogOff)
InkWell(
onTap: () {
RouterManager.router.navigateTo(
context,
RouterManager.logOffPath
);
},
child: Container(
padding: EdgeInsets.only(bottom: 4.h,top: 8.r),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text('注销账号', style: personalInfoTitleStly),
Icon(
Icons.arrow_forward_ios,
color: const Color.fromRGBO(80, 87, 103, 1),
size: 16.sp,
)
],
),
),
),
],
),
),

View File

@ -0,0 +1,293 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:marking_app/common/config/request_config.dart';
import 'package:marking_app/common/mixin/common.dart';
import 'package:marking_app/common/model/common/base_structure_result.dart';
import 'package:marking_app/common/model/user/user_login_params.dart';
import 'package:marking_app/routes/RouterManager.dart';
import 'package:marking_app/utils/common_utils.dart';
import 'package:marking_app/utils/const_text.dart';
import 'package:marking_app/utils/index.dart';
import 'package:marking_app/utils/my_text.dart';
import 'package:marking_app/utils/request/rest_client.dart';
class Register extends StatefulWidget {
const Register({Key? key}) : super(key: key);
@override
State<Register> createState() => _RegisterState();
}
class _RegisterState extends State<Register> with CommonMixin{
late final FocusNode _theFocus;
late final FocusNode _pwdFocus; //
//
late final TextEditingController _userNameController;
late final TextEditingController _passwordController;
bool readAgreement = false; //
bool _isShowPwd = true;
bool canLogin = true;
@override
void initState(){
super.initState();
_userNameController = TextEditingController();
_passwordController = TextEditingController();
_pwdFocus = FocusNode();
_theFocus = FocusNode();
}
@override
void dispose() {
super.dispose();
_userNameController.dispose();
_passwordController.dispose();
_pwdFocus.dispose();
_theFocus.dispose();
}
void toRegister() async{
if (!canLogin) return;
setState(() => canLogin = false);
void toMsg(msg) {
ToastUtils.showError(msg);
setState(() => canLogin = true);
}
FocusScope.of(context).requestFocus(_theFocus);
String userName = _userNameController.text.trim();
String userPwd = _passwordController.text.trim();
if (userName == '') return toMsg('请填写用户账号');
if (userPwd == '') return toMsg('请填写密码');
if (!readAgreement) return toMsg('请勾选我已阅读用户协议和隐私协议');
String userPwdMd5 = CommonUtils.generateMD5(userPwd);
print('注册userPwdMd5=$userPwdMd5');
EasyLoading.show(status: 'loading...');
RestClient client = await getClientLogin();
BaseStructureResult<dynamic> resultData = await client.toRegister(UserLoginParams(userName, userPwdMd5));
if (resultData.code != 200) {
return toMsg(resultData.message ?? '注册失败,请重试');
}
EasyLoading.dismiss();
ToastUtils.showSuccess('注册成功,请登录');
//
RouterManager.router.navigateTo(context, RouterManager.loginPath);
}
void _showPassword() {
setState(() {
_isShowPwd = !_isShowPwd;
});
}
@override
Widget build(BuildContext context) {
return GestureDetector(
behavior: HitTestBehavior.translucent,
onTap: () {
FocusScope.of(context).requestFocus(_theFocus);
},
child: AnnotatedRegion(
value: const SystemUiOverlayStyle(
statusBarColor: Colors.transparent,
systemNavigationBarIconBrightness: Brightness.light,
statusBarIconBrightness: Brightness.light,
statusBarBrightness: Brightness.dark,
),
child: Scaffold(
backgroundColor: Colors.transparent,
resizeToAvoidBottomInset: false,
body: Stack(
children: [
Container(
width: double.infinity,
height: double.infinity,
alignment: Alignment.center,
decoration: const BoxDecoration(
image: DecorationImage(
image: AssetImage('assets/images/login_bgi.png'),
fit: BoxFit.fill, //
),
),
child: SingleChildScrollView(
child: Column(
children: [
Container(
width: 86.w,
height: 86.w,
alignment: Alignment.center,
child: SizedBox(
height: 86.w,
width: 86.w,
child: Image.asset('assets/images/logo.png', fit: BoxFit.cover),
),
),
Container(
margin: EdgeInsets.symmetric(horizontal: 32.w, vertical: 24.h),
padding: EdgeInsets.only(top: 34.h, bottom: 16.h, left: 22.w, right: 22.w),
decoration: BoxDecoration(
color: Colors.white,
border: Border.all(width: 1.w, color: Colors.white),
borderRadius: BorderRadius.all(Radius.circular(10.w)),
boxShadow: const [
BoxShadow(
color: Color.fromRGBO(46, 91, 255, 0.1),
offset: Offset.zero, //y轴偏移量
blurRadius: 100, //
spreadRadius: 100, //
)
],
),
child: Column(children: [
TextField(
controller: _userNameController,
maxLines: 1,
maxLength: 20,
textInputAction: TextInputAction.next,
onEditingComplete: () {
FocusScope.of(context).requestFocus(_pwdFocus);
},
style: TextStyle(
color: const Color.fromRGBO(80, 87, 103, 1),
fontSize: 15.sp,
),
decoration: InputDecoration(
hintText: "请输入账号",
hintStyle: TextStyle(fontSize: 16.sp, color: const Color.fromRGBO(153, 153, 153, 1)),
labelText: "账号",
labelStyle: TextStyle(fontSize: 16.sp, color: const Color.fromRGBO(148, 163, 182, 1)),
),
),
TextField(
focusNode: _pwdFocus,
controller: _passwordController,
keyboardType: TextInputType.number,
maxLines: 1,
obscureText: _isShowPwd, //
textInputAction: TextInputAction.go,
onSubmitted: (val) => toRegister(),
style: TextStyle(
color: const Color.fromRGBO(80, 87, 103, 1),
fontSize: 15.sp,
),
decoration: InputDecoration(
hintText: "请输入密码",
suffix: GestureDetector(
onTap: _showPassword,
child: Icon(
Icons.remove_red_eye,
color: !_isShowPwd ? Theme.of(context).primaryColor : Colors.grey,
),
),
hintStyle: TextStyle(fontSize: 16.sp, color: const Color.fromRGBO(153, 153, 153, 1)),
labelText: "密码",
isDense: true,
labelStyle: TextStyle(fontSize: 16.sp, color: const Color.fromRGBO(148, 163, 182, 1)),
),
),
SizedBox(
height: 12.h,
),
InkWell(
onTap: toRegister,
child: Container(
margin: EdgeInsets.symmetric(vertical: 10.h),
decoration: BoxDecoration(
color: canLogin ? const Color.fromRGBO(9, 105, 246, 1) : Colors.grey,
boxShadow: [
BoxShadow(
color: const Color.fromRGBO(46, 91, 255, 0.5),
offset: Offset(6.w, 10.h), //y轴偏移量
blurRadius: 14, //
spreadRadius: 0.5, //
)
],
borderRadius: BorderRadius.all(
Radius.circular(8.w),
),
),
alignment: Alignment.center,
width: double.infinity,
height: 50.h,
child: Text(
'注 册',
style: TextStyle(fontSize: 16.sp, color: Colors.white),
),
),
),
Row(
children: [
Container(
width: 30.w,
padding: EdgeInsets.only(right: 10.w),
child: Checkbox(
activeColor: Colors.deepOrangeAccent,
checkColor: Colors.white,
value: readAgreement,
onChanged: (value) {
FocusScope.of(context)
.requestFocus(_pwdFocus);
FocusScope.of(context)
.requestFocus(_theFocus);
setState(() {
readAgreement = value ?? false;
});
},
),
),
InkWell(
onTap: () {
RouterManager.router.navigateTo(
context,
'${RouterManager.agreementPath}?type=${AGREEMENT_KEY.USER_AGREEMENT.name}',
transition: getTransition(),
);
},
child: quickText('我已阅读', size: 11.sp),
),
InkWell(
onTap: () {
RouterManager.router.navigateTo(
context,
'${RouterManager.agreementPath}?type=${AGREEMENT_KEY.USER_AGREEMENT.name}',
transition: getTransition(),
);
},
child: quickText(
'《用户协议》',
size: 12.sp,
color: Colors.deepOrangeAccent,
),
),
],
),
]),
)
],
),
)),
Positioned(
top: MediaQuery.of(context).padding.top+20.r,
left: 20.r,
child: InkWell(
onTap: () => Navigator.pop(context),
child: Icon(Icons.arrow_back_ios_new_rounded,
color: Colors.white, size: 24.sp),
),
),
],
),
),
),
);
}
}

View File

@ -181,6 +181,7 @@ class _TheReportState extends ConsumerState<TheReport>
RestClientReport clientReport = await getClientReport();
UserInfoReport _userReport = ref.read(userReportProvider);
if (!_userReport.normal) {
if(ref.read(userProvider).id == '540117143121989') return null;
// 使
bool theFlag =
await ref.read(userReportProvider.notifier).initUserReport();

View File

@ -31,8 +31,10 @@ import 'package:marking_app/pages/marking/progress.dart';
import 'package:marking_app/pages/marking/progress_abnormal.dart';
import 'package:marking_app/pages/marking/review.dart';
import 'package:marking_app/pages/mine/index.dart';
import 'package:marking_app/pages/mine/log_off.dart';
import 'package:marking_app/pages/mine/other_pages/index.dart';
import 'package:marking_app/pages/other/agreement_page.dart';
import 'package:marking_app/pages/register/index.dart';
import 'package:marking_app/pages/report_detail/index.dart';
import 'package:marking_app/pages/report_detail/report_history.dart';
import 'package:marking_app/pages/reports/report_class_teacher.dart';
@ -77,7 +79,8 @@ class RouterManager {
static const String jobPersonalDetailPath = '/homework_correction/job_personal_detail';
static const String reportCardDialogPath = '/report_detail/widgets/report_card_dialog';
static const String reportHistoryPath = '/report_detail/report_history';
static const String registerPath = '/register/index';
static const String logOffPath = '/mine/log_off';
// TheMine
static final FluroRouter router = FluroRouter();
@ -363,6 +366,15 @@ class RouterManager {
return ReportHistory();
},
);
//
static final _registerPathHandler =
Handler(handlerFunc: (BuildContext? context, Map<String, List<String>> params) => const Register());
//
static final _logOffPathHandler =
Handler(handlerFunc: (BuildContext? context, Map<String, List<String>> params) => const LogOff());
//
// static final _doMarkingPapers = Handler(handlerFunc: (BuildContext? context, Map<String, List<String>> params) => MarkingPapers());
@ -409,7 +421,8 @@ class RouterManager {
router.define(jobPersonalDetailPath, handler: _jobPersonalDetailPathHandler, transitionType: TransitionType.material);
router.define(reportCardDialogPath, handler: _reportCardDialogPathHandler, transitionType: TransitionType.material);
router.define(reportHistoryPath, handler: _reportHistoryPathHandler, transitionType: TransitionType.material);
router.define(registerPath, handler: _registerPathHandler,transitionType: TransitionType.material);
router.define(logOffPath, handler: _logOffPathHandler,transitionType: TransitionType.material);
// getTransition()
router.notFoundHandler = Handler(handlerFunc: (BuildContext? context, Map<String, List<String>> params) {

View File

@ -1,7 +1,7 @@
/*协议*/
// ignore_for_file: constant_identifier_names
// ignore: camel_case_types
enum AGREEMENT_KEY { PRIVACY_GREEMENT, USER_AGREEMENT }
enum AGREEMENT_KEY { PRIVACY_GREEMENT, USER_AGREEMENT, USER_LOGOUT }
// ignore: non_constant_identifier_names
final Map<AGREEMENT_KEY, AgreementClass> AGREEMENT_MAP = {
@ -148,12 +148,103 @@ final Map<AGREEMENT_KEY, AgreementClass> AGREEMENT_MAP = {
<p>4.2 </p>
</body>
</html>''',
)
),
AGREEMENT_KEY.USER_LOGOUT: AgreementClass(
title: '注销协议',
richText: '''<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title></title>
</head>
<body>
<p>
</p>
<p>
</p>
<p>
使
</p>
<h4></h4>
<p>
1.使使
</p>
<p>
2.使使线
</p>
<p>
3./
</p>
<p>
4.使
</p>
<p>
5.使
</p>
<p>
6.使使
</p>
<p>
7.
</p>
<h4>/ </h4>
<p>
1.使
</p>
<p>
2.
</p>
<p>
3.使
</p>
<p>
4.4使
</p>
<p>
5.
</p>
<p>
6.
</p>
<p>
7.
</p>
<p>
</p>
<h4></h4>
<p>
1.
</p> <p>
2.
</p>
<p>
3.2使使使
</p>
<p>
4.3
</p>
<p>
</p>
<h4></h4>
<p>
使
</p>
</body>
</html>''',
),
};
/* TYPE */
class AgreementClass {
String title;
String richText;
AgreementClass({required this.title, required this.richText});
}

View File

@ -357,5 +357,20 @@ abstract class RestClient {
@the_retrofit.Query("PageSize") int pageSize,
);
//
@the_retrofit.POST("/auth/login/reg")
Future<BaseStructureResult<dynamic>> toRegister(@the_retrofit.Body() UserLoginParams params);
//
@the_retrofit.GET("/auth/login/status/reg")
Future<BaseStructureResult<dynamic>> showRegister();
//
@the_retrofit.GET("/auth/login/status/lg")
Future<BaseStructureResult<dynamic>> showLogOff();
//
@the_retrofit.POST("/auth/login/lg")
Future<BaseStructureResult> getLogOff(@the_retrofit.Field("loginName") String loginName);
}