增加两步验证提醒

This commit is contained in:
jyuesong
2022-01-19 09:56:17 +08:00
parent ca6f1db16f
commit c51ebc16d2
5 changed files with 139 additions and 122 deletions

View File

@@ -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<HttpResponse<LoginBean>> login(
String userName, String passWord) async {
static Future<HttpResponse<LoginBean>> login(String userName, String passWord) async {
return await Http.post<LoginBean>(
Url.login,
{
@@ -23,6 +23,13 @@ class Api {
);
}
static Future<HttpResponse<UserBean>> user() async {
return await Http.get<UserBean>(
Url.user,
null,
);
}
static Future<HttpResponse<List<TaskBean>>> crons() async {
return await Http.get<List<TaskBean>>(
Url.tasks,
@@ -30,16 +37,14 @@ class Api {
);
}
static Future<HttpResponse<NullResponse>> startTasks(
List<String> crons) async {
static Future<HttpResponse<NullResponse>> startTasks(List<String> crons) async {
return await Http.put<NullResponse>(
Url.runTasks,
crons,
);
}
static Future<HttpResponse<NullResponse>> stopTasks(
List<String> crons) async {
static Future<HttpResponse<NullResponse>> stopTasks(List<String> crons) async {
return await Http.put<NullResponse>(
Url.runTasks,
crons,
@@ -60,9 +65,7 @@ class Api {
);
}
static Future<HttpResponse<TaskDetailBean>> addTask(
String name, String command, String cron,
{String? id}) async {
static Future<HttpResponse<TaskDetailBean>> 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<HttpResponse<NullResponse>> saveFile(
String name, String content) async {
static Future<HttpResponse<NullResponse>> saveFile(String name, String content) async {
return await Http.post<NullResponse>(
Url.saveFile,
{"content": content, "name": name},
@@ -163,9 +165,7 @@ class Api {
);
}
static Future<HttpResponse<NullResponse>> addEnv(
String name, String value, String remarks,
{String? id}) async {
static Future<HttpResponse<NullResponse>> addEnv(String name, String value, String remarks, {String? id}) async {
var data = {
"value": value,
"remarks": remarks,
@@ -185,8 +185,7 @@ class Api {
);
}
static Future<HttpResponse<NullResponse>> moveEnv(
String id, int fromIndex, int toIndex) async {
static Future<HttpResponse<NullResponse>> moveEnv(String id, int fromIndex, int toIndex) async {
return await Http.put<NullResponse>(
Url.envMove(id),
{"fromIndex": fromIndex, "toIndex": toIndex},
@@ -201,8 +200,7 @@ class Api {
}
static Future<HttpResponse<List<TaskLogBean>>> taskLog() async {
return await Http.get<List<TaskLogBean>>(Url.taskLog, null,
serializationName: "dirs");
return await Http.get<List<TaskLogBean>>(Url.taskLog, null, serializationName: "dirs");
}
static Future<HttpResponse<String>> taskLogDetail(String name) async {
@@ -219,8 +217,7 @@ class Api {
);
}
static Future<HttpResponse<String>> scriptDetail(
String name, String? path) async {
static Future<HttpResponse<String>> scriptDetail(String name, String? path) async {
return await Http.get<String>(
Url.scriptDetail + name,
{
@@ -229,8 +226,7 @@ class Api {
);
}
static Future<HttpResponse<List<DependencyBean>>> dependencies(
String type) async {
static Future<HttpResponse<List<DependencyBean>>> dependencies(String type) async {
return await Http.get<List<DependencyBean>>(
Url.dependencies,
{
@@ -239,8 +235,7 @@ class Api {
);
}
static Future<HttpResponse<NullResponse>> dependencyReinstall(
String id) async {
static Future<HttpResponse<NullResponse>> dependencyReinstall(String id) async {
return await Http.put<NullResponse>(
Url.dependencies,
[id],
@@ -254,8 +249,7 @@ class Api {
);
}
static Future<HttpResponse<NullResponse>> addDependency(
String name, int type) async {
static Future<HttpResponse<NullResponse>> addDependency(String name, int type) async {
return await Http.post<NullResponse>(
Url.dependencies,
[

View File

@@ -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";

View File

@@ -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<M>(dynamic json) {
static M fromJson<M>(dynamic json) {
if (json is List) {
return _getListChildType<M>(json);
} else {
@@ -20,94 +23,91 @@ class JsonConversion$Json {
}
static M _fromJsonSingle<M>(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<M>(List<dynamic> data) {
if (<ConfigBean>[] is M) {
return data.map<ConfigBean>((e) => ConfigBean.jsonConversion(e)).toList()
as M;
if(<ConfigBean>[] is M){
return data.map<ConfigBean>((e) => ConfigBean.jsonConversion(e)).toList() as M;
}
if (<EnvBean>[] is M) {
if(<EnvBean>[] is M){
return data.map<EnvBean>((e) => EnvBean.jsonConversion(e)).toList() as M;
}
if (<LoginBean>[] is M) {
return data.map<LoginBean>((e) => LoginBean.jsonConversion(e)).toList()
as M;
if(<LoginBean>[] is M){
return data.map<LoginBean>((e) => LoginBean.jsonConversion(e)).toList() as M;
}
if (<DependencyBean>[] is M) {
return data
.map<DependencyBean>((e) => DependencyBean.jsonConversion(e))
.toList() as M;
if(<UserBean>[] is M){
return data.map<UserBean>((e) => UserBean.jsonConversion(e)).toList() as M;
}
if (<LoginLogBean>[] is M) {
return data
.map<LoginLogBean>((e) => LoginLogBean.jsonConversion(e))
.toList() as M;
if(<DependencyBean>[] is M){
return data.map<DependencyBean>((e) => DependencyBean.jsonConversion(e)).toList() as M;
}
if (<ScriptBean>[] is M) {
return data.map<ScriptBean>((e) => ScriptBean.jsonConversion(e)).toList()
as M;
if(<LoginLogBean>[] is M){
return data.map<LoginLogBean>((e) => LoginLogBean.jsonConversion(e)).toList() as M;
}
if (<TaskLogBean>[] is M) {
return data
.map<TaskLogBean>((e) => TaskLogBean.jsonConversion(e))
.toList() as M;
if(<ScriptBean>[] is M){
return data.map<ScriptBean>((e) => ScriptBean.jsonConversion(e)).toList() as M;
}
if (<TaskBean>[] is M) {
return data.map<TaskBean>((e) => TaskBean.jsonConversion(e)).toList()
as M;
if(<TaskLogBean>[] is M){
return data.map<TaskLogBean>((e) => TaskLogBean.jsonConversion(e)).toList() as M;
}
if (<TaskDetailBean>[] is M) {
return data
.map<TaskDetailBean>((e) => TaskDetailBean.jsonConversion(e))
.toList() as M;
if(<TaskBean>[] is M){
return data.map<TaskBean>((e) => TaskBean.jsonConversion(e)).toList() as M;
}
if(<TaskDetailBean>[] is M){
return data.map<TaskDetailBean>((e) => TaskDetailBean.jsonConversion(e)).toList() as M;
}
throw Exception("not found");

View File

@@ -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<LoginPage> {
final TextEditingController _hostController =
TextEditingController(text: getIt<UserInfoViewModel>().host);
final TextEditingController _hostController = TextEditingController(text: getIt<UserInfoViewModel>().host);
final TextEditingController _userNameController = TextEditingController();
final TextEditingController _passwordController = TextEditingController();
@@ -31,15 +31,13 @@ class _LoginPageState extends ConsumerState<LoginPage> {
void initState() {
super.initState();
if (getIt<UserInfoViewModel>().userName != null &&
getIt<UserInfoViewModel>().userName!.isNotEmpty) {
if (getIt<UserInfoViewModel>().userName != null && getIt<UserInfoViewModel>().userName!.isNotEmpty) {
_userNameController.text = getIt<UserInfoViewModel>().userName!;
rememberPassword = true;
} else {
rememberPassword = false;
}
if (getIt<UserInfoViewModel>().passWord != null &&
getIt<UserInfoViewModel>().passWord!.isNotEmpty) {
if (getIt<UserInfoViewModel>().passWord != null && getIt<UserInfoViewModel>().passWord!.isNotEmpty) {
_passwordController.text = getIt<UserInfoViewModel>().passWord!;
}
getIt<UserInfoViewModel>().updateToken("");
@@ -199,25 +197,15 @@ class _LoginPageState extends ConsumerState<LoginPage> {
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<LoginPage> {
),
onPressed: () {
if (rememberPassword) {
getIt<UserInfoViewModel>().updateUserName(
_userNameController.text,
_passwordController.text);
getIt<UserInfoViewModel>().updateUserName(_userNameController.text, _passwordController.text);
}
Http.pushedLoginPage = false;
Utils.hideKeyBoard(context);
getIt<UserInfoViewModel>()
.updateHost(_hostController.text);
login(_userNameController.text,
_passwordController.text);
getIt<UserInfoViewModel>().updateHost(_hostController.text);
login(_userNameController.text, _passwordController.text);
}),
),
),
@@ -260,8 +244,21 @@ class _LoginPageState extends ConsumerState<LoginPage> {
setState(() {});
HttpResponse<LoginBean> response = await Api.login(userName, password);
if (response.success) {
getIt<UserInfoViewModel>().updateToken(response.bean?.token ?? "");
Navigator.of(context).pushReplacementNamed(Routes.routeHomePage);
HttpResponse<UserBean> 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<UserInfoViewModel>().updateToken(response.bean?.token ?? "");
Navigator.of(context).pushReplacementNamed(Routes.routeHomePage);
}
} else {
(response.message ?? "请检查网络情况").toast();
isLoading = false;
setState(() {});
}
} else {
(response.message ?? "请检查网络情况").toast();
isLoading = false;

View File

@@ -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<String, dynamic> json) {
username = json['username'];
twoFactorActivated = json['twoFactorActivated'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['username'] = this.username;
data['twoFactorActivated'] = this.twoFactorActivated;
return data;
}
static UserBean jsonConversion(Map<String, dynamic> json) {
return UserBean.fromJson(json);
}
}