diff --git a/lib/base/http/api.dart b/lib/base/http/api.dart index 4956fbd..304ce36 100644 --- a/lib/base/http/api.dart +++ b/lib/base/http/api.dart @@ -2,6 +2,7 @@ import 'package:qinglong_app/base/http/http.dart'; import 'package:qinglong_app/module/config/config_bean.dart'; import 'package:qinglong_app/module/env/env_bean.dart'; import 'package:qinglong_app/module/login/login_bean.dart'; +import 'package:qinglong_app/module/login/user_bean.dart'; import 'package:qinglong_app/module/others/dependencies/dependency_bean.dart'; import 'package:qinglong_app/module/others/login_log/login_log_bean.dart'; import 'package:qinglong_app/module/others/scripts/script_bean.dart'; @@ -12,8 +13,7 @@ import 'package:qinglong_app/module/task/task_detail/task_detail_bean.dart'; import 'url.dart'; class Api { - static Future> login( - String userName, String passWord) async { + static Future> login(String userName, String passWord) async { return await Http.post( Url.login, { @@ -23,6 +23,13 @@ class Api { ); } + static Future> user() async { + return await Http.get( + Url.user, + null, + ); + } + static Future>> crons() async { return await Http.get>( Url.tasks, @@ -30,16 +37,14 @@ class Api { ); } - static Future> startTasks( - List crons) async { + static Future> startTasks(List crons) async { return await Http.put( Url.runTasks, crons, ); } - static Future> stopTasks( - List crons) async { + static Future> stopTasks(List crons) async { return await Http.put( Url.runTasks, crons, @@ -60,9 +65,7 @@ class Api { ); } - static Future> addTask( - String name, String command, String cron, - {String? id}) async { + static Future> addTask(String name, String command, String cron, {String? id}) async { var data = {"name": name, "command": command, "schedule": cron}; if (id != null) { @@ -127,8 +130,7 @@ class Api { ); } - static Future> saveFile( - String name, String content) async { + static Future> saveFile(String name, String content) async { return await Http.post( Url.saveFile, {"content": content, "name": name}, @@ -163,9 +165,7 @@ class Api { ); } - static Future> addEnv( - String name, String value, String remarks, - {String? id}) async { + static Future> addEnv(String name, String value, String remarks, {String? id}) async { var data = { "value": value, "remarks": remarks, @@ -185,8 +185,7 @@ class Api { ); } - static Future> moveEnv( - String id, int fromIndex, int toIndex) async { + static Future> moveEnv(String id, int fromIndex, int toIndex) async { return await Http.put( Url.envMove(id), {"fromIndex": fromIndex, "toIndex": toIndex}, @@ -201,8 +200,7 @@ class Api { } static Future>> taskLog() async { - return await Http.get>(Url.taskLog, null, - serializationName: "dirs"); + return await Http.get>(Url.taskLog, null, serializationName: "dirs"); } static Future> taskLogDetail(String name) async { @@ -219,8 +217,7 @@ class Api { ); } - static Future> scriptDetail( - String name, String? path) async { + static Future> scriptDetail(String name, String? path) async { return await Http.get( Url.scriptDetail + name, { @@ -229,8 +226,7 @@ class Api { ); } - static Future>> dependencies( - String type) async { + static Future>> dependencies(String type) async { return await Http.get>( Url.dependencies, { @@ -239,8 +235,7 @@ class Api { ); } - static Future> dependencyReinstall( - String id) async { + static Future> dependencyReinstall(String id) async { return await Http.put( Url.dependencies, [id], @@ -254,8 +249,7 @@ class Api { ); } - static Future> addDependency( - String name, int type) async { + static Future> addDependency(String name, int type) async { return await Http.post( Url.dependencies, [ diff --git a/lib/base/http/url.dart b/lib/base/http/url.dart index 0fd55cd..14d2ebf 100644 --- a/lib/base/http/url.dart +++ b/lib/base/http/url.dart @@ -1,5 +1,6 @@ class Url { static const login = "/api/user/login"; + static const user = "/api/user"; static const tasks = "/api/crons"; static const runTasks = "/api/crons/run"; static const stopTasks = "/api/crons/stop"; diff --git a/lib/json.jc.dart b/lib/json.jc.dart index 3a9bb76..1fcfb3d 100644 --- a/lib/json.jc.dart +++ b/lib/json.jc.dart @@ -3,6 +3,7 @@ import 'package:qinglong_app/module/config/config_bean.dart'; import 'package:qinglong_app/module/env/env_bean.dart'; import 'package:qinglong_app/module/login/login_bean.dart'; +import 'package:qinglong_app/module/login/user_bean.dart'; import 'package:qinglong_app/module/others/dependencies/dependency_bean.dart'; import 'package:qinglong_app/module/others/login_log/login_log_bean.dart'; import 'package:qinglong_app/module/others/scripts/script_bean.dart'; @@ -10,8 +11,10 @@ import 'package:qinglong_app/module/others/task_log/task_log_bean.dart'; import 'package:qinglong_app/module/task/task_bean.dart'; import 'package:qinglong_app/module/task/task_detail/task_detail_bean.dart'; + class JsonConversion$Json { - static M fromJson(dynamic json) { + + static M fromJson(dynamic json) { if (json is List) { return _getListChildType(json); } else { @@ -20,96 +23,93 @@ class JsonConversion$Json { } static M _fromJsonSingle(dynamic json) { + String type = M.toString(); - if (type == (ConfigBean).toString()) { - return ConfigBean.jsonConversion(json) as M; + if(type == (ConfigBean).toString()){ + return ConfigBean.jsonConversion(json) as M; } - - if (type == (EnvBean).toString()) { - return EnvBean.jsonConversion(json) as M; + + if(type == (EnvBean).toString()){ + return EnvBean.jsonConversion(json) as M; } - - if (type == (LoginBean).toString()) { - return LoginBean.jsonConversion(json) as M; + + if(type == (LoginBean).toString()){ + return LoginBean.jsonConversion(json) as M; } - - if (type == (DependencyBean).toString()) { - return DependencyBean.jsonConversion(json) as M; + + if(type == (UserBean).toString()){ + return UserBean.jsonConversion(json) as M; } - - if (type == (LoginLogBean).toString()) { - return LoginLogBean.jsonConversion(json) as M; + + if(type == (DependencyBean).toString()){ + return DependencyBean.jsonConversion(json) as M; } - - if (type == (ScriptBean).toString()) { - return ScriptBean.jsonConversion(json) as M; + + if(type == (LoginLogBean).toString()){ + return LoginLogBean.jsonConversion(json) as M; } - - if (type == (TaskLogBean).toString()) { - return TaskLogBean.jsonConversion(json) as M; + + if(type == (ScriptBean).toString()){ + return ScriptBean.jsonConversion(json) as M; } - - if (type == (TaskBean).toString()) { - return TaskBean.jsonConversion(json) as M; + + if(type == (TaskLogBean).toString()){ + return TaskLogBean.jsonConversion(json) as M; } - - if (type == (TaskDetailBean).toString()) { - return TaskDetailBean.jsonConversion(json) as M; + + if(type == (TaskBean).toString()){ + return TaskBean.jsonConversion(json) as M; } - + + if(type == (TaskDetailBean).toString()){ + return TaskDetailBean.jsonConversion(json) as M; + } + throw Exception("not found"); } static M _getListChildType(List data) { - if ([] is M) { - return data.map((e) => ConfigBean.jsonConversion(e)).toList() - as M; + if([] is M){ + return data.map((e) => ConfigBean.jsonConversion(e)).toList() as M; } - - if ([] is M) { + + if([] is M){ return data.map((e) => EnvBean.jsonConversion(e)).toList() as M; } - - if ([] is M) { - return data.map((e) => LoginBean.jsonConversion(e)).toList() - as M; + + if([] is M){ + return data.map((e) => LoginBean.jsonConversion(e)).toList() as M; } - - if ([] is M) { - return data - .map((e) => DependencyBean.jsonConversion(e)) - .toList() as M; + + if([] is M){ + return data.map((e) => UserBean.jsonConversion(e)).toList() as M; } - - if ([] is M) { - return data - .map((e) => LoginLogBean.jsonConversion(e)) - .toList() as M; + + if([] is M){ + return data.map((e) => DependencyBean.jsonConversion(e)).toList() as M; } - - if ([] is M) { - return data.map((e) => ScriptBean.jsonConversion(e)).toList() - as M; + + if([] is M){ + return data.map((e) => LoginLogBean.jsonConversion(e)).toList() as M; } - - if ([] is M) { - return data - .map((e) => TaskLogBean.jsonConversion(e)) - .toList() as M; + + if([] is M){ + return data.map((e) => ScriptBean.jsonConversion(e)).toList() as M; } - - if ([] is M) { - return data.map((e) => TaskBean.jsonConversion(e)).toList() - as M; + + if([] is M){ + return data.map((e) => TaskLogBean.jsonConversion(e)).toList() as M; } - - if ([] is M) { - return data - .map((e) => TaskDetailBean.jsonConversion(e)) - .toList() as M; + + if([] is M){ + return data.map((e) => TaskBean.jsonConversion(e)).toList() as M; } - + + if([] is M){ + return data.map((e) => TaskDetailBean.jsonConversion(e)).toList() as M; + } + throw Exception("not found"); } } diff --git a/lib/module/login/login_page.dart b/lib/module/login/login_page.dart index 99c7042..6a4348d 100644 --- a/lib/module/login/login_page.dart +++ b/lib/module/login/login_page.dart @@ -7,6 +7,7 @@ import 'package:qinglong_app/base/routes.dart'; import 'package:qinglong_app/base/theme.dart'; import 'package:qinglong_app/base/userinfo_viewmodel.dart'; import 'package:qinglong_app/main.dart'; +import 'package:qinglong_app/module/login/user_bean.dart'; import 'package:qinglong_app/utils/extension.dart'; import 'package:qinglong_app/utils/utils.dart'; @@ -20,8 +21,7 @@ class LoginPage extends ConsumerStatefulWidget { } class _LoginPageState extends ConsumerState { - final TextEditingController _hostController = - TextEditingController(text: getIt().host); + final TextEditingController _hostController = TextEditingController(text: getIt().host); final TextEditingController _userNameController = TextEditingController(); final TextEditingController _passwordController = TextEditingController(); @@ -31,15 +31,13 @@ class _LoginPageState extends ConsumerState { void initState() { super.initState(); - if (getIt().userName != null && - getIt().userName!.isNotEmpty) { + if (getIt().userName != null && getIt().userName!.isNotEmpty) { _userNameController.text = getIt().userName!; rememberPassword = true; } else { rememberPassword = false; } - if (getIt().passWord != null && - getIt().passWord!.isNotEmpty) { + if (getIt().passWord != null && getIt().passWord!.isNotEmpty) { _passwordController.text = getIt().passWord!; } getIt().updateToken(""); @@ -199,25 +197,15 @@ class _LoginPageState extends ConsumerState { SizedBox( width: MediaQuery.of(context).size.width - 80, child: IgnorePointer( - ignoring: _hostController.text.isEmpty || - _userNameController.text.isEmpty || - _passwordController.text.isEmpty || - isLoading, + ignoring: _hostController.text.isEmpty || _userNameController.text.isEmpty || _passwordController.text.isEmpty || isLoading, child: CupertinoButton( padding: const EdgeInsets.symmetric( vertical: 5, ), - color: (_hostController.text.isNotEmpty && - _userNameController.text.isNotEmpty && - _passwordController.text.isNotEmpty && - !isLoading) - ? ref - .watch(themeProvider) - .themeColor - .buttonBgColor() - : Theme.of(context) - .primaryColor - .withOpacity(0.4), + color: + (_hostController.text.isNotEmpty && _userNameController.text.isNotEmpty && _passwordController.text.isNotEmpty && !isLoading) + ? ref.watch(themeProvider).themeColor.buttonBgColor() + : Theme.of(context).primaryColor.withOpacity(0.4), child: isLoading ? const CupertinoActivityIndicator() : const Text( @@ -228,17 +216,13 @@ class _LoginPageState extends ConsumerState { ), onPressed: () { if (rememberPassword) { - getIt().updateUserName( - _userNameController.text, - _passwordController.text); + getIt().updateUserName(_userNameController.text, _passwordController.text); } Http.pushedLoginPage = false; Utils.hideKeyBoard(context); - getIt() - .updateHost(_hostController.text); - login(_userNameController.text, - _passwordController.text); + getIt().updateHost(_hostController.text); + login(_userNameController.text, _passwordController.text); }), ), ), @@ -260,8 +244,21 @@ class _LoginPageState extends ConsumerState { setState(() {}); HttpResponse response = await Api.login(userName, password); if (response.success) { - getIt().updateToken(response.bean?.token ?? ""); - Navigator.of(context).pushReplacementNamed(Routes.routeHomePage); + HttpResponse userResponse = await Api.user(); + if (userResponse.success) { + if (userResponse.bean != null && userResponse.bean!.twoFactorActivated != null && userResponse.bean!.twoFactorActivated!) { + ("你已开启两步验证,App暂不支持").toast(); + isLoading = false; + setState(() {}); + } else { + getIt().updateToken(response.bean?.token ?? ""); + Navigator.of(context).pushReplacementNamed(Routes.routeHomePage); + } + } else { + (response.message ?? "请检查网络情况").toast(); + isLoading = false; + setState(() {}); + } } else { (response.message ?? "请检查网络情况").toast(); isLoading = false; diff --git a/lib/module/login/user_bean.dart b/lib/module/login/user_bean.dart new file mode 100644 index 0000000..4ace31f --- /dev/null +++ b/lib/module/login/user_bean.dart @@ -0,0 +1,25 @@ +import 'package:json_conversion_annotation/json_conversion_annotation.dart'; + +/// @author NewTab +@JsonConversion() +class UserBean { + String? username; + bool? twoFactorActivated; + + UserBean({this.username, this.twoFactorActivated}); + + UserBean.fromJson(Map json) { + username = json['username']; + twoFactorActivated = json['twoFactorActivated']; + } + + Map toJson() { + final Map data = new Map(); + data['username'] = this.username; + data['twoFactorActivated'] = this.twoFactorActivated; + return data; + } + static UserBean jsonConversion(Map json) { + return UserBean.fromJson(json); + } +}