diff --git a/.flutter-plugins b/.flutter-plugins
index f3be0a7d55dc28a10f200dffc0dd70a2843687e5..5eadbfecd1d5329ff441f5c442546c5cd6ad2389 100644
--- a/.flutter-plugins
+++ b/.flutter-plugins
@@ -1,4 +1,5 @@
# This is a generated file; do not edit or check into version control.
+android_intent_plus=C:\\Users\\SunShibo\\AppData\\Local\\Pub\\Cache\\hosted\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\android_intent_plus-5.0.2\\
file_picker=C:\\Users\\SunShibo\\AppData\\Local\\Pub\\Cache\\hosted\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\file_picker-8.0.0+1\\
file_preview=C:\\Users\\SunShibo\\AppData\\Local\\Pub\\Cache\\hosted\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\file_preview-1.2.0\\
file_selector_linux=C:\\Users\\SunShibo\\AppData\\Local\\Pub\\Cache\\hosted\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\file_selector_linux-0.9.2+1\\
@@ -21,3 +22,13 @@ shared_preferences_foundation=C:\\Users\\SunShibo\\AppData\\Local\\Pub\\Cache\\h
shared_preferences_linux=C:\\Users\\SunShibo\\AppData\\Local\\Pub\\Cache\\hosted\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\shared_preferences_linux-2.3.2\\
shared_preferences_web=C:\\Users\\SunShibo\\AppData\\Local\\Pub\\Cache\\hosted\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\shared_preferences_web-2.2.2\\
shared_preferences_windows=C:\\Users\\SunShibo\\AppData\\Local\\Pub\\Cache\\hosted\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\shared_preferences_windows-2.3.2\\
+url_launcher=C:\\Users\\SunShibo\\AppData\\Local\\Pub\\Cache\\hosted\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\url_launcher-6.2.6\\
+url_launcher_android=C:\\Users\\SunShibo\\AppData\\Local\\Pub\\Cache\\hosted\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\url_launcher_android-6.3.1\\
+url_launcher_ios=C:\\Users\\SunShibo\\AppData\\Local\\Pub\\Cache\\hosted\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\url_launcher_ios-6.3.0\\
+url_launcher_linux=C:\\Users\\SunShibo\\AppData\\Local\\Pub\\Cache\\hosted\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\url_launcher_linux-3.1.1\\
+url_launcher_macos=C:\\Users\\SunShibo\\AppData\\Local\\Pub\\Cache\\hosted\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\url_launcher_macos-3.2.0\\
+url_launcher_web=C:\\Users\\SunShibo\\AppData\\Local\\Pub\\Cache\\hosted\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\url_launcher_web-2.2.3\\
+url_launcher_windows=C:\\Users\\SunShibo\\AppData\\Local\\Pub\\Cache\\hosted\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\url_launcher_windows-3.1.1\\
+webview_flutter=C:\\Users\\SunShibo\\AppData\\Local\\Pub\\Cache\\hosted\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\webview_flutter-4.7.0\\
+webview_flutter_android=C:\\Users\\SunShibo\\AppData\\Local\\Pub\\Cache\\hosted\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\webview_flutter_android-3.16.1\\
+webview_flutter_wkwebview=C:\\Users\\SunShibo\\AppData\\Local\\Pub\\Cache\\hosted\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\webview_flutter_wkwebview-3.13.0\\
diff --git a/.flutter-plugins-dependencies b/.flutter-plugins-dependencies
index be2bee98c8bb5cd2598f4480010265412460144c..77fe1d22d93f2c816754478dc7b0e74cf3831276 100644
--- a/.flutter-plugins-dependencies
+++ b/.flutter-plugins-dependencies
@@ -1 +1 @@
-{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"file_picker","path":"C:\\\\Users\\\\SunShibo\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\\\file_picker-8.0.0+1\\\\","native_build":true,"dependencies":[]},{"name":"file_preview","path":"C:\\\\Users\\\\SunShibo\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\\\file_preview-1.2.0\\\\","native_build":true,"dependencies":[]},{"name":"image_picker_ios","path":"C:\\\\Users\\\\SunShibo\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\\\image_picker_ios-0.8.9+1\\\\","native_build":true,"dependencies":[]},{"name":"isar_flutter_libs","path":"C:\\\\Users\\\\SunShibo\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\\\isar_flutter_libs-3.1.0+1\\\\","native_build":true,"dependencies":[]},{"name":"shared_preferences_foundation","path":"C:\\\\Users\\\\SunShibo\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\\\shared_preferences_foundation-2.3.5\\\\","shared_darwin_source":true,"native_build":true,"dependencies":[]}],"android":[{"name":"file_picker","path":"C:\\\\Users\\\\SunShibo\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\\\file_picker-8.0.0+1\\\\","native_build":true,"dependencies":["flutter_plugin_android_lifecycle"]},{"name":"file_preview","path":"C:\\\\Users\\\\SunShibo\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\\\file_preview-1.2.0\\\\","native_build":true,"dependencies":[]},{"name":"flutter_plugin_android_lifecycle","path":"C:\\\\Users\\\\SunShibo\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\\\flutter_plugin_android_lifecycle-2.0.19\\\\","native_build":true,"dependencies":[]},{"name":"image_picker_android","path":"C:\\\\Users\\\\SunShibo\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\\\image_picker_android-0.8.9+6\\\\","native_build":true,"dependencies":["flutter_plugin_android_lifecycle"]},{"name":"isar_flutter_libs","path":"C:\\\\Users\\\\SunShibo\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\\\isar_flutter_libs-3.1.0+1\\\\","native_build":true,"dependencies":[]},{"name":"shared_preferences_android","path":"C:\\\\Users\\\\SunShibo\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\\\shared_preferences_android-2.2.2\\\\","native_build":true,"dependencies":[]}],"macos":[{"name":"file_selector_macos","path":"C:\\\\Users\\\\SunShibo\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\\\file_selector_macos-0.9.3+3\\\\","native_build":true,"dependencies":[]},{"name":"image_picker_macos","path":"C:\\\\Users\\\\SunShibo\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\\\image_picker_macos-0.2.1+1\\\\","native_build":false,"dependencies":["file_selector_macos"]},{"name":"isar_flutter_libs","path":"C:\\\\Users\\\\SunShibo\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\\\isar_flutter_libs-3.1.0+1\\\\","native_build":true,"dependencies":[]},{"name":"shared_preferences_foundation","path":"C:\\\\Users\\\\SunShibo\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\\\shared_preferences_foundation-2.3.5\\\\","shared_darwin_source":true,"native_build":true,"dependencies":[]}],"linux":[{"name":"file_selector_linux","path":"C:\\\\Users\\\\SunShibo\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\\\file_selector_linux-0.9.2+1\\\\","native_build":true,"dependencies":[]},{"name":"image_picker_linux","path":"C:\\\\Users\\\\SunShibo\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\\\image_picker_linux-0.2.1+1\\\\","native_build":false,"dependencies":["file_selector_linux"]},{"name":"isar_flutter_libs","path":"C:\\\\Users\\\\SunShibo\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\\\isar_flutter_libs-3.1.0+1\\\\","native_build":true,"dependencies":[]},{"name":"path_provider_linux","path":"C:\\\\Users\\\\SunShibo\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\\\path_provider_linux-2.2.1\\\\","native_build":false,"dependencies":[]},{"name":"shared_preferences_linux","path":"C:\\\\Users\\\\SunShibo\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\\\shared_preferences_linux-2.3.2\\\\","native_build":false,"dependencies":["path_provider_linux"]}],"windows":[{"name":"file_selector_windows","path":"C:\\\\Users\\\\SunShibo\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\\\file_selector_windows-0.9.3+1\\\\","native_build":true,"dependencies":[]},{"name":"image_picker_windows","path":"C:\\\\Users\\\\SunShibo\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\\\image_picker_windows-0.2.1+1\\\\","native_build":false,"dependencies":["file_selector_windows"]},{"name":"isar_flutter_libs","path":"C:\\\\Users\\\\SunShibo\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\\\isar_flutter_libs-3.1.0+1\\\\","native_build":true,"dependencies":[]},{"name":"path_provider_windows","path":"C:\\\\Users\\\\SunShibo\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\\\path_provider_windows-2.2.1\\\\","native_build":false,"dependencies":[]},{"name":"shared_preferences_windows","path":"C:\\\\Users\\\\SunShibo\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\\\shared_preferences_windows-2.3.2\\\\","native_build":false,"dependencies":["path_provider_windows"]}],"web":[{"name":"file_picker","path":"C:\\\\Users\\\\SunShibo\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\\\file_picker-8.0.0+1\\\\","dependencies":[]},{"name":"image_picker_for_web","path":"C:\\\\Users\\\\SunShibo\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\\\image_picker_for_web-3.0.2\\\\","dependencies":[]},{"name":"shared_preferences_web","path":"C:\\\\Users\\\\SunShibo\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\\\shared_preferences_web-2.2.2\\\\","dependencies":[]}]},"dependencyGraph":[{"name":"file_picker","dependencies":["flutter_plugin_android_lifecycle"]},{"name":"file_preview","dependencies":[]},{"name":"file_selector_linux","dependencies":[]},{"name":"file_selector_macos","dependencies":[]},{"name":"file_selector_windows","dependencies":[]},{"name":"flutter_plugin_android_lifecycle","dependencies":[]},{"name":"image_picker","dependencies":["image_picker_android","image_picker_for_web","image_picker_ios","image_picker_linux","image_picker_macos","image_picker_windows"]},{"name":"image_picker_android","dependencies":["flutter_plugin_android_lifecycle"]},{"name":"image_picker_for_web","dependencies":[]},{"name":"image_picker_ios","dependencies":[]},{"name":"image_picker_linux","dependencies":["file_selector_linux"]},{"name":"image_picker_macos","dependencies":["file_selector_macos"]},{"name":"image_picker_windows","dependencies":["file_selector_windows"]},{"name":"isar_flutter_libs","dependencies":[]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_windows","dependencies":[]},{"name":"shared_preferences","dependencies":["shared_preferences_android","shared_preferences_foundation","shared_preferences_linux","shared_preferences_web","shared_preferences_windows"]},{"name":"shared_preferences_android","dependencies":[]},{"name":"shared_preferences_foundation","dependencies":[]},{"name":"shared_preferences_linux","dependencies":["path_provider_linux"]},{"name":"shared_preferences_web","dependencies":[]},{"name":"shared_preferences_windows","dependencies":["path_provider_windows"]}],"date_created":"2024-05-05 16:51:52.821415","version":"3.22.0-14.0.pre.62","swift_package_manager_enabled":false}
\ No newline at end of file
+{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"file_picker","path":"C:\\\\Users\\\\SunShibo\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\\\file_picker-8.0.0+1\\\\","native_build":true,"dependencies":[]},{"name":"file_preview","path":"C:\\\\Users\\\\SunShibo\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\\\file_preview-1.2.0\\\\","native_build":true,"dependencies":[]},{"name":"image_picker_ios","path":"C:\\\\Users\\\\SunShibo\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\\\image_picker_ios-0.8.9+1\\\\","native_build":true,"dependencies":[]},{"name":"isar_flutter_libs","path":"C:\\\\Users\\\\SunShibo\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\\\isar_flutter_libs-3.1.0+1\\\\","native_build":true,"dependencies":[]},{"name":"shared_preferences_foundation","path":"C:\\\\Users\\\\SunShibo\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\\\shared_preferences_foundation-2.3.5\\\\","shared_darwin_source":true,"native_build":true,"dependencies":[]},{"name":"url_launcher_ios","path":"C:\\\\Users\\\\SunShibo\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\\\url_launcher_ios-6.3.0\\\\","native_build":true,"dependencies":[]},{"name":"webview_flutter_wkwebview","path":"C:\\\\Users\\\\SunShibo\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\\\webview_flutter_wkwebview-3.13.0\\\\","native_build":true,"dependencies":[]}],"android":[{"name":"android_intent_plus","path":"C:\\\\Users\\\\SunShibo\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\\\android_intent_plus-5.0.2\\\\","native_build":true,"dependencies":[]},{"name":"file_picker","path":"C:\\\\Users\\\\SunShibo\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\\\file_picker-8.0.0+1\\\\","native_build":true,"dependencies":["flutter_plugin_android_lifecycle"]},{"name":"file_preview","path":"C:\\\\Users\\\\SunShibo\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\\\file_preview-1.2.0\\\\","native_build":true,"dependencies":[]},{"name":"flutter_plugin_android_lifecycle","path":"C:\\\\Users\\\\SunShibo\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\\\flutter_plugin_android_lifecycle-2.0.19\\\\","native_build":true,"dependencies":[]},{"name":"image_picker_android","path":"C:\\\\Users\\\\SunShibo\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\\\image_picker_android-0.8.9+6\\\\","native_build":true,"dependencies":["flutter_plugin_android_lifecycle"]},{"name":"isar_flutter_libs","path":"C:\\\\Users\\\\SunShibo\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\\\isar_flutter_libs-3.1.0+1\\\\","native_build":true,"dependencies":[]},{"name":"shared_preferences_android","path":"C:\\\\Users\\\\SunShibo\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\\\shared_preferences_android-2.2.2\\\\","native_build":true,"dependencies":[]},{"name":"url_launcher_android","path":"C:\\\\Users\\\\SunShibo\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\\\url_launcher_android-6.3.1\\\\","native_build":true,"dependencies":[]},{"name":"webview_flutter_android","path":"C:\\\\Users\\\\SunShibo\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\\\webview_flutter_android-3.16.1\\\\","native_build":true,"dependencies":[]}],"macos":[{"name":"file_selector_macos","path":"C:\\\\Users\\\\SunShibo\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\\\file_selector_macos-0.9.3+3\\\\","native_build":true,"dependencies":[]},{"name":"image_picker_macos","path":"C:\\\\Users\\\\SunShibo\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\\\image_picker_macos-0.2.1+1\\\\","native_build":false,"dependencies":["file_selector_macos"]},{"name":"isar_flutter_libs","path":"C:\\\\Users\\\\SunShibo\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\\\isar_flutter_libs-3.1.0+1\\\\","native_build":true,"dependencies":[]},{"name":"shared_preferences_foundation","path":"C:\\\\Users\\\\SunShibo\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\\\shared_preferences_foundation-2.3.5\\\\","shared_darwin_source":true,"native_build":true,"dependencies":[]},{"name":"url_launcher_macos","path":"C:\\\\Users\\\\SunShibo\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\\\url_launcher_macos-3.2.0\\\\","native_build":true,"dependencies":[]}],"linux":[{"name":"file_selector_linux","path":"C:\\\\Users\\\\SunShibo\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\\\file_selector_linux-0.9.2+1\\\\","native_build":true,"dependencies":[]},{"name":"image_picker_linux","path":"C:\\\\Users\\\\SunShibo\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\\\image_picker_linux-0.2.1+1\\\\","native_build":false,"dependencies":["file_selector_linux"]},{"name":"isar_flutter_libs","path":"C:\\\\Users\\\\SunShibo\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\\\isar_flutter_libs-3.1.0+1\\\\","native_build":true,"dependencies":[]},{"name":"path_provider_linux","path":"C:\\\\Users\\\\SunShibo\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\\\path_provider_linux-2.2.1\\\\","native_build":false,"dependencies":[]},{"name":"shared_preferences_linux","path":"C:\\\\Users\\\\SunShibo\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\\\shared_preferences_linux-2.3.2\\\\","native_build":false,"dependencies":["path_provider_linux"]},{"name":"url_launcher_linux","path":"C:\\\\Users\\\\SunShibo\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\\\url_launcher_linux-3.1.1\\\\","native_build":true,"dependencies":[]}],"windows":[{"name":"file_selector_windows","path":"C:\\\\Users\\\\SunShibo\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\\\file_selector_windows-0.9.3+1\\\\","native_build":true,"dependencies":[]},{"name":"image_picker_windows","path":"C:\\\\Users\\\\SunShibo\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\\\image_picker_windows-0.2.1+1\\\\","native_build":false,"dependencies":["file_selector_windows"]},{"name":"isar_flutter_libs","path":"C:\\\\Users\\\\SunShibo\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\\\isar_flutter_libs-3.1.0+1\\\\","native_build":true,"dependencies":[]},{"name":"path_provider_windows","path":"C:\\\\Users\\\\SunShibo\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\\\path_provider_windows-2.2.1\\\\","native_build":false,"dependencies":[]},{"name":"shared_preferences_windows","path":"C:\\\\Users\\\\SunShibo\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\\\shared_preferences_windows-2.3.2\\\\","native_build":false,"dependencies":["path_provider_windows"]},{"name":"url_launcher_windows","path":"C:\\\\Users\\\\SunShibo\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\\\url_launcher_windows-3.1.1\\\\","native_build":true,"dependencies":[]}],"web":[{"name":"file_picker","path":"C:\\\\Users\\\\SunShibo\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\\\file_picker-8.0.0+1\\\\","dependencies":[]},{"name":"image_picker_for_web","path":"C:\\\\Users\\\\SunShibo\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\\\image_picker_for_web-3.0.2\\\\","dependencies":[]},{"name":"shared_preferences_web","path":"C:\\\\Users\\\\SunShibo\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\\\shared_preferences_web-2.2.2\\\\","dependencies":[]},{"name":"url_launcher_web","path":"C:\\\\Users\\\\SunShibo\\\\AppData\\\\Local\\\\Pub\\\\Cache\\\\hosted\\\\mirrors.tuna.tsinghua.edu.cn%47dart-pub%47\\\\url_launcher_web-2.2.3\\\\","dependencies":[]}]},"dependencyGraph":[{"name":"android_intent_plus","dependencies":[]},{"name":"file_picker","dependencies":["flutter_plugin_android_lifecycle"]},{"name":"file_preview","dependencies":[]},{"name":"file_selector_linux","dependencies":[]},{"name":"file_selector_macos","dependencies":[]},{"name":"file_selector_windows","dependencies":[]},{"name":"flutter_plugin_android_lifecycle","dependencies":[]},{"name":"image_picker","dependencies":["image_picker_android","image_picker_for_web","image_picker_ios","image_picker_linux","image_picker_macos","image_picker_windows"]},{"name":"image_picker_android","dependencies":["flutter_plugin_android_lifecycle"]},{"name":"image_picker_for_web","dependencies":[]},{"name":"image_picker_ios","dependencies":[]},{"name":"image_picker_linux","dependencies":["file_selector_linux"]},{"name":"image_picker_macos","dependencies":["file_selector_macos"]},{"name":"image_picker_windows","dependencies":["file_selector_windows"]},{"name":"isar_flutter_libs","dependencies":[]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_windows","dependencies":[]},{"name":"shared_preferences","dependencies":["shared_preferences_android","shared_preferences_foundation","shared_preferences_linux","shared_preferences_web","shared_preferences_windows"]},{"name":"shared_preferences_android","dependencies":[]},{"name":"shared_preferences_foundation","dependencies":[]},{"name":"shared_preferences_linux","dependencies":["path_provider_linux"]},{"name":"shared_preferences_web","dependencies":[]},{"name":"shared_preferences_windows","dependencies":["path_provider_windows"]},{"name":"url_launcher","dependencies":["url_launcher_android","url_launcher_ios","url_launcher_linux","url_launcher_macos","url_launcher_web","url_launcher_windows"]},{"name":"url_launcher_android","dependencies":[]},{"name":"url_launcher_ios","dependencies":[]},{"name":"url_launcher_linux","dependencies":[]},{"name":"url_launcher_macos","dependencies":[]},{"name":"url_launcher_web","dependencies":[]},{"name":"url_launcher_windows","dependencies":[]},{"name":"webview_flutter","dependencies":["webview_flutter_android","webview_flutter_wkwebview"]},{"name":"webview_flutter_android","dependencies":[]},{"name":"webview_flutter_wkwebview","dependencies":[]}],"date_created":"2024-05-20 10:08:47.927238","version":"3.22.0-14.0.pre.62","swift_package_manager_enabled":false}
\ No newline at end of file
diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index a601094874c46f8f9a18ffdf2ce057266eb41064..81968b017954c0ca0b644eb20e341f8edbc3fb79 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -10,6 +10,8 @@
+
+
_expireTime) {
- String? refreshToken = getSpData(SPFlag.refreshToken);
- MyHttpClient.getRefreshByToken(refreshToken!).then((value) {
- if (value.code == 200) {
- saveSpData(SPFlag.expiresIn, value.data!.expiresIn!);
- saveSpData(SPFlag.accessToken, value.data!.accessToken!);
- return value.data!.accessToken;
- }
- });
+ String? refreshToken = getSpData(SPFlag.refreshToken);
+ MyHttpClient.getRefreshByToken(refreshToken!).then((value) {
+ if (value.code == 200) {
+ saveSpData(SPFlag.expiresIn, value.data!.expiresIn!);
+ saveSpData(SPFlag.accessToken, value.data!.accessToken!);
+ return value.data!.accessToken;
+ }
+ });
// }
return _accessToken;
}
diff --git a/lib/data/network/entity/manage/people/CompanyMemberDetailResponse.dart b/lib/data/network/entity/manage/people/CompanyMemberDetailResponse.dart
index a4df8a452db5470c8a2fcf1716eb1e4d686edd5f..97ba17db3a02a7112c75f650d6e37a44a2e4908f 100644
--- a/lib/data/network/entity/manage/people/CompanyMemberDetailResponse.dart
+++ b/lib/data/network/entity/manage/people/CompanyMemberDetailResponse.dart
@@ -1,17 +1,16 @@
/// code : 200
/// msg : "ok"
-/// data : {"id":1764677020037554177,"jobNumber":null,"userId":1763201736960532482,"createTime":"2024-03-24T18:08:05","roleId":0,"avatar":"https://oss.sshine.ltd/tracking/public/20240407/a988416c0a0042549e61e9e6b2e9620e-scaled_IMG_20240407_113104.jpg","nickName":"rrrr"}
+/// data : {"id":1764677020037554177,"jobNumber":"66","userId":1763201736960532482,"createTime":"2024-03-24T18:08:05","roleId":0,"avatar":"https://oss.sshine.ltd/tracking/public/20240517/e79b3811b8f84e169b121ff03cbc2227-scaled_1000076595.jpg","nickName":"rrrr","attProjectNum":12,"chargeTaskNum":0,"deviceNum":0}
class CompanyMemberDetailResponse {
CompanyMemberDetailResponse({
- num? code,
- String? msg,
- Data? data,
- }) {
+ num? code,
+ String? msg,
+ Data? data,}){
_code = code;
_msg = msg;
_data = data;
- }
+}
CompanyMemberDetailResponse.fromJson(dynamic json) {
_code = json['code'];
@@ -21,16 +20,13 @@ class CompanyMemberDetailResponse {
num? _code;
String? _msg;
Data? _data;
- CompanyMemberDetailResponse copyWith({
- num? code,
- String? msg,
- Data? data,
- }) =>
- CompanyMemberDetailResponse(
- code: code ?? _code,
- msg: msg ?? _msg,
- data: data ?? _data,
- );
+CompanyMemberDetailResponse copyWith({ num? code,
+ String? msg,
+ Data? data,
+}) => CompanyMemberDetailResponse( code: code ?? _code,
+ msg: msg ?? _msg,
+ data: data ?? _data,
+);
num? get code => _code;
String? get msg => _msg;
Data? get data => _data;
@@ -44,26 +40,32 @@ class CompanyMemberDetailResponse {
}
return map;
}
+
}
/// id : 1764677020037554177
-/// jobNumber : null
+/// jobNumber : "66"
/// userId : 1763201736960532482
/// createTime : "2024-03-24T18:08:05"
/// roleId : 0
-/// avatar : "https://oss.sshine.ltd/tracking/public/20240407/a988416c0a0042549e61e9e6b2e9620e-scaled_IMG_20240407_113104.jpg"
+/// avatar : "https://oss.sshine.ltd/tracking/public/20240517/e79b3811b8f84e169b121ff03cbc2227-scaled_1000076595.jpg"
/// nickName : "rrrr"
+/// attProjectNum : 12
+/// chargeTaskNum : 0
+/// deviceNum : 0
class Data {
Data({
- num? id,
- dynamic jobNumber,
- num? userId,
- String? createTime,
- num? roleId,
- String? avatar,
- String? nickName,
- }) {
+ num? id,
+ String? jobNumber,
+ num? userId,
+ String? createTime,
+ num? roleId,
+ String? avatar,
+ String? nickName,
+ num? attProjectNum,
+ num? chargeTaskNum,
+ num? deviceNum,}){
_id = id;
_jobNumber = jobNumber;
_userId = userId;
@@ -71,7 +73,10 @@ class Data {
_roleId = roleId;
_avatar = avatar;
_nickName = nickName;
- }
+ _attProjectNum = attProjectNum;
+ _chargeTaskNum = chargeTaskNum;
+ _deviceNum = deviceNum;
+}
Data.fromJson(dynamic json) {
_id = json['id'];
@@ -81,39 +86,51 @@ class Data {
_roleId = json['roleId'];
_avatar = json['avatar'];
_nickName = json['nickName'];
+ _attProjectNum = json['attProjectNum'];
+ _chargeTaskNum = json['chargeTaskNum'];
+ _deviceNum = json['deviceNum'];
}
num? _id;
- dynamic _jobNumber;
+ String? _jobNumber;
num? _userId;
String? _createTime;
num? _roleId;
String? _avatar;
String? _nickName;
- Data copyWith({
- num? id,
- dynamic jobNumber,
- num? userId,
- String? createTime,
- num? roleId,
- String? avatar,
- String? nickName,
- }) =>
- Data(
- id: id ?? _id,
- jobNumber: jobNumber ?? _jobNumber,
- userId: userId ?? _userId,
- createTime: createTime ?? _createTime,
- roleId: roleId ?? _roleId,
- avatar: avatar ?? _avatar,
- nickName: nickName ?? _nickName,
- );
+ num? _attProjectNum;
+ num? _chargeTaskNum;
+ num? _deviceNum;
+Data copyWith({ num? id,
+ String? jobNumber,
+ num? userId,
+ String? createTime,
+ num? roleId,
+ String? avatar,
+ String? nickName,
+ num? attProjectNum,
+ num? chargeTaskNum,
+ num? deviceNum,
+}) => Data( id: id ?? _id,
+ jobNumber: jobNumber ?? _jobNumber,
+ userId: userId ?? _userId,
+ createTime: createTime ?? _createTime,
+ roleId: roleId ?? _roleId,
+ avatar: avatar ?? _avatar,
+ nickName: nickName ?? _nickName,
+ attProjectNum: attProjectNum ?? _attProjectNum,
+ chargeTaskNum: chargeTaskNum ?? _chargeTaskNum,
+ deviceNum: deviceNum ?? _deviceNum,
+);
num? get id => _id;
- dynamic get jobNumber => _jobNumber;
+ String? get jobNumber => _jobNumber;
num? get userId => _userId;
String? get createTime => _createTime;
num? get roleId => _roleId;
String? get avatar => _avatar;
String? get nickName => _nickName;
+ num? get attProjectNum => _attProjectNum;
+ num? get chargeTaskNum => _chargeTaskNum;
+ num? get deviceNum => _deviceNum;
Map toJson() {
final map = {};
@@ -124,6 +141,10 @@ class Data {
map['roleId'] = _roleId;
map['avatar'] = _avatar;
map['nickName'] = _nickName;
+ map['attProjectNum'] = _attProjectNum;
+ map['chargeTaskNum'] = _chargeTaskNum;
+ map['deviceNum'] = _deviceNum;
return map;
}
-}
+
+}
\ No newline at end of file
diff --git a/lib/main.dart b/lib/main.dart
index 5bc3b4ae571dc6a6e581af07013264fadf5d65dd..9489c7cfbd60016da76b519b046468f77ba405df 100644
--- a/lib/main.dart
+++ b/lib/main.dart
@@ -27,6 +27,8 @@ import 'package:management/page/ModuleProject/create_demand_screen/view.dart';
import 'package:management/page/ModuleProject/create_project_scree/view.dart';
import 'package:management/page/ModuleProject/demand_or_task_detail_screen/logic.dart';
import 'package:management/page/ModuleProject/demand_or_task_detail_screen/view.dart';
+import 'package:management/page/ModuleProject/file_preview_screen/view.dart';
+import 'package:management/page/ModuleProject/manage_for_money_screen/view.dart';
import 'package:management/page/ModuleProject/project_conclusion_screen/view.dart';
import 'package:management/page/ModuleProject/project_detail_screen/view.dart';
import 'package:management/page/ModuleProject/project_screen/view.dart';
@@ -129,6 +131,8 @@ class RouteConfig {
static const String demandOrTaskScreen = '/demandOrTaskScreen';
static const String showMoreDemandScreen = '/showMoreDemandScreen';
static const String showMoreLogScreen = '/showMoreLogScreen';
+ static const String manageForMoney = '/manageForMoneyScreen';
+ static const String filePreviewScreen = '/filePreviewScreen';
///ModuleMain
static const String mainScreen = '/mainScreen';
@@ -223,6 +227,12 @@ class RouteConfig {
name: showMoreDemandScreen,
page: () => const ShowMoreDemandScreenPage()),
GetPage(name: showMoreLogScreen, page: () => const ShowMoreLogScreenPage()),
+ GetPage(name: manageForMoney, page: () => const ManageForMoneyScreenPage()),
+ GetPage(
+ name: filePreviewScreen,
+ page: () => const FilePreviewScreenPage(),
+ transition: Transition.downToUp,
+ ),
///ModuleMain
GetPage(name: mainScreen, page: () => const MainScreenPage()),
diff --git a/lib/page/ModuleMain/main_screen/logic.dart b/lib/page/ModuleMain/main_screen/logic.dart
index c5c172332394e6b819a2233785c7f1c9254f9b67..35f94fba1d7278994d1b8b9df6d22d63f3e29403 100644
--- a/lib/page/ModuleMain/main_screen/logic.dart
+++ b/lib/page/ModuleMain/main_screen/logic.dart
@@ -1,9 +1,12 @@
import 'dart:math';
+import 'package:android_intent_plus/android_intent.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:management/const/consts.dart';
import 'package:management/data/network/api/api.dart';
+import 'package:management/data/network/entity/demand/response/ListDemandOrTaskForMain.dart'
+ as demand;
import 'package:management/data/network/entity/project/response/ListProjectResponse.dart';
import 'package:management/element/loading.dart';
import 'package:management/element/showLogSheet.dart';
@@ -195,4 +198,30 @@ class MainScreenLogic extends GetxController {
return;
});
}
+
+ setAlarm(demand.Records listChildDemand) {
+ final intent = AndroidIntent(
+ action: 'android.intent.action.INSERT', // Important
+ data: 'content://com.android.calendar/event', // Important
+ type: "vnd.android.cursor.dir/event", // Important
+ arguments: {
+ 'title': listChildDemand.name,
+ 'allDay': true,
+ 'beginTime': DateTime.parse(
+ listChildDemand.startTime ?? DateTime.now().toIso8601String())
+ .microsecondsSinceEpoch,
+ 'endTime': DateTime.parse(
+ listChildDemand.endTime ?? DateTime.now().toIso8601String())
+ .microsecondsSinceEpoch,
+ 'description':
+ '${listChildDemand.projectName} + ${listChildDemand.creator?.nickName}',
+ 'eventLocation': 'unknown',
+ 'hasAlarm': 1,
+ 'calendar_id': 1,
+ 'eventTimezone': DateTime.now().timeZoneName
+ },
+ );
+
+ intent.launchChooser(MyText.caatsd.tr);
+ }
}
diff --git a/lib/page/ModuleMain/main_screen/view.dart b/lib/page/ModuleMain/main_screen/view.dart
index 20154fe73ee5a0d640bbef6d73fa1d37f2a2e2c1..c58b3970cc67cd233a532c1103218240e58b01ab 100644
--- a/lib/page/ModuleMain/main_screen/view.dart
+++ b/lib/page/ModuleMain/main_screen/view.dart
@@ -475,19 +475,39 @@ class MainScreenPage extends StatelessWidget {
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
- Text(
- state.listChildDemand[index].name ??
- MyText.loading.tr,
- style: Theme.of(context).textTheme.titleMedium),
- const SizedBox(
- height: 2,
- ),
- Text(
- '${MyText.dueDate.tr} : ${state.listChildDemand[index].endTime ?? ' '}',
- style: Theme.of(context)
- .textTheme
- .bodyMedium
- ?.copyWith(fontWeight: FontWeight.w400),
+ Row(
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ children: [
+ Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Text(
+ state.listChildDemand[index].name ??
+ MyText.loading.tr,
+ style: Theme.of(context)
+ .textTheme
+ .titleMedium),
+ const SizedBox(
+ height: 2,
+ ),
+ Text(
+ '${MyText.dueDate.tr} : ${state.listChildDemand[index].endTime ?? ' '}',
+ style: Theme.of(context)
+ .textTheme
+ .bodyMedium
+ ?.copyWith(
+ fontWeight: FontWeight.w400),
+ ),
+ ],
+ ),
+ IconButton(
+ onPressed: () => logic
+ .setAlarm(state.listChildDemand[index]),
+ icon: const Icon(
+ Icons.alarm_add_outlined,
+ color: MyColor.gradientYellow,
+ ))
+ ],
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
diff --git a/lib/page/ModuleManage/employee_detail_screen/view.dart b/lib/page/ModuleManage/employee_detail_screen/view.dart
index a5065d69f6352f00088235ec240c1fd078c8cce4..a0c901e706e8d8df23f16ddfb0b04c4acd18354c 100644
--- a/lib/page/ModuleManage/employee_detail_screen/view.dart
+++ b/lib/page/ModuleManage/employee_detail_screen/view.dart
@@ -12,9 +12,7 @@ class EmployeeDetailScreenPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
final logic = Get.put(EmployeeDetailScreenLogic());
- final state = Get
- .find()
- .state;
+ final state = Get.find().state;
return Scaffold(
appBar: AppBar(),
@@ -30,8 +28,8 @@ class EmployeeDetailScreenPage extends StatelessWidget {
),
ClipOval(
child: FadeInImage(
- image: NetworkImage(state.data.value.avatar ??
- GlobalInit.headImage),
+ image: NetworkImage(
+ state.data.value.avatar ?? GlobalInit.headImage),
height: 120,
width: 120,
fit: BoxFit.fill,
@@ -44,20 +42,14 @@ class EmployeeDetailScreenPage extends StatelessWidget {
),
Text(
state.data.value.nickName ?? MyText.defaultName,
- style: Theme
- .of(context)
- .textTheme
- .titleLarge,
+ style: Theme.of(context).textTheme.titleLarge,
),
const SizedBox(
height: 6,
),
Text(
state.data.value.jobNumber.toString(),
- style: Theme
- .of(context)
- .textTheme
- .bodyMedium,
+ style: Theme.of(context).textTheme.bodyMedium,
),
const SizedBox(
height: 30,
@@ -71,23 +63,19 @@ class EmployeeDetailScreenPage extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Text(
- state.projectNum.value.toString(),
- style: Theme
- .of(context)
- .textTheme
- .titleLarge,
+ state.data.value.attProjectNum.toString(),
+ style: Theme.of(context).textTheme.titleLarge,
),
Text(
MyText.projects.tr,
- style: Theme
- .of(context)
+ style: Theme.of(context)
.textTheme
.bodyMedium
?.copyWith(
- fontWeight: FontWeight.w400,
- color: Get.isDarkMode
- ? MyColor.white
- : MyColor.grayScale[800]),
+ fontWeight: FontWeight.w400,
+ color: Get.isDarkMode
+ ? MyColor.white
+ : MyColor.grayScale[800]),
),
],
),
@@ -102,23 +90,19 @@ class EmployeeDetailScreenPage extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Text(
- state.taskNum.value.toString(),
- style: Theme
- .of(context)
- .textTheme
- .titleLarge,
+ state.data.value.chargeTaskNum.toString(),
+ style: Theme.of(context).textTheme.titleLarge,
),
Text(
MyText.tasks.tr,
- style: Theme
- .of(context)
+ style: Theme.of(context)
.textTheme
.bodyMedium
?.copyWith(
- fontWeight: FontWeight.w400,
- color: Get.isDarkMode
- ? MyColor.white
- : MyColor.grayScale[800]),
+ fontWeight: FontWeight.w400,
+ color: Get.isDarkMode
+ ? MyColor.white
+ : MyColor.grayScale[800]),
),
],
),
@@ -132,23 +116,19 @@ class EmployeeDetailScreenPage extends StatelessWidget {
Column(
children: [
Text(
- state.deviceNum.value.toString(),
- style: Theme
- .of(context)
- .textTheme
- .titleLarge,
+ state.data.value.deviceNum.toString(),
+ style: Theme.of(context).textTheme.titleLarge,
),
Text(
MyText.devices.tr,
- style: Theme
- .of(context)
+ style: Theme.of(context)
.textTheme
.bodyMedium
?.copyWith(
- fontWeight: FontWeight.w400,
- color: Get.isDarkMode
- ? MyColor.white
- : MyColor.grayScale[800]),
+ fontWeight: FontWeight.w400,
+ color: Get.isDarkMode
+ ? MyColor.white
+ : MyColor.grayScale[800]),
),
],
)
diff --git a/lib/page/ModuleProject/demand_or_task_detail_screen/logic.dart b/lib/page/ModuleProject/demand_or_task_detail_screen/logic.dart
index 9119f4d26ef70aaaf5fa3fc01c923688b8b1c14d..9b9fc0552e92e5fb44383c4ea0467407c7d74e99 100644
--- a/lib/page/ModuleProject/demand_or_task_detail_screen/logic.dart
+++ b/lib/page/ModuleProject/demand_or_task_detail_screen/logic.dart
@@ -1,5 +1,6 @@
import 'package:dio/dio.dart' as dio;
import 'package:file_picker/file_picker.dart';
+import 'package:file_preview/file_preview.dart';
import 'package:flutter/material.dart';
import 'package:flutter_datetime_picker_plus/flutter_datetime_picker_plus.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
@@ -8,6 +9,8 @@ import 'package:management/const/consts.dart';
import 'package:management/const/init.dart';
import 'package:management/data/network/api/api.dart';
import 'package:management/data/network/entity/demand/request/ChangeDemandOrTaskRequestParams.dart';
+import 'package:management/data/network/entity/demand/response/DemandOrTaskDetailResponse.dart'
+ as demand_detail;
import 'package:management/data/network/entity/demand/response/ListChildDemandOrTaskResponse.dart';
import 'package:management/data/network/entity/demand/response/ListLogDemandOrTaskResponse.dart'
as log;
@@ -285,7 +288,8 @@ class DemandOrTaskDetailScreenLogic extends GetxController {
if (value.code == 200) {
refreshDemandOrTaskDetailPage();
Get.find().getListByStatus();
- Get.find().refreshProjectDetailPage();
+ // error
+ // Get.find()?.refreshProjectDetailPage();
} else {
Utils.toastError(value.msg);
}
@@ -537,4 +541,18 @@ class DemandOrTaskDetailScreenLogic extends GetxController {
id: state.demandId, description: newDescription);
_realChangeDemand(params);
}
+
+ previewFile(demand_detail.Attachments listAttachment) async {
+ if (listAttachment.url == null) return;
+ // Utils.toastWarning(url);
+ //使用前进行判断是否已经初始化
+ // var isInit = await FilePreview.tbsHasInit();
+ // if (!isInit) {
+ // await FilePreview.initTBS(license: "initTbs");
+ // return;
+ // }
+
+ Get.toNamed(RouteConfig.filePreviewScreen,
+ arguments: {'url': listAttachment.url, 'name': listAttachment.name});
+ }
}
diff --git a/lib/page/ModuleProject/demand_or_task_detail_screen/view.dart b/lib/page/ModuleProject/demand_or_task_detail_screen/view.dart
index 02998ced2c7e77394dadb1d4feb8e28ff8a253f3..1c6c3efb75b2cbcb2c97c072d8ee15021dcf2cd5 100644
--- a/lib/page/ModuleProject/demand_or_task_detail_screen/view.dart
+++ b/lib/page/ModuleProject/demand_or_task_detail_screen/view.dart
@@ -348,6 +348,7 @@ class DemandOrTaskDetailScreenPage extends StatelessWidget {
size: 18,
color: MyColor.primary,
),
+ onPressed: () => logic.previewFile(state.listAttachment[index]),
deleteIcon: const Icon(
IconLight.Iconly_Light_Outline_Close_Square,
size: 18,
diff --git a/lib/page/ModuleProject/file_preview_screen/logic.dart b/lib/page/ModuleProject/file_preview_screen/logic.dart
new file mode 100644
index 0000000000000000000000000000000000000000..0deaffe792c9d6d782f6bb0274a3d083d8efa2d9
--- /dev/null
+++ b/lib/page/ModuleProject/file_preview_screen/logic.dart
@@ -0,0 +1,14 @@
+import 'package:get/get.dart';
+import 'package:url_launcher/url_launcher.dart';
+
+import 'state.dart';
+
+class FilePreviewScreenLogic extends GetxController {
+ final FilePreviewScreenState state = FilePreviewScreenState();
+
+ download() async {
+ if (!await launchUrl(Uri.parse(state.url))) {
+ throw Exception('Could not launch ${state.url}');
+ }
+ }
+}
diff --git a/lib/page/ModuleProject/file_preview_screen/state.dart b/lib/page/ModuleProject/file_preview_screen/state.dart
new file mode 100644
index 0000000000000000000000000000000000000000..dbb43adeb3146a39b0d52f668bfd0f10501af66d
--- /dev/null
+++ b/lib/page/ModuleProject/file_preview_screen/state.dart
@@ -0,0 +1,11 @@
+import 'package:get/get.dart';
+
+class FilePreviewScreenState {
+ var url = '';
+ var name = '';
+ FilePreviewScreenState() {
+ ///Initialize variables
+ url = Get.arguments['url'];
+ name = Get.arguments['name'];
+ }
+}
diff --git a/lib/page/ModuleProject/file_preview_screen/view.dart b/lib/page/ModuleProject/file_preview_screen/view.dart
new file mode 100644
index 0000000000000000000000000000000000000000..061860634481745a5141d292943a00b3a25d61cb
--- /dev/null
+++ b/lib/page/ModuleProject/file_preview_screen/view.dart
@@ -0,0 +1,40 @@
+import 'package:file_preview/file_preview.dart';
+import 'package:flutter/material.dart';
+import 'package:get/get.dart';
+import 'package:management/const/consts.dart';
+import 'package:management/element/toast.dart';
+
+import 'logic.dart';
+
+class FilePreviewScreenPage extends StatelessWidget {
+ const FilePreviewScreenPage({Key? key}) : super(key: key);
+
+ @override
+ Widget build(BuildContext context) {
+ final logic = Get.put(FilePreviewScreenLogic());
+ final state = Get.find().state;
+
+ return Scaffold(
+ appBar: AppBar(
+ title: Text(state.name),
+ actions: [
+ IconButton(onPressed:() => logic.download(), icon: const Icon(Icons.download),)
+ ],
+ ),
+ body: Expanded(
+ child: FilePreviewWidget(
+ width: 400,
+ height: 700,
+ path: state.url,
+ callBack: FilePreviewCallBack(onShow: () {
+ Utils.toastNotification(MyText.fileOpenSuccess.tr);
+ }, onDownload: (progress) {
+ Utils.toast(MyText.fileOpenProgress.tr, "$progress %");
+ }, onFail: (code, msg) {
+ Utils.toastError("${MyText.fileOpenFail.tr} $code $msg");
+ }),
+ ),
+ ),
+ );
+ }
+}
diff --git a/lib/page/ModuleProject/manage_for_money_screen/logic.dart b/lib/page/ModuleProject/manage_for_money_screen/logic.dart
new file mode 100644
index 0000000000000000000000000000000000000000..b64e2cdbc8fdb6fa78198581d086b0fd63959e78
--- /dev/null
+++ b/lib/page/ModuleProject/manage_for_money_screen/logic.dart
@@ -0,0 +1,14 @@
+import 'package:get/get.dart';
+import 'package:url_launcher/url_launcher.dart';
+
+import 'state.dart';
+
+class ManageForMoneyScreenLogic extends GetxController {
+ final ManageForMoneyScreenState state = ManageForMoneyScreenState();
+
+ openBrowser() async {
+ if (!await launchUrl(state.url)) {
+ throw Exception('Could not launch ${state.url}');
+ }
+ }
+}
diff --git a/lib/page/ModuleProject/manage_for_money_screen/state.dart b/lib/page/ModuleProject/manage_for_money_screen/state.dart
new file mode 100644
index 0000000000000000000000000000000000000000..93c0266c3f54e1cad89f510699493aab606457f6
--- /dev/null
+++ b/lib/page/ModuleProject/manage_for_money_screen/state.dart
@@ -0,0 +1,27 @@
+import 'package:get/get.dart';
+import 'package:management/const/consts.dart';
+import 'package:webview_flutter/webview_flutter.dart';
+
+class ManageForMoneyScreenState {
+ var controller = WebViewController()
+ ..setJavaScriptMode(JavaScriptMode.unrestricted)
+ ..setBackgroundColor(MyColor.white)
+ ..setNavigationDelegate((NavigationDelegate(
+ onProgress: (int p) {},
+ onPageStarted: (String url) {},
+ onPageFinished: (String url) {},
+ onWebResourceError: (WebResourceError error) {},
+ onNavigationRequest: (NavigationRequest request) {
+ // if (request.url.startsWith('https://www.youtube.com/')) {
+ // return NavigationDecision.prevent;
+ // }
+ return NavigationDecision.navigate;
+ },
+ )));
+ late Uri url;
+ ManageForMoneyScreenState() {
+ ///Initialize variables
+ url = Uri.parse(Get.arguments['url']);
+ controller.loadRequest(url);
+ }
+}
diff --git a/lib/page/ModuleProject/manage_for_money_screen/view.dart b/lib/page/ModuleProject/manage_for_money_screen/view.dart
new file mode 100644
index 0000000000000000000000000000000000000000..22dd089de64a16c13ae2211af12b8b44baa2ab37
--- /dev/null
+++ b/lib/page/ModuleProject/manage_for_money_screen/view.dart
@@ -0,0 +1,28 @@
+import 'package:flutter/material.dart';
+import 'package:get/get.dart';
+import 'package:management/const/consts.dart';
+import 'package:webview_flutter/webview_flutter.dart';
+
+import 'logic.dart';
+
+class ManageForMoneyScreenPage extends StatelessWidget {
+ const ManageForMoneyScreenPage({Key? key}) : super(key: key);
+
+ @override
+ Widget build(BuildContext context) {
+ final logic = Get.put(ManageForMoneyScreenLogic());
+ final state = Get.find().state;
+
+ return Scaffold(
+ appBar: AppBar(
+ title: Text(MyText.RDExpenseManagement.tr,style: Theme.of(context).textTheme.bodyLarge,),
+ actions: [
+ IconButton(
+ onPressed: () => logic.openBrowser(),
+ icon: const Icon(Icons.open_in_browser_outlined)),
+ ],
+ ),
+ body: WebViewWidget(controller: state.controller),
+ );
+ }
+}
diff --git a/lib/page/ModuleProject/project_detail_screen/logic.dart b/lib/page/ModuleProject/project_detail_screen/logic.dart
index 2c1e0483f832681e9513d484bf781827f91c090a..ddcafe3121e3daf179555606c7edd87be87f896f 100644
--- a/lib/page/ModuleProject/project_detail_screen/logic.dart
+++ b/lib/page/ModuleProject/project_detail_screen/logic.dart
@@ -8,6 +8,7 @@ import 'package:management/element/showLogSheet.dart';
import 'package:management/element/toast.dart';
import 'package:management/main.dart';
import 'package:management/page/ModuleProject/project_screen/logic.dart';
+import 'package:webview_flutter/webview_flutter.dart';
import 'state.dart';
@@ -133,6 +134,24 @@ class ProjectDetailScreenLogic extends GetxController {
),
),
),
+ Container(
+ padding: const EdgeInsets.symmetric(vertical: 2),
+ width: double.infinity,
+ height: 60,
+ child: TextButton(
+ onPressed: () => _manageForMoney(),
+ style: Theme.of(Get.context!).textButtonTheme.style,
+ child: Row(
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ Text(
+ MyText.RDExpenseManagement.tr,
+ style: Theme.of(Get.context!).textTheme.bodyLarge,
+ ),
+ ],
+ ),
+ ),
+ ),
Container(
padding: const EdgeInsets.symmetric(vertical: 2),
width: double.infinity,
@@ -337,4 +356,10 @@ class ProjectDetailScreenLogic extends GetxController {
}
return Colors.transparent;
}
+
+ _manageForMoney() {
+ Get.toNamed(RouteConfig.manageForMoney, arguments: {
+ 'url': 'https://tracking.sshine.ltd/#/devExpenses/importAuxiliaryLedger'
+ });
+ }
}
diff --git a/pubspec.lock b/pubspec.lock
index d32018eb67266dc7913f46722084288caebca293..75c46c78d585dc712e47b0afba3b344beaca0548 100644
--- a/pubspec.lock
+++ b/pubspec.lock
@@ -17,6 +17,14 @@ packages:
url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/"
source: hosted
version: "5.13.0"
+ android_intent_plus:
+ dependency: "direct main"
+ description:
+ name: android_intent_plus
+ sha256: "2bfdbee8d65e7c26f88b66f0a91f2863da4d3596d8a658b4162c8de5cf04b074"
+ url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/"
+ source: hosted
+ version: "5.0.2"
archive:
dependency: transitive
description:
@@ -922,6 +930,70 @@ packages:
url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/"
source: hosted
version: "1.3.2"
+ url_launcher:
+ dependency: "direct main"
+ description:
+ name: url_launcher
+ sha256: "6ce1e04375be4eed30548f10a315826fd933c1e493206eab82eed01f438c8d2e"
+ url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/"
+ source: hosted
+ version: "6.2.6"
+ url_launcher_android:
+ dependency: transitive
+ description:
+ name: url_launcher_android
+ sha256: "360a6ed2027f18b73c8d98e159dda67a61b7f2e0f6ec26e86c3ada33b0621775"
+ url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/"
+ source: hosted
+ version: "6.3.1"
+ url_launcher_ios:
+ dependency: transitive
+ description:
+ name: url_launcher_ios
+ sha256: "7068716403343f6ba4969b4173cbf3b84fc768042124bc2c011e5d782b24fe89"
+ url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/"
+ source: hosted
+ version: "6.3.0"
+ url_launcher_linux:
+ dependency: transitive
+ description:
+ name: url_launcher_linux
+ sha256: ab360eb661f8879369acac07b6bb3ff09d9471155357da8443fd5d3cf7363811
+ url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/"
+ source: hosted
+ version: "3.1.1"
+ url_launcher_macos:
+ dependency: transitive
+ description:
+ name: url_launcher_macos
+ sha256: "9a1a42d5d2d95400c795b2914c36fdcb525870c752569438e4ebb09a2b5d90de"
+ url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/"
+ source: hosted
+ version: "3.2.0"
+ url_launcher_platform_interface:
+ dependency: transitive
+ description:
+ name: url_launcher_platform_interface
+ sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029"
+ url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/"
+ source: hosted
+ version: "2.3.2"
+ url_launcher_web:
+ dependency: transitive
+ description:
+ name: url_launcher_web
+ sha256: fff0932192afeedf63cdd50ecbb1bc825d31aed259f02bb8dba0f3b729a5e88b
+ url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/"
+ source: hosted
+ version: "2.2.3"
+ url_launcher_windows:
+ dependency: transitive
+ description:
+ name: url_launcher_windows
+ sha256: ecf9725510600aa2bb6d7ddabe16357691b6d2805f66216a97d1b881e21beff7
+ url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/"
+ source: hosted
+ version: "3.1.1"
vector_graphics:
dependency: transitive
description:
@@ -986,6 +1058,38 @@ packages:
url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/"
source: hosted
version: "2.4.2"
+ webview_flutter:
+ dependency: "direct main"
+ description:
+ name: webview_flutter
+ sha256: "25e1b6e839e8cbfbd708abc6f85ed09d1727e24e08e08c6b8590d7c65c9a8932"
+ url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/"
+ source: hosted
+ version: "4.7.0"
+ webview_flutter_android:
+ dependency: transitive
+ description:
+ name: webview_flutter_android
+ sha256: dad3313c9ead95517bb1cae5e1c9d20ba83729d5a59e5e83c0a2d66203f27f91
+ url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/"
+ source: hosted
+ version: "3.16.1"
+ webview_flutter_platform_interface:
+ dependency: transitive
+ description:
+ name: webview_flutter_platform_interface
+ sha256: d937581d6e558908d7ae3dc1989c4f87b786891ab47bb9df7de548a151779d8d
+ url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/"
+ source: hosted
+ version: "2.10.0"
+ webview_flutter_wkwebview:
+ dependency: transitive
+ description:
+ name: webview_flutter_wkwebview
+ sha256: f12f8d8a99784b863e8b85e4a9a5e3cf1839d6803d2c0c3e0533a8f3c5a992a7
+ url: "https://mirrors.tuna.tsinghua.edu.cn/dart-pub/"
+ source: hosted
+ version: "3.13.0"
win32:
dependency: transitive
description:
diff --git a/pubspec.yaml b/pubspec.yaml
index 026c1144ea63fc6d250527e905c51c8a62e4c3da..329988e11065ec3daa4476f06d53998963ea097b 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -49,12 +49,16 @@ dependencies:
flutter_easyloading: ^3.0.5
image_picker: ^1.0.7
file_picker: ^8.0.0+1
- file_preview: ^1.2.0
+
flutter_localizations:
sdk: flutter
intl: any
flutter_datetime_picker_plus: ^2.1.0
timelines: ^0.1.0
+ webview_flutter: ^4.7.0
+ url_launcher: ^6.2.6
+ android_intent_plus: ^5.0.2
+ file_preview: ^1.2.0
# quill_html_editor: ^2.2.8