mirror of
https://github.com/qinglong-app/qinglong_app.git
synced 2025-10-09 16:48:19 +08:00
增加两步验证提醒
This commit is contained in:
@@ -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,
|
||||
[
|
||||
|
||||
@@ -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";
|
||||
|
||||
132
lib/json.jc.dart
132
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<M>(dynamic json) {
|
||||
|
||||
static M fromJson<M>(dynamic json) {
|
||||
if (json is List) {
|
||||
return _getListChildType<M>(json);
|
||||
} else {
|
||||
@@ -20,96 +23,93 @@ 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");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
25
lib/module/login/user_bean.dart
Normal file
25
lib/module/login/user_bean.dart
Normal 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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user