提交 1f915716 authored 作者: yueweilu's avatar yueweilu

登录逻辑

上级 84953177
assets/images/3.0x/mine.png

1.8 KB | W: | H:

assets/images/3.0x/mine.png

1.5 KB | W: | H:

assets/images/3.0x/mine.png
assets/images/3.0x/mine.png
assets/images/3.0x/mine.png
assets/images/3.0x/mine.png
  • 2-up
  • Swipe
  • Onion skin
assets/images/mine.png

1.5 KB | W: | H:

assets/images/mine.png

422 Bytes | W: | H:

assets/images/mine.png
assets/images/mine.png
assets/images/mine.png
assets/images/mine.png
  • 2-up
  • Swipe
  • Onion skin
part of apis; part of apis;
abstract class AccountAPI { abstract class AccountAPI {
/// 登录
static Future <UserModel> login({ static Future <UserModel> login({
required String phone, required String phone,
required String password,
required String type, required String type,
String? password,
String? code,
}) async { }) async {
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,
'type' : type,
};
// 密码登录
if(type == '1'){
params['password'] = password;
}
// 验证码登录
if(type == '2'){
params['password'] = password;
}
final result = await HttpService.to.post( final result = await HttpService.to.post(
'/v1/members/login/login', '/v1/members/login/login',
excludeToken: true, excludeToken: true,
showLoading: true, showLoading: true,
params: { params: params
'phone': phone,
'password': password,
'type': type
},
); );
print(result.data); print(result.data);
if (result.data is! Map) return UserModel(); if (result.data is! Map) return UserModel();
return UserModel.fromJson(result.data); return UserModel.fromJson(result.data);
} }
/// 发送验证码
static Future sendCode({
required String phone,
required String type,
}) async {
final result = await HttpService.to.post(
'/v1/members/login/sendCode',
excludeToken: true,
showLoading: true,
);
}
} }
\ No newline at end of file
...@@ -14,6 +14,8 @@ class Global { ...@@ -14,6 +14,8 @@ class Global {
// 配置存储 // 配置存储
Get.putAsync<StorageService>(() => StorageService().init()), Get.putAsync<StorageService>(() => StorageService().init()),
]).whenComplete(() { ]).whenComplete(() {
print('初始化****************');
// 网络 // 网络
Get.put<HttpService>(HttpService()); Get.put<HttpService>(HttpService());
//配置基本设置 //配置基本设置
......
...@@ -16,7 +16,14 @@ import 'package:flutter_localizations/flutter_localizations.dart'; ...@@ -16,7 +16,14 @@ import 'package:flutter_localizations/flutter_localizations.dart';
import 'global.dart'; import 'global.dart';
void main() { void main() {
Global.init().then((_) => runApp(const MyApp())); Global.init().then((_) {
Future.wait([
UserStore.to.profile(),
]).whenComplete(() {
runApp(const MyApp());
//FlutterNativeSplash.remove();
});
});
SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle.light); SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle.light);
} }
......
...@@ -101,40 +101,34 @@ class LoginController extends GetxController { ...@@ -101,40 +101,34 @@ class LoginController extends GetxController {
update(); update();
} }
Future<bool> onLogin(GlobalKey<FormState> key) async { /// 登录
void onLogin(BuildContext context) async {
print(EncryptUtil.encodeMd5(EncryptUtil.encodeMd5(passwordInput.text)));
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' type: '1'
); );
print(result); if((result.token ?? '').isEmpty) return;
/// 存储账号密码
StorageService.to.setString(kLocalAccount, 'phone');
StorageService.to.setString(kLocalPassword, 'password');
/// 存储用户信息 // 存储用户信息
await Future.wait([ await Future.wait([
UserStore.to.setToken(''), UserStore.to.setToken(result.token!),
UserStore.to.setAccessToken(result.accessToken!),
]); ]);
await Future.wait([
UserStore.to.setInfo(result),
UserStore.to.profile(),
]);
// if (!context.mounted) return; if (!context.mounted) return;
// if (context.canPop()){ if (context.canPop()){
// context.pop(); context.pop();
// }else { }else {
// context.goNamed(Routes.main); context.goNamed(Routes.main);
// } }
return true;
} }
......
...@@ -19,16 +19,14 @@ class _LoginPageState extends State<LoginPage> { ...@@ -19,16 +19,14 @@ class _LoginPageState extends State<LoginPage> {
init: LoginController(), init: LoginController(),
builder:(controller) => GestureDetector( builder:(controller) => GestureDetector(
onTap: () => Tools.unfocus(), onTap: () => Tools.unfocus(),
child: Scaffold( child: Container(
resizeToAvoidBottomInset:true, color: Colors.white,
appBar: CustomAppBar( child: Stack(
systemOverlayStyle: Theme.of(context).brightness == Brightness.light children: [
? SystemUiOverlayStyle.dark Image.asset(
: SystemUiOverlayStyle.light, 'assets/images/login_bg.png',
backgroundColor: Colors.transparent, ),
), SafeArea(
// extendBodyBehindAppBar: true,
body: SafeArea(
top: false, top: false,
minimum: const EdgeInsets.all(AppTheme.margin).copyWith( minimum: const EdgeInsets.all(AppTheme.margin).copyWith(
// top:Screen.statusBar, // top:Screen.statusBar,
...@@ -153,7 +151,7 @@ class _LoginPageState extends State<LoginPage> { ...@@ -153,7 +151,7 @@ class _LoginPageState extends State<LoginPage> {
isEnabled: controller.enable, isEnabled: controller.enable,
onPressed: () { onPressed: () {
print('11111111111111111'); print('11111111111111111');
controller.onLogin(_formKey); controller.onLogin(context);
}, },
) )
], ],
...@@ -199,9 +197,11 @@ class _LoginPageState extends State<LoginPage> { ...@@ -199,9 +197,11 @@ class _LoginPageState extends State<LoginPage> {
) )
], ],
), ),
) ),
],
), ),
) )
),
); );
} }
} }
......
...@@ -6,8 +6,11 @@ import 'package:flutter_book/pages/library/index.dart'; ...@@ -6,8 +6,11 @@ import 'package:flutter_book/pages/library/index.dart';
import 'package:flutter_book/pages/mine/index.dart'; import 'package:flutter_book/pages/mine/index.dart';
import 'package:flutter_book/theme.dart'; import 'package:flutter_book/theme.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:go_router/go_router.dart';
import 'package:ionicons/ionicons.dart'; import 'package:ionicons/ionicons.dart';
import '../../routes/index.dart';
import '../../store/index.dart';
import '../../widgets/index.dart'; import '../../widgets/index.dart';
import '../book_shop/index.dart'; import '../book_shop/index.dart';
import '../course/index.dart'; import '../course/index.dart';
......
...@@ -50,7 +50,11 @@ class _MainPageState extends State<MainPage> with WidgetsBindingObserver{ ...@@ -50,7 +50,11 @@ class _MainPageState extends State<MainPage> with WidgetsBindingObserver{
builder: (controller) => BottomNavigationBar( builder: (controller) => BottomNavigationBar(
currentIndex:controller.currentPage , currentIndex:controller.currentPage ,
onTap: (page){ onTap: (page){
if (page != 0 && !UserStore.to.isLogin) {
context.pushNamed(Routes.login);
} else {
controller.pageController.jumpToPage(page); controller.pageController.jumpToPage(page);
}
}, },
items: [ items: [
BottomNavigationBarItem( BottomNavigationBarItem(
......
...@@ -22,6 +22,7 @@ import 'package:flutter_book/pages/web/index.dart'; ...@@ -22,6 +22,7 @@ import 'package:flutter_book/pages/web/index.dart';
import 'package:go_router/go_router.dart'; import 'package:go_router/go_router.dart';
import '../pages/user_terms/index.dart'; import '../pages/user_terms/index.dart';
import '../store/index.dart';
part 'observers.dart'; part 'observers.dart';
......
...@@ -62,6 +62,7 @@ abstract class Routes { ...@@ -62,6 +62,7 @@ abstract class Routes {
// initialLocation: '/$login', // initialLocation: '/$login',
initialLocation: '/', initialLocation: '/',
observers: [observer], observers: [observer],
// redirect: _RouteRedirect.auth,
routes: [ routes: [
GoRoute( GoRoute(
path: '/$splash', path: '/$splash',
...@@ -231,3 +232,10 @@ abstract class Routes { ...@@ -231,3 +232,10 @@ abstract class Routes {
); );
} }
abstract class _RouteRedirect {
static String? auth(BuildContext context, GoRouterState state) {
if (UserStore.to.isLogin) return null;
return '/${Routes.login}';
}
}
\ No newline at end of file
library store; library store;
import 'dart:convert';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_book/services/index.dart'; import 'package:flutter_book/services/index.dart';
import 'package:flutter_book/theme.dart'; import 'package:flutter_book/theme.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import '../models/user_model.dart';
import '../utils/index.dart'; import '../utils/index.dart';
part 'config.dart'; part 'config.dart';
......
...@@ -6,12 +6,22 @@ class UserStore extends GetxController { ...@@ -6,12 +6,22 @@ class UserStore extends GetxController {
// 是否登录 // 是否登录
bool _isLogin = false; bool _isLogin = false;
String _token = '';
String _token = '';
String get token => _token; String get token => _token;
String _accessToken = '';
String get accessToken => _accessToken;
bool get isLogin=> _isLogin; bool get isLogin=> _isLogin;
bool get hasToken => _token.isNotEmpty; bool get hasToken => _token.isNotEmpty;
UserModel _info = UserModel();
UserModel get info => _info;
@override @override
void onInit() { void onInit() {
...@@ -24,14 +34,32 @@ class UserStore extends GetxController { ...@@ -24,14 +34,32 @@ class UserStore extends GetxController {
_token = value; _token = value;
} }
Future<void> setAccessToken(String value) async {
await StorageService.to.setString(kLocalAccessToken, value);
_accessToken = value;
}
Future<void> setInfo(UserModel value) async {
await StorageService.to.setString(kLocalUserInfo, jsonEncode(value.toJson()));
_info = value;
}
// 登出 // 登出
Future<void> logout() async { Future<void> logout() async {
await StorageService.to.remove(kLocalToken); await StorageService.to.remove(kLocalToken);
await StorageService.to.remove(kLocalAccessToken);
await StorageService.to.remove(kLocalUserInfo);
_token = ''; _token = '';
_isLogin = false; _isLogin = false;
} }
Future<void> profile() async {
print('toknen----------------------: ' + _token);
if (!hasToken) return;
_isLogin = true;
update();
}
} }
\ No newline at end of file
...@@ -186,8 +186,8 @@ abstract class AppTheme { ...@@ -186,8 +186,8 @@ abstract class AppTheme {
backgroundColor: Colors.white, backgroundColor: Colors.white,
unselectedItemColor: scheme.onBackground.withOpacity(0.5), unselectedItemColor: scheme.onBackground.withOpacity(0.5),
selectedItemColor: scheme.primary, selectedItemColor: scheme.primary,
unselectedLabelStyle: TextStyle(fontSize: 10.w, height: 1.6), unselectedLabelStyle: TextStyle(fontSize: 11.w,fontWeight: Fonts.medium),
selectedLabelStyle: TextStyle(fontSize: 10.w, height: 1.6), selectedLabelStyle: TextStyle(fontSize: 11.w,fontWeight: Fonts.medium),
unselectedIconTheme: IconThemeData( unselectedIconTheme: IconThemeData(
size: 15.w, size: 15.w,
color: scheme.onBackground.withOpacity(0.5), color: scheme.onBackground.withOpacity(0.5),
......
...@@ -2,10 +2,10 @@ part of utils; ...@@ -2,10 +2,10 @@ part of utils;
class AppConfig{ class AppConfig{
//app在服务端注册的id,由后端直接提供 //app在服务端注册的id,由后端直接提供
static const String AppID = 'ZTxGRWl6F6erl330'; static const String AppID = 'dkFv6OwWyQhSeaZG';
//app在服务端的秘钥串,由后端直接提供 //app在服务端的秘钥串,由后端直接提供
static const String AppSecret = '0a6521b67cbd5397ce641f791f284bb7'; static const String AppSecret = 'd34cea92316d1da113e95158bed9ca97';
//签名时使用的加密串,由后端直接提供 //签名时使用的加密串,由后端直接提供
static const String AppEncodeKey = 'J2h8a9zK0z%a-k2z'; static const String AppEncodeKey = '&4F6g4Y6b5L4R9';
} }
...@@ -5,8 +5,11 @@ part of utils; ...@@ -5,8 +5,11 @@ part of utils;
const String kServerUrl = 'http://192.168.11.88:81'; const String kServerUrl = 'http://192.168.11.88:81';
const String kLocalToken = 'local_token'; const String kLocalToken = 'local_token';
const String kLocalAccessToken = 'local_access_token';
const String kLocalAccount = 'local_account'; const String kLocalAccount = 'local_account';
const String kLocalPassword = 'local_password'; const String kLocalPassword = 'local_password';
const String kLocalUserInfo = 'local_user_info';
abstract class C { abstract class C {
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论