From f389f32d321030be138b3d55ba24387693f1d171 Mon Sep 17 00:00:00 2001 From: jyuesong <425698907@qq.com> Date: Thu, 20 Jan 2022 16:13:08 +0800 Subject: [PATCH 1/9] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=89=AA=E5=88=87?= =?UTF-8?q?=E6=9D=BF=E6=8E=A7=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/base/sp_const.dart | 1 + lib/base/userinfo_viewmodel.dart | 12 +++++ lib/module/config/config_edit_page.dart | 7 ++- lib/module/env/add_env_page.dart | 6 +++ lib/module/login/login_page.dart | 18 +++++-- .../dependencies/add_dependency_page.dart | 4 ++ lib/module/others/other_page.dart | 47 +++++++++++++++++++ .../others/scripts/script_edit_page.dart | 4 ++ lib/module/others/update_password_page.dart | 3 ++ lib/module/task/add_task_page.dart | 6 +++ 10 files changed, 103 insertions(+), 5 deletions(-) diff --git a/lib/base/sp_const.dart b/lib/base/sp_const.dart index 647ce53..c0ac61d 100644 --- a/lib/base/sp_const.dart +++ b/lib/base/sp_const.dart @@ -4,3 +4,4 @@ String spUserName = "username"; String spPassWord = "password"; String spTheme = "dart_mode"; String spSecretLogined = "secret_logined"; +String spForbidClipBoard = "forbid_read_clipboard"; diff --git a/lib/base/userinfo_viewmodel.dart b/lib/base/userinfo_viewmodel.dart index ab33602..8496704 100644 --- a/lib/base/userinfo_viewmodel.dart +++ b/lib/base/userinfo_viewmodel.dart @@ -8,11 +8,16 @@ class UserInfoViewModel { String? _userName; String? _passWord; bool _useSecertLogined = false; + bool _forbidReadClipBoard = false; UserInfoViewModel() { String userInfoJson = SpUtil.getString(spUserInfo); _userName = SpUtil.getString(spUserName); _passWord = SpUtil.getString(spPassWord); + _forbidReadClipBoard = SpUtil.getBool( + spForbidClipBoard, + defValue: false, + ); _useSecertLogined = SpUtil.getBool(spSecretLogined, defValue: false); _host = SpUtil.getString(spHost, defValue: ''); @@ -34,6 +39,11 @@ class UserInfoViewModel { SpUtil.putString(spPassWord, password); } + void forbidReadClipBoard(bool forbid) { + _forbidReadClipBoard = forbid; + SpUtil.putBool(spForbidClipBoard, forbid); + } + void useSecretLogin(bool use) { _useSecertLogined = use; SpUtil.putBool(spSecretLogined, _useSecertLogined); @@ -54,6 +64,8 @@ class UserInfoViewModel { bool get useSecretLogined => _useSecertLogined; + bool get forbidReadClipBoarded => _forbidReadClipBoard; + bool isLogined() { return token != null && token!.isNotEmpty; } diff --git a/lib/module/config/config_edit_page.dart b/lib/module/config/config_edit_page.dart index b7e7268..de67a2d 100644 --- a/lib/module/config/config_edit_page.dart +++ b/lib/module/config/config_edit_page.dart @@ -4,9 +4,12 @@ import 'package:qinglong_app/base/http/api.dart'; import 'package:qinglong_app/base/http/http.dart'; import 'package:qinglong_app/base/ql_app_bar.dart'; import 'package:qinglong_app/base/theme.dart'; +import 'package:qinglong_app/base/userinfo_viewmodel.dart'; import 'package:qinglong_app/module/config/config_viewmodel.dart'; import 'package:qinglong_app/utils/extension.dart'; +import '../../main.dart'; + class ConfigEditPage extends ConsumerStatefulWidget { final String content; final String title; @@ -44,8 +47,7 @@ class _ConfigEditPageState extends ConsumerState { actions: [ InkWell( onTap: () async { - HttpResponse response = - await Api.saveFile(widget.title, _controller.text); + HttpResponse response = await Api.saveFile(widget.title, _controller.text); if (response.success) { "提交成功".toast(); ref.read(configProvider).loadContent(widget.title); @@ -78,6 +80,7 @@ class _ConfigEditPageState extends ConsumerState { ), child: SingleChildScrollView( child: TextField( + enableInteractiveSelection: !getIt().forbidReadClipBoarded, focusNode: node, style: TextStyle( color: ref.read(themeProvider).themeColor.descColor(), diff --git a/lib/module/env/add_env_page.dart b/lib/module/env/add_env_page.dart index 339b86a..4e6127b 100644 --- a/lib/module/env/add_env_page.dart +++ b/lib/module/env/add_env_page.dart @@ -3,10 +3,13 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:qinglong_app/base/http/api.dart'; import 'package:qinglong_app/base/http/http.dart'; import 'package:qinglong_app/base/ql_app_bar.dart'; +import 'package:qinglong_app/base/userinfo_viewmodel.dart'; import 'package:qinglong_app/module/env/env_bean.dart'; import 'package:qinglong_app/module/env/env_viewmodel.dart'; import 'package:qinglong_app/utils/extension.dart'; +import '../../main.dart'; + class AddEnvPage extends ConsumerStatefulWidget { final EnvBean? envBean; @@ -98,6 +101,7 @@ class _AddEnvPageState extends ConsumerState { ), ), TextField( + enableInteractiveSelection: !getIt().forbidReadClipBoarded, focusNode: focusNode, controller: _nameController, decoration: const InputDecoration( @@ -127,6 +131,7 @@ class _AddEnvPageState extends ConsumerState { ), ), TextField( + enableInteractiveSelection: !getIt().forbidReadClipBoarded, controller: _valueController, maxLines: 8, minLines: 1, @@ -157,6 +162,7 @@ class _AddEnvPageState extends ConsumerState { ), ), TextField( + enableInteractiveSelection: !getIt().forbidReadClipBoarded, controller: _remarkController, decoration: const InputDecoration( hintText: "请输入备注", diff --git a/lib/module/login/login_page.dart b/lib/module/login/login_page.dart index dc941b8..2708ddd 100644 --- a/lib/module/login/login_page.dart +++ b/lib/module/login/login_page.dart @@ -142,6 +142,7 @@ class _LoginPageState extends ConsumerState { ), ), TextField( + enableInteractiveSelection: !getIt().forbidReadClipBoarded, onChanged: (_) { setState(() {}); }, @@ -177,6 +178,7 @@ class _LoginPageState extends ConsumerState { ), ), TextField( + enableInteractiveSelection: !getIt().forbidReadClipBoarded, onChanged: (_) { setState(() {}); }, @@ -198,6 +200,7 @@ class _LoginPageState extends ConsumerState { ), ), TextField( + enableInteractiveSelection: !getIt().forbidReadClipBoarded, onChanged: (_) { setState(() {}); }, @@ -233,6 +236,7 @@ class _LoginPageState extends ConsumerState { ), ), TextField( + enableInteractiveSelection: !getIt().forbidReadClipBoarded, onChanged: (_) { setState(() {}); }, @@ -254,6 +258,7 @@ class _LoginPageState extends ConsumerState { ), ), TextField( + enableInteractiveSelection: !getIt().forbidReadClipBoarded, onChanged: (_) { setState(() {}); }, @@ -276,7 +281,9 @@ class _LoginPageState extends ConsumerState { ), ), Padding( - padding: const EdgeInsets.symmetric(horizontal: 25,), + padding: const EdgeInsets.symmetric( + horizontal: 25, + ), child: Row( children: [ Checkbox( @@ -307,7 +314,9 @@ class _LoginPageState extends ConsumerState { ), ), ), - SizedBox(width: 10,), + SizedBox( + width: 10, + ), ], ), ), @@ -316,7 +325,9 @@ class _LoginPageState extends ConsumerState { ), Container( alignment: Alignment.center, - padding: const EdgeInsets.symmetric(horizontal: 40,), + padding: const EdgeInsets.symmetric( + horizontal: 40, + ), child: SizedBox( width: MediaQuery.of(context).size.width - 80, child: IgnorePointer( @@ -396,6 +407,7 @@ class _LoginPageState extends ConsumerState { onChanged: (value) { twoFact = value; }, + enableInteractiveSelection: !getIt().forbidReadClipBoarded, maxLines: 1, keyboardType: TextInputType.number, decoration: const InputDecoration( diff --git a/lib/module/others/dependencies/add_dependency_page.dart b/lib/module/others/dependencies/add_dependency_page.dart index f1ba40b..4da32c5 100644 --- a/lib/module/others/dependencies/add_dependency_page.dart +++ b/lib/module/others/dependencies/add_dependency_page.dart @@ -4,9 +4,12 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:qinglong_app/base/http/api.dart'; import 'package:qinglong_app/base/http/http.dart'; import 'package:qinglong_app/base/ql_app_bar.dart'; +import 'package:qinglong_app/base/userinfo_viewmodel.dart'; import 'package:qinglong_app/module/others/dependencies/dependency_viewmodel.dart'; import 'package:qinglong_app/utils/extension.dart'; +import '../../../main.dart'; + class AddDependencyPage extends ConsumerStatefulWidget { const AddDependencyPage({ Key? key, @@ -132,6 +135,7 @@ class _AddDependencyPageState extends ConsumerState { height: 10, ), TextField( + enableInteractiveSelection: !getIt().forbidReadClipBoarded, controller: _nameController, decoration: const InputDecoration( contentPadding: EdgeInsets.fromLTRB(0, 5, 0, 5), diff --git a/lib/module/others/other_page.dart b/lib/module/others/other_page.dart index 68d0921..25a33b5 100644 --- a/lib/module/others/other_page.dart +++ b/lib/module/others/other_page.dart @@ -278,6 +278,53 @@ class _OtherPageState extends ConsumerState { const Divider( indent: 15, ), + Padding( + padding: const EdgeInsets.only( + left: 15, + right: 15, + top: 5, + ), + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Expanded( + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "禁止读取剪切板", + style: TextStyle( + color: ref.watch(themeProvider).themeColor.titleColor(), + fontSize: 16, + ), + ), + Text( + "开启后输入框无法使用系统自带的复制粘贴功能,输入法的复制粘贴功能不受影响", + style: TextStyle( + color: ref.watch(themeProvider).themeColor.descColor(), + fontSize: 12, + ), + ), + ], + ), + ), + CupertinoSwitch( + value: getIt().forbidReadClipBoarded, + onChanged: (forbid) { + getIt().forbidReadClipBoard(forbid); + setState(() { + + }); + }, + ), + ], + ), + ), + const Divider( + indent: 15, + ), GestureDetector( behavior: HitTestBehavior.opaque, onTap: () { diff --git a/lib/module/others/scripts/script_edit_page.dart b/lib/module/others/scripts/script_edit_page.dart index 8c9dc45..c7a960f 100644 --- a/lib/module/others/scripts/script_edit_page.dart +++ b/lib/module/others/scripts/script_edit_page.dart @@ -4,9 +4,12 @@ import 'package:qinglong_app/base/http/api.dart'; import 'package:qinglong_app/base/http/http.dart'; import 'package:qinglong_app/base/ql_app_bar.dart'; import 'package:qinglong_app/base/theme.dart'; +import 'package:qinglong_app/base/userinfo_viewmodel.dart'; import 'package:qinglong_app/module/config/config_viewmodel.dart'; import 'package:qinglong_app/utils/extension.dart'; +import '../../../main.dart'; + class ScriptEditPage extends ConsumerStatefulWidget { final String content; final String title; @@ -77,6 +80,7 @@ class _ScriptEditPageState extends ConsumerState { ), child: SingleChildScrollView( child: TextField( + enableInteractiveSelection: !getIt().forbidReadClipBoarded, focusNode: node, style: TextStyle( color: ref.read(themeProvider).themeColor.descColor(), diff --git a/lib/module/others/update_password_page.dart b/lib/module/others/update_password_page.dart index 12716ac..50f373c 100644 --- a/lib/module/others/update_password_page.dart +++ b/lib/module/others/update_password_page.dart @@ -92,6 +92,7 @@ class _UpdatePasswordPageState extends ConsumerState { ), ), TextField( + enableInteractiveSelection: !getIt().forbidReadClipBoarded, focusNode: focusNode, controller: _nameController, decoration: const InputDecoration( @@ -122,6 +123,7 @@ class _UpdatePasswordPageState extends ConsumerState { ), ), TextField( + enableInteractiveSelection: !getIt().forbidReadClipBoarded, obscureText: true, controller: _passwordController, maxLines: 1, @@ -153,6 +155,7 @@ class _UpdatePasswordPageState extends ConsumerState { ), ), TextField( + enableInteractiveSelection: false, obscureText: true, maxLines: 1, controller: _passwordAgainController, diff --git a/lib/module/task/add_task_page.dart b/lib/module/task/add_task_page.dart index 5f6c575..1bd9bff 100644 --- a/lib/module/task/add_task_page.dart +++ b/lib/module/task/add_task_page.dart @@ -3,10 +3,13 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:qinglong_app/base/http/api.dart'; import 'package:qinglong_app/base/http/http.dart'; import 'package:qinglong_app/base/ql_app_bar.dart'; +import 'package:qinglong_app/base/userinfo_viewmodel.dart'; import 'package:qinglong_app/module/task/task_bean.dart'; import 'package:qinglong_app/module/task/task_viewmodel.dart'; import 'package:qinglong_app/utils/extension.dart'; +import '../../main.dart'; + class AddTaskPage extends ConsumerStatefulWidget { final TaskBean? taskBean; @@ -98,6 +101,7 @@ class _AddTaskPageState extends ConsumerState { ), ), TextField( + enableInteractiveSelection: !getIt().forbidReadClipBoarded, focusNode: focusNode, controller: _nameController, decoration: const InputDecoration( @@ -128,6 +132,7 @@ class _AddTaskPageState extends ConsumerState { ), ), TextField( + enableInteractiveSelection: !getIt().forbidReadClipBoarded, controller: _commandController, maxLines: 4, minLines: 1, @@ -159,6 +164,7 @@ class _AddTaskPageState extends ConsumerState { ), ), TextField( + enableInteractiveSelection: !getIt().forbidReadClipBoarded, controller: _cronController, decoration: const InputDecoration( contentPadding: EdgeInsets.fromLTRB(0, 5, 0, 5), From 9b51b5c26cf4166a2f827221e66c6ee89da9ad43 Mon Sep 17 00:00:00 2001 From: jyuesong <425698907@qq.com> Date: Thu, 20 Jan 2022 19:59:37 +0800 Subject: [PATCH 2/9] fix bug --- lib/base/http/api.dart | 2 ++ lib/module/env/env_bean.dart | 11 ++--------- lib/module/task/task_bean.dart | 2 +- 3 files changed, 5 insertions(+), 10 deletions(-) diff --git a/lib/base/http/api.dart b/lib/base/http/api.dart index 508a26e..d37a33c 100644 --- a/lib/base/http/api.dart +++ b/lib/base/http/api.dart @@ -103,6 +103,7 @@ class Api { if (id != null) { data["_id"] = id; + data["id"] = id; return await Http.put( Url.addTask, data, @@ -207,6 +208,7 @@ class Api { if (id != null) { data["_id"] = id; + data["id"] = id; return await Http.put( Url.addEnv, data, diff --git a/lib/module/env/env_bean.dart b/lib/module/env/env_bean.dart index 1cf32f9..d54c3d5 100644 --- a/lib/module/env/env_bean.dart +++ b/lib/module/env/env_bean.dart @@ -10,18 +10,11 @@ class EnvBean { String? name; String? remarks; - EnvBean( - {this.value, - this.sId, - this.created, - this.status, - this.timestamp, - this.name, - this.remarks}); + EnvBean({this.value, this.sId, this.created, this.status, this.timestamp, this.name, this.remarks}); EnvBean.fromJson(Map json) { value = json['value']; - sId = json['_id']; + sId = json.containsKey('_id') ? json['_id'].toString() : (json.containsKey('id') ? json['id'].toString() : ""); created = json['created']; status = json['status']; timestamp = json['timestamp']; diff --git a/lib/module/task/task_bean.dart b/lib/module/task/task_bean.dart index d320e50..7d8ddf6 100644 --- a/lib/module/task/task_bean.dart +++ b/lib/module/task/task_bean.dart @@ -43,7 +43,7 @@ class TaskBean { command = json['command'].toString(); schedule = json['schedule'].toString(); saved = json['saved']; - sId = json['_id'].toString(); + sId = json.containsKey('_id') ? json['_id'].toString() : (json.containsKey('id') ? json['id'].toString() : ""); created = json['created']; status = json['status']; timestamp = json['timestamp'].toString(); From d7aa3b73486f8f15646f8ed38cacf649801fbf9c Mon Sep 17 00:00:00 2001 From: NewTab <425698907@qq.com> Date: Thu, 20 Jan 2022 21:32:09 +0800 Subject: [PATCH 3/9] Update http.dart --- lib/base/http/http.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/base/http/http.dart b/lib/base/http/http.dart index f6d0133..d6fa876 100644 --- a/lib/base/http/http.dart +++ b/lib/base/http/http.dart @@ -126,7 +126,7 @@ class Http { } static HttpResponse exceptionHandler(DioError e) { - if (e.response?.statusCode == 401) { + if (e.response?.data!= null && e.response?.data['code'] == 401) { if (!getIt().useSecretLogined) { exitLogin(); } From 83cd53d23c73314772c4ae833b2008b087618537 Mon Sep 17 00:00:00 2001 From: NewTab <425698907@qq.com> Date: Thu, 20 Jan 2022 22:20:36 +0800 Subject: [PATCH 4/9] Update token_interceptor.dart --- lib/base/http/token_interceptor.dart | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/lib/base/http/token_interceptor.dart b/lib/base/http/token_interceptor.dart index 294e872..bc24af4 100644 --- a/lib/base/http/token_interceptor.dart +++ b/lib/base/http/token_interceptor.dart @@ -13,10 +13,21 @@ class TokenInterceptor extends Interceptor { "Bearer " + getIt().token!; } - options.headers["User-Agent"] = "Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1"; + options.headers["User-Agent"] = + "Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1"; options.headers["Content-Type"] = "application/json;charset=UTF-8"; - if (options.path != Url.loginByClientId && options.path!= Url.loginTwo) { + + // '/api/user/login', + // '/open/auth/token', + // '/api/user/two-factor/login', + // '/api/system', + // '/api/user/init', + // '/api/user/notification/init' + + if (options.path != Url.loginByClientId && + options.path != Url.loginTwo && + options.path != Url.login) { options.queryParameters["t"] = (DateTime.now().millisecondsSinceEpoch ~/ 1000).toString(); } From 2932ad3a641f464f3daa16856ccbfaf6157e4434 Mon Sep 17 00:00:00 2001 From: jyuesong <425698907@qq.com> Date: Fri, 21 Jan 2022 10:01:40 +0800 Subject: [PATCH 5/9] =?UTF-8?q?Revert=20"=E5=A2=9E=E5=8A=A0=E5=89=AA?= =?UTF-8?q?=E5=88=87=E6=9D=BF=E6=8E=A7=E5=88=B6"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit f389f32d --- lib/base/sp_const.dart | 1 - lib/base/userinfo_viewmodel.dart | 12 ----- lib/module/config/config_edit_page.dart | 7 +-- lib/module/env/add_env_page.dart | 6 --- lib/module/login/login_page.dart | 18 ++----- .../dependencies/add_dependency_page.dart | 4 -- lib/module/others/other_page.dart | 47 ------------------- .../others/scripts/script_edit_page.dart | 4 -- lib/module/others/update_password_page.dart | 3 -- lib/module/task/add_task_page.dart | 6 --- 10 files changed, 5 insertions(+), 103 deletions(-) diff --git a/lib/base/sp_const.dart b/lib/base/sp_const.dart index c0ac61d..647ce53 100644 --- a/lib/base/sp_const.dart +++ b/lib/base/sp_const.dart @@ -4,4 +4,3 @@ String spUserName = "username"; String spPassWord = "password"; String spTheme = "dart_mode"; String spSecretLogined = "secret_logined"; -String spForbidClipBoard = "forbid_read_clipboard"; diff --git a/lib/base/userinfo_viewmodel.dart b/lib/base/userinfo_viewmodel.dart index 8496704..ab33602 100644 --- a/lib/base/userinfo_viewmodel.dart +++ b/lib/base/userinfo_viewmodel.dart @@ -8,16 +8,11 @@ class UserInfoViewModel { String? _userName; String? _passWord; bool _useSecertLogined = false; - bool _forbidReadClipBoard = false; UserInfoViewModel() { String userInfoJson = SpUtil.getString(spUserInfo); _userName = SpUtil.getString(spUserName); _passWord = SpUtil.getString(spPassWord); - _forbidReadClipBoard = SpUtil.getBool( - spForbidClipBoard, - defValue: false, - ); _useSecertLogined = SpUtil.getBool(spSecretLogined, defValue: false); _host = SpUtil.getString(spHost, defValue: ''); @@ -39,11 +34,6 @@ class UserInfoViewModel { SpUtil.putString(spPassWord, password); } - void forbidReadClipBoard(bool forbid) { - _forbidReadClipBoard = forbid; - SpUtil.putBool(spForbidClipBoard, forbid); - } - void useSecretLogin(bool use) { _useSecertLogined = use; SpUtil.putBool(spSecretLogined, _useSecertLogined); @@ -64,8 +54,6 @@ class UserInfoViewModel { bool get useSecretLogined => _useSecertLogined; - bool get forbidReadClipBoarded => _forbidReadClipBoard; - bool isLogined() { return token != null && token!.isNotEmpty; } diff --git a/lib/module/config/config_edit_page.dart b/lib/module/config/config_edit_page.dart index de67a2d..b7e7268 100644 --- a/lib/module/config/config_edit_page.dart +++ b/lib/module/config/config_edit_page.dart @@ -4,12 +4,9 @@ import 'package:qinglong_app/base/http/api.dart'; import 'package:qinglong_app/base/http/http.dart'; import 'package:qinglong_app/base/ql_app_bar.dart'; import 'package:qinglong_app/base/theme.dart'; -import 'package:qinglong_app/base/userinfo_viewmodel.dart'; import 'package:qinglong_app/module/config/config_viewmodel.dart'; import 'package:qinglong_app/utils/extension.dart'; -import '../../main.dart'; - class ConfigEditPage extends ConsumerStatefulWidget { final String content; final String title; @@ -47,7 +44,8 @@ class _ConfigEditPageState extends ConsumerState { actions: [ InkWell( onTap: () async { - HttpResponse response = await Api.saveFile(widget.title, _controller.text); + HttpResponse response = + await Api.saveFile(widget.title, _controller.text); if (response.success) { "提交成功".toast(); ref.read(configProvider).loadContent(widget.title); @@ -80,7 +78,6 @@ class _ConfigEditPageState extends ConsumerState { ), child: SingleChildScrollView( child: TextField( - enableInteractiveSelection: !getIt().forbidReadClipBoarded, focusNode: node, style: TextStyle( color: ref.read(themeProvider).themeColor.descColor(), diff --git a/lib/module/env/add_env_page.dart b/lib/module/env/add_env_page.dart index 4e6127b..339b86a 100644 --- a/lib/module/env/add_env_page.dart +++ b/lib/module/env/add_env_page.dart @@ -3,13 +3,10 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:qinglong_app/base/http/api.dart'; import 'package:qinglong_app/base/http/http.dart'; import 'package:qinglong_app/base/ql_app_bar.dart'; -import 'package:qinglong_app/base/userinfo_viewmodel.dart'; import 'package:qinglong_app/module/env/env_bean.dart'; import 'package:qinglong_app/module/env/env_viewmodel.dart'; import 'package:qinglong_app/utils/extension.dart'; -import '../../main.dart'; - class AddEnvPage extends ConsumerStatefulWidget { final EnvBean? envBean; @@ -101,7 +98,6 @@ class _AddEnvPageState extends ConsumerState { ), ), TextField( - enableInteractiveSelection: !getIt().forbidReadClipBoarded, focusNode: focusNode, controller: _nameController, decoration: const InputDecoration( @@ -131,7 +127,6 @@ class _AddEnvPageState extends ConsumerState { ), ), TextField( - enableInteractiveSelection: !getIt().forbidReadClipBoarded, controller: _valueController, maxLines: 8, minLines: 1, @@ -162,7 +157,6 @@ class _AddEnvPageState extends ConsumerState { ), ), TextField( - enableInteractiveSelection: !getIt().forbidReadClipBoarded, controller: _remarkController, decoration: const InputDecoration( hintText: "请输入备注", diff --git a/lib/module/login/login_page.dart b/lib/module/login/login_page.dart index 2708ddd..dc941b8 100644 --- a/lib/module/login/login_page.dart +++ b/lib/module/login/login_page.dart @@ -142,7 +142,6 @@ class _LoginPageState extends ConsumerState { ), ), TextField( - enableInteractiveSelection: !getIt().forbidReadClipBoarded, onChanged: (_) { setState(() {}); }, @@ -178,7 +177,6 @@ class _LoginPageState extends ConsumerState { ), ), TextField( - enableInteractiveSelection: !getIt().forbidReadClipBoarded, onChanged: (_) { setState(() {}); }, @@ -200,7 +198,6 @@ class _LoginPageState extends ConsumerState { ), ), TextField( - enableInteractiveSelection: !getIt().forbidReadClipBoarded, onChanged: (_) { setState(() {}); }, @@ -236,7 +233,6 @@ class _LoginPageState extends ConsumerState { ), ), TextField( - enableInteractiveSelection: !getIt().forbidReadClipBoarded, onChanged: (_) { setState(() {}); }, @@ -258,7 +254,6 @@ class _LoginPageState extends ConsumerState { ), ), TextField( - enableInteractiveSelection: !getIt().forbidReadClipBoarded, onChanged: (_) { setState(() {}); }, @@ -281,9 +276,7 @@ class _LoginPageState extends ConsumerState { ), ), Padding( - padding: const EdgeInsets.symmetric( - horizontal: 25, - ), + padding: const EdgeInsets.symmetric(horizontal: 25,), child: Row( children: [ Checkbox( @@ -314,9 +307,7 @@ class _LoginPageState extends ConsumerState { ), ), ), - SizedBox( - width: 10, - ), + SizedBox(width: 10,), ], ), ), @@ -325,9 +316,7 @@ class _LoginPageState extends ConsumerState { ), Container( alignment: Alignment.center, - padding: const EdgeInsets.symmetric( - horizontal: 40, - ), + padding: const EdgeInsets.symmetric(horizontal: 40,), child: SizedBox( width: MediaQuery.of(context).size.width - 80, child: IgnorePointer( @@ -407,7 +396,6 @@ class _LoginPageState extends ConsumerState { onChanged: (value) { twoFact = value; }, - enableInteractiveSelection: !getIt().forbidReadClipBoarded, maxLines: 1, keyboardType: TextInputType.number, decoration: const InputDecoration( diff --git a/lib/module/others/dependencies/add_dependency_page.dart b/lib/module/others/dependencies/add_dependency_page.dart index 4da32c5..f1ba40b 100644 --- a/lib/module/others/dependencies/add_dependency_page.dart +++ b/lib/module/others/dependencies/add_dependency_page.dart @@ -4,12 +4,9 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:qinglong_app/base/http/api.dart'; import 'package:qinglong_app/base/http/http.dart'; import 'package:qinglong_app/base/ql_app_bar.dart'; -import 'package:qinglong_app/base/userinfo_viewmodel.dart'; import 'package:qinglong_app/module/others/dependencies/dependency_viewmodel.dart'; import 'package:qinglong_app/utils/extension.dart'; -import '../../../main.dart'; - class AddDependencyPage extends ConsumerStatefulWidget { const AddDependencyPage({ Key? key, @@ -135,7 +132,6 @@ class _AddDependencyPageState extends ConsumerState { height: 10, ), TextField( - enableInteractiveSelection: !getIt().forbidReadClipBoarded, controller: _nameController, decoration: const InputDecoration( contentPadding: EdgeInsets.fromLTRB(0, 5, 0, 5), diff --git a/lib/module/others/other_page.dart b/lib/module/others/other_page.dart index 25a33b5..68d0921 100644 --- a/lib/module/others/other_page.dart +++ b/lib/module/others/other_page.dart @@ -278,53 +278,6 @@ class _OtherPageState extends ConsumerState { const Divider( indent: 15, ), - Padding( - padding: const EdgeInsets.only( - left: 15, - right: 15, - top: 5, - ), - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Expanded( - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - "禁止读取剪切板", - style: TextStyle( - color: ref.watch(themeProvider).themeColor.titleColor(), - fontSize: 16, - ), - ), - Text( - "开启后输入框无法使用系统自带的复制粘贴功能,输入法的复制粘贴功能不受影响", - style: TextStyle( - color: ref.watch(themeProvider).themeColor.descColor(), - fontSize: 12, - ), - ), - ], - ), - ), - CupertinoSwitch( - value: getIt().forbidReadClipBoarded, - onChanged: (forbid) { - getIt().forbidReadClipBoard(forbid); - setState(() { - - }); - }, - ), - ], - ), - ), - const Divider( - indent: 15, - ), GestureDetector( behavior: HitTestBehavior.opaque, onTap: () { diff --git a/lib/module/others/scripts/script_edit_page.dart b/lib/module/others/scripts/script_edit_page.dart index c7a960f..8c9dc45 100644 --- a/lib/module/others/scripts/script_edit_page.dart +++ b/lib/module/others/scripts/script_edit_page.dart @@ -4,12 +4,9 @@ import 'package:qinglong_app/base/http/api.dart'; import 'package:qinglong_app/base/http/http.dart'; import 'package:qinglong_app/base/ql_app_bar.dart'; import 'package:qinglong_app/base/theme.dart'; -import 'package:qinglong_app/base/userinfo_viewmodel.dart'; import 'package:qinglong_app/module/config/config_viewmodel.dart'; import 'package:qinglong_app/utils/extension.dart'; -import '../../../main.dart'; - class ScriptEditPage extends ConsumerStatefulWidget { final String content; final String title; @@ -80,7 +77,6 @@ class _ScriptEditPageState extends ConsumerState { ), child: SingleChildScrollView( child: TextField( - enableInteractiveSelection: !getIt().forbidReadClipBoarded, focusNode: node, style: TextStyle( color: ref.read(themeProvider).themeColor.descColor(), diff --git a/lib/module/others/update_password_page.dart b/lib/module/others/update_password_page.dart index 50f373c..12716ac 100644 --- a/lib/module/others/update_password_page.dart +++ b/lib/module/others/update_password_page.dart @@ -92,7 +92,6 @@ class _UpdatePasswordPageState extends ConsumerState { ), ), TextField( - enableInteractiveSelection: !getIt().forbidReadClipBoarded, focusNode: focusNode, controller: _nameController, decoration: const InputDecoration( @@ -123,7 +122,6 @@ class _UpdatePasswordPageState extends ConsumerState { ), ), TextField( - enableInteractiveSelection: !getIt().forbidReadClipBoarded, obscureText: true, controller: _passwordController, maxLines: 1, @@ -155,7 +153,6 @@ class _UpdatePasswordPageState extends ConsumerState { ), ), TextField( - enableInteractiveSelection: false, obscureText: true, maxLines: 1, controller: _passwordAgainController, diff --git a/lib/module/task/add_task_page.dart b/lib/module/task/add_task_page.dart index 1bd9bff..5f6c575 100644 --- a/lib/module/task/add_task_page.dart +++ b/lib/module/task/add_task_page.dart @@ -3,13 +3,10 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:qinglong_app/base/http/api.dart'; import 'package:qinglong_app/base/http/http.dart'; import 'package:qinglong_app/base/ql_app_bar.dart'; -import 'package:qinglong_app/base/userinfo_viewmodel.dart'; import 'package:qinglong_app/module/task/task_bean.dart'; import 'package:qinglong_app/module/task/task_viewmodel.dart'; import 'package:qinglong_app/utils/extension.dart'; -import '../../main.dart'; - class AddTaskPage extends ConsumerStatefulWidget { final TaskBean? taskBean; @@ -101,7 +98,6 @@ class _AddTaskPageState extends ConsumerState { ), ), TextField( - enableInteractiveSelection: !getIt().forbidReadClipBoarded, focusNode: focusNode, controller: _nameController, decoration: const InputDecoration( @@ -132,7 +128,6 @@ class _AddTaskPageState extends ConsumerState { ), ), TextField( - enableInteractiveSelection: !getIt().forbidReadClipBoarded, controller: _commandController, maxLines: 4, minLines: 1, @@ -164,7 +159,6 @@ class _AddTaskPageState extends ConsumerState { ), ), TextField( - enableInteractiveSelection: !getIt().forbidReadClipBoarded, controller: _cronController, decoration: const InputDecoration( contentPadding: EdgeInsets.fromLTRB(0, 5, 0, 5), From abc61309405230f16f18973c015b26af6ca2eab3 Mon Sep 17 00:00:00 2001 From: jyuesong <425698907@qq.com> Date: Fri, 21 Jan 2022 10:30:57 +0800 Subject: [PATCH 6/9] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=80=81=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E6=97=A0=E6=B3=95=E7=99=BB=E5=BD=95=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/base/http/api.dart | 13 +- lib/base/http/http.dart | 13 +- lib/base/http/token_interceptor.dart | 19 +-- lib/base/http/url.dart | 14 +- lib/module/login/login_page.dart | 194 ++++++++++++++------------- lib/module/others/about_page.dart | 15 +++ lib/module/others/other_page.dart | 3 + 7 files changed, 152 insertions(+), 119 deletions(-) diff --git a/lib/base/http/api.dart b/lib/base/http/api.dart index d37a33c..577da93 100644 --- a/lib/base/http/api.dart +++ b/lib/base/http/api.dart @@ -24,7 +24,18 @@ class Api { }, ); } - + static Future> loginOld( + String userName, + String passWord, + ) async { + return await Http.post( + Url.loginOld, + { + "username": userName, + "password": passWord, + }, + ); + } static Future> loginTwo( String userName, String passWord, diff --git a/lib/base/http/http.dart b/lib/base/http/http.dart index d6fa876..0832509 100644 --- a/lib/base/http/http.dart +++ b/lib/base/http/http.dart @@ -5,6 +5,7 @@ import 'package:dio/dio.dart'; import 'package:dio_log/dio_log.dart'; import 'package:flutter/foundation.dart'; import 'package:qinglong_app/base/http/token_interceptor.dart'; +import 'package:qinglong_app/base/http/url.dart'; import 'package:qinglong_app/base/userinfo_viewmodel.dart'; import 'package:qinglong_app/utils/extension.dart'; @@ -54,7 +55,7 @@ class Http { return decodeResponse(response, serializationName, compute); } on DioError catch (e) { - return exceptionHandler(e); + return exceptionHandler(e, uri); } } @@ -74,7 +75,7 @@ class Http { compute, ); } on DioError catch (e) { - return exceptionHandler(e); + return exceptionHandler(e, uri); } } @@ -94,7 +95,7 @@ class Http { compute, ); } on DioError catch (e) { - return exceptionHandler(e); + return exceptionHandler(e, uri); } } @@ -113,7 +114,7 @@ class Http { compute, ); } on DioError catch (e) { - return exceptionHandler(e); + return exceptionHandler(e, uri); } } @@ -125,8 +126,8 @@ class Http { } } - static HttpResponse exceptionHandler(DioError e) { - if (e.response?.data!= null && e.response?.data['code'] == 401) { + static HttpResponse exceptionHandler(DioError e, String path) { + if (e.response?.statusCode == 401 && !Url.inWhiteList(path)) { if (!getIt().useSecretLogined) { exitLogin(); } diff --git a/lib/base/http/token_interceptor.dart b/lib/base/http/token_interceptor.dart index bc24af4..e174885 100644 --- a/lib/base/http/token_interceptor.dart +++ b/lib/base/http/token_interceptor.dart @@ -7,10 +7,8 @@ import '../userinfo_viewmodel.dart'; class TokenInterceptor extends Interceptor { @override void onRequest(RequestOptions options, RequestInterceptorHandler handler) { - if (getIt().token != null && - getIt().token!.isNotEmpty) { - options.headers["Authorization"] = - "Bearer " + getIt().token!; + if (getIt().token != null && getIt().token!.isNotEmpty) { + options.headers["Authorization"] = "Bearer " + getIt().token!; } options.headers["User-Agent"] = @@ -18,18 +16,9 @@ class TokenInterceptor extends Interceptor { options.headers["Content-Type"] = "application/json;charset=UTF-8"; - // '/api/user/login', - // '/open/auth/token', - // '/api/user/two-factor/login', - // '/api/system', - // '/api/user/init', - // '/api/user/notification/init' - if (options.path != Url.loginByClientId && - options.path != Url.loginTwo && - options.path != Url.login) { - options.queryParameters["t"] = - (DateTime.now().millisecondsSinceEpoch ~/ 1000).toString(); + if (!Url.inWhiteList(options.path)) { + options.queryParameters["t"] = (DateTime.now().millisecondsSinceEpoch ~/ 1000).toString(); } return handler.next(options); } diff --git a/lib/base/http/url.dart b/lib/base/http/url.dart index 7bd8cb4..4b6345d 100644 --- a/lib/base/http/url.dart +++ b/lib/base/http/url.dart @@ -3,6 +3,9 @@ import '../userinfo_viewmodel.dart'; class Url { static get login => "/api/user/login"; + + static get loginOld => "/api/login"; + static get loginTwo => "/api/user/two-factor/login"; static const loginByClientId = "/open/auth/token"; static const user = "/api/user"; @@ -50,6 +53,7 @@ class Url { static get taskLogDetail => getIt().useSecretLogined ? "/open/logs/" : "/api/logs/"; static get scripts => getIt().useSecretLogined ? "/open/scripts/files" : "/api/scripts/files"; + static get scriptUpdate => getIt().useSecretLogined ? "/open/scripts" : "/api/scripts"; static get scriptDetail => getIt().useSecretLogined ? "/open/scripts/" : "/api/scripts/"; @@ -58,9 +62,6 @@ class Url { static get dependencyReinstall => getIt().useSecretLogined ? "/open/dependencies/reinstall" : "/api/dependencies/reinstall"; - - - static intimeLog(String cronId) { return getIt().useSecretLogined ? "/open/crons/$cronId/log" : "/api/crons/$cronId/log"; } @@ -68,4 +69,11 @@ class Url { static envMove(String envId) { return getIt().useSecretLogined ? "/open/envs/$envId/move" : "/api/envs/$envId/move"; } + + static bool inWhiteList(String path) { + if (path == login || path == loginByClientId || path == loginTwo || path == loginOld) { + return true; + } + return false; + } } diff --git a/lib/module/login/login_page.dart b/lib/module/login/login_page.dart index dc941b8..90a07d1 100644 --- a/lib/module/login/login_page.dart +++ b/lib/module/login/login_page.dart @@ -94,42 +94,24 @@ class _LoginPageState extends ConsumerState { crossAxisAlignment: CrossAxisAlignment.start, children: [ SizedBox( - height: MediaQuery.of(context).size.height / 10, + height: MediaQuery.of(context).size.height / 8, ), - SizedBox( - height: 50, - width: MediaQuery.of(context).size.width, - child: Stack( - children: [ - Positioned( - top: 0, - left: 0, + Row( + children: [ + Expanded( + child: Align( + alignment: Alignment.centerLeft, child: Image.asset( "assets/images/login_tip.png", height: 45, ), ), - const Positioned( - top: 10, - left: 0, - child: Text( - "登录", - style: TextStyle( - fontSize: 30, - fontWeight: FontWeight.bold, - ), - ), - ), - Positioned( - top: 5, - right: 0, - child: Image.asset( - "assets/images/ql.png", - height: 45, - ), - ), - ], - ), + ), + Image.asset( + "assets/images/ql.png", + height: 45, + ), + ], ), SizedBox( height: MediaQuery.of(context).size.height / 15, @@ -276,7 +258,9 @@ class _LoginPageState extends ConsumerState { ), ), Padding( - padding: const EdgeInsets.symmetric(horizontal: 25,), + padding: const EdgeInsets.symmetric( + horizontal: 25, + ), child: Row( children: [ Checkbox( @@ -307,7 +291,9 @@ class _LoginPageState extends ConsumerState { ), ), ), - SizedBox(width: 10,), + SizedBox( + width: 10, + ), ], ), ), @@ -316,7 +302,9 @@ class _LoginPageState extends ConsumerState { ), Container( alignment: Alignment.center, - padding: const EdgeInsets.symmetric(horizontal: 40,), + padding: const EdgeInsets.symmetric( + horizontal: 40, + ), child: SizedBox( width: MediaQuery.of(context).size.width - 80, child: IgnorePointer( @@ -377,72 +365,26 @@ class _LoginPageState extends ConsumerState { } if (response.success) { loginSuccess(response, userName, password); + } else if (loginByUserName() && response.code == 401) { + //可能用户使用的是老版本qinglong + HttpResponse oldResponse = await Api.loginOld(userName, password); + if (oldResponse.success) { + loginSuccess(oldResponse, userName, password); + } else { + (oldResponse.message ?? "请检查网络情况").toast(); + if (oldResponse.code == 420) { + twoFact(userName, password); + } else { + isLoading = false; + setState(() {}); + } + } } else { print(response.code); (response.message ?? "请检查网络情况").toast(); //420代表需要2步验证 if (response.code == 420) { - String twoFact = ""; - showCupertinoDialog( - context: context, - builder: (_) => CupertinoAlertDialog( - title: const Text("两步验证"), - content: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Material( - color: Colors.transparent, - child: TextField( - onChanged: (value) { - twoFact = value; - }, - maxLines: 1, - keyboardType: TextInputType.number, - decoration: const InputDecoration( - contentPadding: EdgeInsets.fromLTRB(0, 5, 0, 5), - hintText: "请输入code", - ), - autofocus: true, - ), - ), - ], - ), - actions: [ - CupertinoDialogAction( - child: const Text( - "取消", - style: TextStyle( - color: Color(0xff999999), - ), - ), - onPressed: () { - Navigator.of(context).pop(); - }, - ), - CupertinoDialogAction( - child: Text( - "确定", - style: TextStyle( - color: primaryColor, - ), - ), - onPressed: () async { - Navigator.of(context).pop(true); - HttpResponse response = await Api.loginTwo(userName, password, twoFact); - if (response.success) { - loginSuccess(response, userName, password); - } else { - loginFailed(response); - } - }, - ), - ], - )).then((value) { - if (value == null) { - isLoading = false; - setState(() {}); - } - }); + twoFact(userName, password); } else { isLoading = false; setState(() {}); @@ -475,4 +417,68 @@ class _LoginPageState extends ConsumerState { return _userNameController.text.isNotEmpty && _passwordController.text.isNotEmpty; } } + + void twoFact(String userName, String password) { + String twoFact = ""; + showCupertinoDialog( + context: context, + builder: (_) => CupertinoAlertDialog( + title: const Text("两步验证"), + content: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Material( + color: Colors.transparent, + child: TextField( + onChanged: (value) { + twoFact = value; + }, + maxLines: 1, + keyboardType: TextInputType.number, + decoration: const InputDecoration( + contentPadding: EdgeInsets.fromLTRB(0, 5, 0, 5), + hintText: "请输入code", + ), + autofocus: true, + ), + ), + ], + ), + actions: [ + CupertinoDialogAction( + child: const Text( + "取消", + style: TextStyle( + color: Color(0xff999999), + ), + ), + onPressed: () { + Navigator.of(context).pop(); + }, + ), + CupertinoDialogAction( + child: Text( + "确定", + style: TextStyle( + color: primaryColor, + ), + ), + onPressed: () async { + Navigator.of(context).pop(true); + HttpResponse response = await Api.loginTwo(userName, password, twoFact); + if (response.success) { + loginSuccess(response, userName, password); + } else { + loginFailed(response); + } + }, + ), + ], + )).then((value) { + if (value == null) { + isLoading = false; + setState(() {}); + } + }); + } } diff --git a/lib/module/others/about_page.dart b/lib/module/others/about_page.dart index 4c4e825..6a21fcd 100644 --- a/lib/module/others/about_page.dart +++ b/lib/module/others/about_page.dart @@ -66,6 +66,21 @@ class _AboutPageState extends ConsumerState { fontSize: 16, ), ), + const SizedBox( + height: 15, + ), + GestureDetector( + onTap: () { + _launchURL("https://t.me/qinglongapp"); + }, + child: Text( + "Telegram频道", + style: TextStyle( + color: primaryColor, + fontSize: 16, + ), + ), + ), const Spacer(), Row( children: [ diff --git a/lib/module/others/other_page.dart b/lib/module/others/other_page.dart index 68d0921..339bf68 100644 --- a/lib/module/others/other_page.dart +++ b/lib/module/others/other_page.dart @@ -367,6 +367,9 @@ class _OtherPageState extends ConsumerState { }), ), ), + const SizedBox( + height: 30, + ), ], ), ); From 42cf89f7c5d29da3361641b2bc408f8560543a6d Mon Sep 17 00:00:00 2001 From: jyuesong <425698907@qq.com> Date: Fri, 21 Jan 2022 10:33:17 +0800 Subject: [PATCH 7/9] =?UTF-8?q?=E6=8C=87=E5=AE=9Aflutter=E7=BC=96=E8=AF=91?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pubspec.lock | 2 +- pubspec.yaml | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index 25589ca..32253ba 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -884,4 +884,4 @@ packages: version: "3.1.0" sdks: dart: ">=2.15.1 <3.0.0" - flutter: ">=2.5.0" + flutter: ">=2.8.1" diff --git a/pubspec.yaml b/pubspec.yaml index bc82328..3df434f 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,10 +1,11 @@ name: qinglong_app description: A new Flutter project. publish_to: 'none' # Remove this line if you wish to publish to pub.dev -version: 1.0.2+3 +version: 1.0.3+4 environment: sdk: ">=2.15.1 <3.0.0" + flutter: ">=2.8.1" dependencies: From 3b6d0b8f89ee9a635e061e351d768a966f3d5d5d Mon Sep 17 00:00:00 2001 From: jyuesong <425698907@qq.com> Date: Fri, 21 Jan 2022 10:44:45 +0800 Subject: [PATCH 8/9] Update CHANGELOG.md --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 535f28b..db9e73a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## 1.0.3 +* 解决2.10.12及以下版本无法登录的问题 +* 适配最新版qinglong 相关接口字段 +* + + + ## 1.0.2 * 支持修改用户名密码(仅限使用用户名密码登录用户) From cada2debae04fb2377031e84c5f393f42a119078 Mon Sep 17 00:00:00 2001 From: jyuesong <425698907@qq.com> Date: Fri, 21 Jan 2022 10:45:20 +0800 Subject: [PATCH 9/9] Update CHANGELOG.md --- CHANGELOG.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index db9e73a..2e48bee 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,9 +1,7 @@ ## 1.0.3 + * 解决2.10.12及以下版本无法登录的问题 * 适配最新版qinglong 相关接口字段 -* - - ## 1.0.2