Compare commits

...

10 Commits

Author SHA1 Message Date
1147192855@qq.com 068cbbe550 no message 2024-06-27 11:06:48 +08:00
1147192855@qq.com 41bfa32ad6 no message 2024-06-25 09:55:00 +08:00
1147192855@qq.com 4eb28224d3 no message 2024-06-21 10:03:30 +08:00
豌杂 fc3f656c66 提交1888账号登陆 2024-06-18 11:48:51 +08:00
豌杂 c9edeb662f IOS 版本号提交 2024-06-17 10:48:14 +08:00
1147192855@qq.com e05d7c4395 no message 2024-06-13 17:23:07 +08:00
1147192855@qq.com c75f0f191c no message 2024-06-13 17:08:14 +08:00
1147192855@qq.com 28a03f1cde 更新登录choice学校功能 2024-06-13 17:01:15 +08:00
1147192855@qq.com b3b58fb55f no message 2024-06-13 14:38:43 +08:00
1147192855@qq.com 8ed3b85b92 处理登录添加所在学校下拉框 2024-06-13 14:35:12 +08:00
9 changed files with 578 additions and 89 deletions

1
.gitignore vendored
View File

@ -230,3 +230,4 @@ marking_app/lib/pages/homework_correction/widget/answer_handwriting.g.dart
marking_app/lib/pages/report_detail/report_history.g.dart
marking_app/lib/common/model/report/report_student_history_record.g.dart
marking_app/lib/common/model/report/report_student_info.g.dart
marking_app/lib/pages/login/index.g.dart

View File

@ -117,4 +117,4 @@ SPEC CHECKSUMS:
PODFILE CHECKSUM: 64629b724b9886c2d78e6972ff5ef90e370df047
COCOAPODS: 1.11.3
COCOAPODS: 1.12.1

View File

@ -16,6 +16,177 @@
EE3BAAE20F3BEC99D310EC6B /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9AE64B664D96A59005B338D3 /* Pods_Runner.framework */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
0B2156402C0D8FFF00D5A718 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 0B2156242C0D8FFF00D5A718 /* Pods.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 3E842772C2699BC8F65359A06505C5A5;
remoteInfo = app_installer;
};
0B2156422C0D8FFF00D5A718 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 0B2156242C0D8FFF00D5A718 /* Pods.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 6D3FD4746C5C4B5292B7C4C862F01EF9;
remoteInfo = connectivity_plus;
};
0B2156442C0D8FFF00D5A718 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 0B2156242C0D8FFF00D5A718 /* Pods.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 95AEC45023DC633BFEBFE200DD4C81FC;
remoteInfo = flutter_keyboard_visibility;
};
0B2156462C0D8FFF00D5A718 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 0B2156242C0D8FFF00D5A718 /* Pods.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = D0C5A85ABEF5ED03A54A449B87B69225;
remoteInfo = fluttertoast;
};
0B2156482C0D8FFF00D5A718 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 0B2156242C0D8FFF00D5A718 /* Pods.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 768975E636D1D2FB85622FB67DB04E5A;
remoteInfo = image_picker_ios;
};
0B21564A2C0D8FFF00D5A718 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 0B2156242C0D8FFF00D5A718 /* Pods.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = F0C7EFBFF01CFAAB52BA74E6CB40CE2C;
remoteInfo = "image_picker_ios-image_picker_ios_privacy";
};
0B21564C2C0D8FFF00D5A718 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 0B2156242C0D8FFF00D5A718 /* Pods.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 723F1D07DBDF0EC2E0D163A4996FEE3D;
remoteInfo = install_plugin;
};
0B21564E2C0D8FFF00D5A718 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 0B2156242C0D8FFF00D5A718 /* Pods.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 6E45859F778E298A6DDE318300ACC4C5;
remoteInfo = package_info;
};
0B2156502C0D8FFF00D5A718 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 0B2156242C0D8FFF00D5A718 /* Pods.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = AE157A33FEF959A214796BFF348717F6;
remoteInfo = path_provider_foundation;
};
0B2156522C0D8FFF00D5A718 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 0B2156242C0D8FFF00D5A718 /* Pods.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 3DBD4BADE27F8B91024E4B4B4DD75DB5;
remoteInfo = "path_provider_foundation-path_provider_foundation_privacy";
};
0B2156542C0D8FFF00D5A718 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 0B2156242C0D8FFF00D5A718 /* Pods.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = C7AD28D5FB25A8DEDF61F78996932FA6;
remoteInfo = permission_handler_apple;
};
0B2156562C0D8FFF00D5A718 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 0B2156242C0D8FFF00D5A718 /* Pods.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 669E8F25E1897672BDB80B7EB784DA24;
remoteInfo = "Pods-Runner";
};
0B2156582C0D8FFF00D5A718 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 0B2156242C0D8FFF00D5A718 /* Pods.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 21B03CA622E690725A6626C088E1D09F;
remoteInfo = ReachabilitySwift;
};
0B21565A2C0D8FFF00D5A718 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 0B2156242C0D8FFF00D5A718 /* Pods.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = DE8135CAE607F7824D08D08BDA5968B9;
remoteInfo = rive_common;
};
0B21565C2C0D8FFF00D5A718 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 0B2156242C0D8FFF00D5A718 /* Pods.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 93C6A45C6E4792269BE9BE0073839BF0;
remoteInfo = shared_preferences_foundation;
};
0B21565E2C0D8FFF00D5A718 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 0B2156242C0D8FFF00D5A718 /* Pods.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 0652FCE3FC19056983AABE058B3CC45B;
remoteInfo = "shared_preferences_foundation-shared_preferences_foundation_privacy";
};
0B2156602C0D8FFF00D5A718 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 0B2156242C0D8FFF00D5A718 /* Pods.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = B799BFFEC5B11F90F501202080A57F37;
remoteInfo = sqflite;
};
0B2156622C0D8FFF00D5A718 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 0B2156242C0D8FFF00D5A718 /* Pods.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 58497E6EB70BA49D9A885C22D09B7A7C;
remoteInfo = "sqflite-sqflite_darwin_privacy";
};
0B2156642C0D8FFF00D5A718 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 0B2156242C0D8FFF00D5A718 /* Pods.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 55E0AFD333353D71ACC2207149E879D6;
remoteInfo = Toast;
};
0B2156662C0D8FFF00D5A718 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 0B2156242C0D8FFF00D5A718 /* Pods.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 7B7C06D35B3BC2BD649AAA1A489E49DA;
remoteInfo = url_launcher_ios;
};
0B2156682C0D8FFF00D5A718 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 0B2156242C0D8FFF00D5A718 /* Pods.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = DBA6F34C072B134D3BE38983776DD1C3;
remoteInfo = "url_launcher_ios-url_launcher_ios_privacy";
};
0B21566A2C0D8FFF00D5A718 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 0B2156242C0D8FFF00D5A718 /* Pods.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 315E7D4955EFF42177E9BBC4382B527F;
remoteInfo = wakelock;
};
0B21566C2C0D8FFF00D5A718 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 0B2156242C0D8FFF00D5A718 /* Pods.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 7409A9316D1EEFAC7B383BE8CEC1BE03;
remoteInfo = webview_flutter_wkwebview;
};
0B21566E2C0D8FFF00D5A718 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 0B2156242C0D8FFF00D5A718 /* Pods.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 163A707D53693953E4DC7E0DE4C912A4;
remoteInfo = "webview_flutter_wkwebview-webview_flutter_wkwebview_privacy";
};
/* End PBXContainerItemProxy section */
/* Begin PBXCopyFilesBuildPhase section */
9705A1C41CF9048500538489 /* Embed Frameworks */ = {
isa = PBXCopyFilesBuildPhase;
@ -30,6 +201,7 @@
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
0B2156242C0D8FFF00D5A718 /* Pods.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Pods.xcodeproj; path = Pods/Pods.xcodeproj; sourceTree = "<group>"; };
0BD0304F2994F44800EB7527 /* Launch Screen.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = "Launch Screen.storyboard"; sourceTree = "<group>"; };
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; };
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; };
@ -64,11 +236,43 @@
050DAC6E1AD50AF47A1F4114 /* Frameworks */ = {
isa = PBXGroup;
children = (
0B2156242C0D8FFF00D5A718 /* Pods.xcodeproj */,
9AE64B664D96A59005B338D3 /* Pods_Runner.framework */,
);
name = Frameworks;
sourceTree = "<group>";
};
0B2156252C0D8FFF00D5A718 /* Products */ = {
isa = PBXGroup;
children = (
0B2156412C0D8FFF00D5A718 /* app_installer */,
0B2156432C0D8FFF00D5A718 /* connectivity_plus */,
0B2156452C0D8FFF00D5A718 /* flutter_keyboard_visibility */,
0B2156472C0D8FFF00D5A718 /* fluttertoast */,
0B2156492C0D8FFF00D5A718 /* image_picker_ios */,
0B21564B2C0D8FFF00D5A718 /* image_picker_ios-image_picker_ios_privacy */,
0B21564D2C0D8FFF00D5A718 /* install_plugin */,
0B21564F2C0D8FFF00D5A718 /* package_info */,
0B2156512C0D8FFF00D5A718 /* path_provider_foundation */,
0B2156532C0D8FFF00D5A718 /* path_provider_foundation-path_provider_foundation_privacy */,
0B2156552C0D8FFF00D5A718 /* permission_handler_apple */,
0B2156572C0D8FFF00D5A718 /* Pods-Runner */,
0B2156592C0D8FFF00D5A718 /* ReachabilitySwift */,
0B21565B2C0D8FFF00D5A718 /* rive_common */,
0B21565D2C0D8FFF00D5A718 /* shared_preferences_foundation */,
0B21565F2C0D8FFF00D5A718 /* shared_preferences_foundation-shared_preferences_foundation_privacy */,
0B2156612C0D8FFF00D5A718 /* sqflite */,
0B2156632C0D8FFF00D5A718 /* sqflite-sqflite_darwin_privacy */,
0B2156652C0D8FFF00D5A718 /* Toast */,
0B2156672C0D8FFF00D5A718 /* url_launcher_ios */,
0B2156692C0D8FFF00D5A718 /* url_launcher_ios-url_launcher_ios_privacy */,
0B21566B2C0D8FFF00D5A718 /* wakelock */,
0B21566D2C0D8FFF00D5A718 /* webview_flutter_wkwebview */,
0B21566F2C0D8FFF00D5A718 /* webview_flutter_wkwebview-webview_flutter_wkwebview_privacy */,
);
name = Products;
sourceTree = "<group>";
};
9740EEB11CF90186004384FC /* Flutter */ = {
isa = PBXGroup;
children = (
@ -175,6 +379,12 @@
mainGroup = 97C146E51CF9000F007C117D;
productRefGroup = 97C146EF1CF9000F007C117D /* Products */;
projectDirPath = "";
projectReferences = (
{
ProductGroup = 0B2156252C0D8FFF00D5A718 /* Products */;
ProjectRef = 0B2156242C0D8FFF00D5A718 /* Pods.xcodeproj */;
},
);
projectRoot = "";
targets = (
97C146ED1CF9000F007C117D /* Runner */,
@ -182,6 +392,201 @@
};
/* End PBXProject section */
/* Begin PBXReferenceProxy section */
0B2156412C0D8FFF00D5A718 /* app_installer */ = {
isa = PBXReferenceProxy;
fileType = wrapper.framework;
name = app_installer;
path = app_installer.framework;
remoteRef = 0B2156402C0D8FFF00D5A718 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
0B2156432C0D8FFF00D5A718 /* connectivity_plus */ = {
isa = PBXReferenceProxy;
fileType = wrapper.framework;
name = connectivity_plus;
path = connectivity_plus.framework;
remoteRef = 0B2156422C0D8FFF00D5A718 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
0B2156452C0D8FFF00D5A718 /* flutter_keyboard_visibility */ = {
isa = PBXReferenceProxy;
fileType = wrapper.framework;
name = flutter_keyboard_visibility;
path = flutter_keyboard_visibility.framework;
remoteRef = 0B2156442C0D8FFF00D5A718 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
0B2156472C0D8FFF00D5A718 /* fluttertoast */ = {
isa = PBXReferenceProxy;
fileType = wrapper.framework;
name = fluttertoast;
path = fluttertoast.framework;
remoteRef = 0B2156462C0D8FFF00D5A718 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
0B2156492C0D8FFF00D5A718 /* image_picker_ios */ = {
isa = PBXReferenceProxy;
fileType = wrapper.framework;
name = image_picker_ios;
path = image_picker_ios.framework;
remoteRef = 0B2156482C0D8FFF00D5A718 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
0B21564B2C0D8FFF00D5A718 /* image_picker_ios-image_picker_ios_privacy */ = {
isa = PBXReferenceProxy;
fileType = wrapper.cfbundle;
name = "image_picker_ios-image_picker_ios_privacy";
path = image_picker_ios_privacy.bundle;
remoteRef = 0B21564A2C0D8FFF00D5A718 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
0B21564D2C0D8FFF00D5A718 /* install_plugin */ = {
isa = PBXReferenceProxy;
fileType = wrapper.framework;
name = install_plugin;
path = install_plugin.framework;
remoteRef = 0B21564C2C0D8FFF00D5A718 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
0B21564F2C0D8FFF00D5A718 /* package_info */ = {
isa = PBXReferenceProxy;
fileType = wrapper.framework;
name = package_info;
path = package_info.framework;
remoteRef = 0B21564E2C0D8FFF00D5A718 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
0B2156512C0D8FFF00D5A718 /* path_provider_foundation */ = {
isa = PBXReferenceProxy;
fileType = wrapper.framework;
name = path_provider_foundation;
path = path_provider_foundation.framework;
remoteRef = 0B2156502C0D8FFF00D5A718 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
0B2156532C0D8FFF00D5A718 /* path_provider_foundation-path_provider_foundation_privacy */ = {
isa = PBXReferenceProxy;
fileType = wrapper.cfbundle;
name = "path_provider_foundation-path_provider_foundation_privacy";
path = path_provider_foundation_privacy.bundle;
remoteRef = 0B2156522C0D8FFF00D5A718 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
0B2156552C0D8FFF00D5A718 /* permission_handler_apple */ = {
isa = PBXReferenceProxy;
fileType = wrapper.framework;
name = permission_handler_apple;
path = permission_handler_apple.framework;
remoteRef = 0B2156542C0D8FFF00D5A718 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
0B2156572C0D8FFF00D5A718 /* Pods-Runner */ = {
isa = PBXReferenceProxy;
fileType = wrapper.framework;
name = "Pods-Runner";
path = Pods_Runner.framework;
remoteRef = 0B2156562C0D8FFF00D5A718 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
0B2156592C0D8FFF00D5A718 /* ReachabilitySwift */ = {
isa = PBXReferenceProxy;
fileType = wrapper.framework;
name = ReachabilitySwift;
path = Reachability.framework;
remoteRef = 0B2156582C0D8FFF00D5A718 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
0B21565B2C0D8FFF00D5A718 /* rive_common */ = {
isa = PBXReferenceProxy;
fileType = wrapper.framework;
name = rive_common;
path = rive_common.framework;
remoteRef = 0B21565A2C0D8FFF00D5A718 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
0B21565D2C0D8FFF00D5A718 /* shared_preferences_foundation */ = {
isa = PBXReferenceProxy;
fileType = wrapper.framework;
name = shared_preferences_foundation;
path = shared_preferences_foundation.framework;
remoteRef = 0B21565C2C0D8FFF00D5A718 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
0B21565F2C0D8FFF00D5A718 /* shared_preferences_foundation-shared_preferences_foundation_privacy */ = {
isa = PBXReferenceProxy;
fileType = wrapper.cfbundle;
name = "shared_preferences_foundation-shared_preferences_foundation_privacy";
path = shared_preferences_foundation_privacy.bundle;
remoteRef = 0B21565E2C0D8FFF00D5A718 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
0B2156612C0D8FFF00D5A718 /* sqflite */ = {
isa = PBXReferenceProxy;
fileType = wrapper.framework;
name = sqflite;
path = sqflite.framework;
remoteRef = 0B2156602C0D8FFF00D5A718 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
0B2156632C0D8FFF00D5A718 /* sqflite-sqflite_darwin_privacy */ = {
isa = PBXReferenceProxy;
fileType = wrapper.cfbundle;
name = "sqflite-sqflite_darwin_privacy";
path = sqflite_darwin_privacy.bundle;
remoteRef = 0B2156622C0D8FFF00D5A718 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
0B2156652C0D8FFF00D5A718 /* Toast */ = {
isa = PBXReferenceProxy;
fileType = wrapper.framework;
name = Toast;
path = Toast.framework;
remoteRef = 0B2156642C0D8FFF00D5A718 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
0B2156672C0D8FFF00D5A718 /* url_launcher_ios */ = {
isa = PBXReferenceProxy;
fileType = wrapper.framework;
name = url_launcher_ios;
path = url_launcher_ios.framework;
remoteRef = 0B2156662C0D8FFF00D5A718 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
0B2156692C0D8FFF00D5A718 /* url_launcher_ios-url_launcher_ios_privacy */ = {
isa = PBXReferenceProxy;
fileType = wrapper.cfbundle;
name = "url_launcher_ios-url_launcher_ios_privacy";
path = url_launcher_ios_privacy.bundle;
remoteRef = 0B2156682C0D8FFF00D5A718 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
0B21566B2C0D8FFF00D5A718 /* wakelock */ = {
isa = PBXReferenceProxy;
fileType = wrapper.framework;
name = wakelock;
path = wakelock.framework;
remoteRef = 0B21566A2C0D8FFF00D5A718 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
0B21566D2C0D8FFF00D5A718 /* webview_flutter_wkwebview */ = {
isa = PBXReferenceProxy;
fileType = wrapper.framework;
name = webview_flutter_wkwebview;
path = webview_flutter_wkwebview.framework;
remoteRef = 0B21566C2C0D8FFF00D5A718 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
0B21566F2C0D8FFF00D5A718 /* webview_flutter_wkwebview-webview_flutter_wkwebview_privacy */ = {
isa = PBXReferenceProxy;
fileType = wrapper.cfbundle;
name = "webview_flutter_wkwebview-webview_flutter_wkwebview_privacy";
path = webview_flutter_wkwebview_privacy.bundle;
remoteRef = 0B21566E2C0D8FFF00D5A718 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
/* End PBXReferenceProxy section */
/* Begin PBXResourcesBuildPhase section */
97C146EC1CF9000F007C117D /* Resources */ = {
isa = PBXResourcesBuildPhase;
@ -352,7 +757,7 @@
ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES;
ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = "";
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = 24;
CURRENT_PROJECT_VERSION = 25;
DEVELOPMENT_TEAM = CYDU583KN6;
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
@ -360,7 +765,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 1.0.107;
MARKETING_VERSION = 1.0.108;
PRODUCT_BUNDLE_IDENTIFIER = com.example.markingApp;
PRODUCT_NAME = "$(TARGET_NAME)";
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
@ -490,7 +895,7 @@
ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES;
ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = "";
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = 24;
CURRENT_PROJECT_VERSION = 25;
DEVELOPMENT_TEAM = CYDU583KN6;
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
@ -498,7 +903,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 1.0.107;
MARKETING_VERSION = 1.0.108;
PRODUCT_BUNDLE_IDENTIFIER = com.example.markingApp;
PRODUCT_NAME = "$(TARGET_NAME)";
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
@ -520,7 +925,7 @@
ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES;
ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = "";
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = 24;
CURRENT_PROJECT_VERSION = 25;
DEVELOPMENT_TEAM = CYDU583KN6;
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
@ -528,7 +933,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 1.0.107;
MARKETING_VERSION = 1.0.108;
PRODUCT_BUNDLE_IDENTIFIER = com.example.markingApp;
PRODUCT_NAME = "$(TARGET_NAME)";
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";

View File

@ -6,14 +6,12 @@
* @FilePath: \marking_app\lib\common\model\UserLogin.dart
* @Description: ,`customMade`, koroFileHeader查看配置 : https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
import 'package:json_annotation/json_annotation.dart';
import 'package:json_annotation/json_annotation.dart';
part 'user_login.g.dart';
@JsonSerializable(checked: true)
class UserLogin extends Object {
class UserLogin extends Object {
@JsonKey(name: 'access_token')
String accessToken;
@ -23,10 +21,28 @@ part 'user_login.g.dart';
@JsonKey(name: 'token_type')
String tokenType;
UserLogin(this.accessToken,this.expiresIn,this.tokenType,);
UserLogin(
this.accessToken,
this.expiresIn,
this.tokenType,
);
factory UserLogin.fromJson(Map<String, dynamic> srcJson) => _$UserLoginFromJson(srcJson);
Map<String, dynamic> toJson() => _$UserLoginToJson(this);
}
}
@JsonSerializable()
class UseLoginSchool extends Object {
@JsonKey(name: 'schoolId')
int schoolId;
@JsonKey(name: 'schoolName')
String schoolName;
UseLoginSchool(this.schoolId, this.schoolName);
factory UseLoginSchool.fromJson(Map<String, dynamic> srcJson) => _$UseLoginSchoolFromJson(srcJson);
Map<String, dynamic> toJson() => _$UseLoginSchoolToJson(this);
}

View File

@ -6,24 +6,24 @@
* @FilePath: \marking_app\lib\common\model\user\user_login_params.dart
* @Description: ,`customMade`, koroFileHeader查看配置 : https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
import 'package:json_annotation/json_annotation.dart';
import 'package:json_annotation/json_annotation.dart';
part 'user_login_params.g.dart';
@JsonSerializable()
class UserLoginParams extends Object {
class UserLoginParams extends Object {
@JsonKey(name: 'loginName')
String loginName;
@JsonKey(name: 'password')
String password;
UserLoginParams(this.loginName,this.password,);
@JsonKey(name: 'schoolId')
int? schoolId;
UserLoginParams(this.loginName, this.password, [this.schoolId]);
factory UserLoginParams.fromJson(Map<String, dynamic> srcJson) => _$UserLoginParamsFromJson(srcJson);
Map<String, dynamic> toJson() => _$UserLoginParamsToJson(this);
}
}

View File

@ -9,6 +9,7 @@
import 'dart:convert';
import 'dart:io';
import 'package:collection/collection.dart';
import 'package:dio/dio.dart';
import 'package:dio/adapter.dart';
@ -16,7 +17,9 @@ import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:functional_widget_annotation/functional_widget_annotation.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:marking_app/common/config/request_config.dart';
import 'package:marking_app/common/mixin/common.dart';
@ -32,6 +35,8 @@ import 'package:marking_app/provider/user_provider.dart';
import 'package:marking_app/routes/RouterManager.dart';
import 'package:marking_app/utils/sys_protocol.dart';
part 'index.g.dart';
class TheLogin extends StatefulHookConsumerWidget {
const TheLogin({Key? key}) : super(key: key);
@ -55,6 +60,9 @@ class _TheLoginState extends ConsumerState<TheLogin> with CommonMixin {
//
late final TextEditingController _userNameController;
late final TextEditingController _passwordController;
int? lastTimeSchoolId; // ID
int? schoolId;
List<UseLoginSchool> schools = []; //
late final FocusNode _pwdFocus; //
late final FocusNode _theFocus;
@ -81,13 +89,7 @@ class _TheLoginState extends ConsumerState<TheLogin> with CommonMixin {
});
getShowRegister();
super.initState();
dio = Dio(
BaseOptions(
contentType: "application/json",
connectTimeout: 8000,
receiveTimeout: 8000,
),
);
dio = Dio(BaseOptions(contentType: "application/json", connectTimeout: 8000, receiveTimeout: 8000));
dio.interceptors.add(LogInterceptor(responseBody: true, requestBody: true)); //
setHttpsPEM();
@ -103,27 +105,60 @@ class _TheLoginState extends ConsumerState<TheLogin> with CommonMixin {
setState(() {
_passwordController.text = valMap['pwd'];
_userNameController.text = valMap['account'];
lastTimeSchoolId = int.tryParse(valMap['schoolId']);
print('原始学校ID $schoolId');
keepPwd = true;
});
});
}
void getShowRegister() async {
RestClient client = await getClientLogin();
BaseStructureResult<dynamic> resultData = await client.showRegister();
if (resultData.success) {
setState(() {
showRegister = resultData.data;
});
try {
var client = await getClient();
BaseStructureResult<dynamic> resultData = await client.showRegister();
if (resultData.success) setState(() => showRegister = resultData.data);
} catch (e) {}
}
//
void getSchoolData(String loginName) async {
if (loginName.length != 0) {
try {
if (loginName == '18888888888') {
schoolId = 10079;
return;
}
var _client = await getClient();
var res = await _client.toLoginGetSchools(loginName);
if (res.success) {
schools = res.data ?? [];
UseLoginSchool? schoolElement;
if (lastTimeSchoolId != null) schoolElement = schools.firstWhereOrNull((e) => e.schoolId == lastTimeSchoolId);
if (schoolElement != null)
schoolId = schoolElement.schoolId;
else
schoolId = schools[0].schoolId;
setState(() {});
return;
}
} catch (e) {}
}
if (schools.isNotEmpty || schoolId != null) {
schools = [];
schoolId = null;
setState(() {});
}
}
void userNameListener() {
String userName = _userNameController.text;
String userName = _userNameController.text.trim();
int useNameLength = userName.length;
bool hasNameValNew = useNameLength > 0;
if (!hasNameValNew) lastTimeSchoolId = null;
if (hasNameValNew != hasNameVal) toUpState(setState, () => hasNameVal = hasNameValNew, mounted);
const isProd = bool.fromEnvironment('dart.vm.product');
getSchoolData(userName); //
if (!isProd && useNameLength == 11) {
_passwordController.text = userName.substring(useNameLength - 6);
}
@ -262,9 +297,11 @@ class _TheLoginState extends ConsumerState<TheLogin> with CommonMixin {
labelStyle: TextStyle(fontSize: 16.sp, color: const Color.fromRGBO(148, 163, 182, 1)),
),
),
SizedBox(
height: 12.h,
),
$SchoolDataDropDown(schools, schoolId, (int? id) {
schoolId = id;
lastTimeSchoolId = null;
}),
SizedBox(height: 12.h),
Row(
children: [
Container(
@ -289,13 +326,7 @@ class _TheLoginState extends ConsumerState<TheLogin> with CommonMixin {
FocusScope.of(context).requestFocus(_theFocus);
setState(() => keepPwd = !keepPwd);
},
child: Text(
'记住密码',
style: TextStyle(
fontSize: 14.sp,
color: const Color.fromRGBO(148, 163, 182, 1),
),
),
child: Text('记住密码', style: TextStyle(fontSize: 14.sp, color: const Color.fromRGBO(148, 163, 182, 1))),
),
Spacer(),
if (showRegister == true)
@ -303,10 +334,7 @@ class _TheLoginState extends ConsumerState<TheLogin> with CommonMixin {
onTap: () {
RouterManager.router.navigateTo(context, RouterManager.registerPath);
},
child: Text(
'注册',
style: TextStyle(fontSize: 14.sp, color: const Color.fromRGBO(148, 163, 182, 1)),
)),
child: Text('注册', style: TextStyle(fontSize: 14.sp, color: const Color.fromRGBO(148, 163, 182, 1)))),
],
),
InkWell(
@ -323,9 +351,7 @@ class _TheLoginState extends ConsumerState<TheLogin> with CommonMixin {
spreadRadius: 0.5, //
)
],
borderRadius: BorderRadius.all(
Radius.circular(8.w),
),
borderRadius: BorderRadius.all(Radius.circular(8.w)),
),
alignment: Alignment.center,
width: double.infinity,
@ -409,14 +435,13 @@ class _TheLoginState extends ConsumerState<TheLogin> with CommonMixin {
void toLogin() async {
if (!canLogin) return;
setState(() => canLogin = false);
void toMsg(msg) {
ToastUtils.showError(msg);
Future.delayed(Duration.zero, () => ToastUtils.showError(msg));
setState(() => canLogin = true);
}
try {
setState(() => canLogin = false);
FocusScope.of(context).requestFocus(_theFocus);
if (!readAgreement) {
var resFlag = await showDialog<bool>(
@ -459,12 +484,13 @@ class _TheLoginState extends ConsumerState<TheLogin> with CommonMixin {
if (userName == '') return toMsg('请填写用户账号');
if (userPwd == '') return toMsg('请填写密码再试');
if (!readAgreement) return toMsg('请勾选我已阅读用户协议和隐私协议');
if (schoolId == null) return toMsg('请选择所在学校');
String userPwdMd5 = CommonUtils.generateMD5(userPwd);
print('userPwdMd5=$userPwdMd5');
EasyLoading.show(status: 'loading...');
BaseStructureResult<dynamic> resultData = await client.toLogin(UserLoginParams(userName, userPwdMd5));
BaseStructureResult<dynamic> resultData = await client.toLogin(UserLoginParams(userName, userPwdMd5, schoolId!));
UserLogin? userData = resultData.code == 200 && resultData.data != null ? UserLogin.fromJson(resultData.data) : null;
if (resultData.code != 200 || userData?.accessToken == null || userData?.accessToken == '') {
return toMsg(resultData.message ?? '登录失败,请重试');
@ -482,7 +508,7 @@ class _TheLoginState extends ConsumerState<TheLogin> with CommonMixin {
fastData.setUser(userRes.data!).then((value) {
//
if (keepPwd) {
fastData.setUserPwdAndAccount({'pwd': userPwd, 'account': userName});
fastData.setUserPwdAndAccount({'pwd': userPwd, 'account': userName, 'schoolId': schoolId.toString()});
}
//
ref.read(userProvider.notifier).initUserInfo();
@ -525,3 +551,41 @@ class _TheLoginState extends ConsumerState<TheLogin> with CommonMixin {
}
}
}
@hwidget
Widget $schoolDataDropDown(BuildContext context, List<UseLoginSchool> schools, int? schoolId, void Function(int? id) call) {
var useSchool = useState(schools);
var useSchoolId = useState(schoolId);
useValueChanged<List<UseLoginSchool>, void>(schools, (_, __) => useSchool.value = schools);
useValueChanged<int?, void>(schoolId, (_, __) => useSchoolId.value = schoolId);
if (useSchool.value.isEmpty) return SizedBox();
return Padding(
padding: EdgeInsets.only(top: 24.h),
child: Column(
children: [
Container(alignment: Alignment.topLeft, child: quickText('登录学校', size: 12.sp, color: const Color.fromRGBO(148, 163, 182, 1))),
Container(
height: 40.h,
width: double.infinity,
child: DropdownButton<int>(
value: useSchoolId.value,
iconSize: 18.r,
elevation: 16,
isExpanded: true,
padding: EdgeInsets.only(right: 4.w),
icon: const Icon(Icons.keyboard_arrow_down_rounded),
style: TextStyle(color: Colors.deepPurple),
underline: Container(height: 0.6.h, color: const Color.fromRGBO(80, 87, 103, 1)),
onChanged: (int? id) {
call(id);
useSchoolId.value = schoolId;
},
items: useSchool.value.map((e) => DropdownMenuItem<int>(value: e.schoolId, child: quickText(e.schoolName, size: 12.sp))).toList(),
),
)
],
),
);
}

View File

@ -20,8 +20,7 @@ class Register extends StatefulWidget {
State<Register> createState() => _RegisterState();
}
class _RegisterState extends State<Register> with CommonMixin{
class _RegisterState extends State<Register> with CommonMixin {
late final FocusNode _theFocus;
late final FocusNode _pwdFocus; //
//
@ -33,7 +32,7 @@ class _RegisterState extends State<Register> with CommonMixin{
bool canLogin = true;
@override
void initState(){
void initState() {
super.initState();
_userNameController = TextEditingController();
_passwordController = TextEditingController();
@ -50,7 +49,7 @@ class _RegisterState extends State<Register> with CommonMixin{
_theFocus.dispose();
}
void toRegister() async{
void toRegister() async {
if (!canLogin) return;
setState(() => canLogin = false);
void toMsg(msg) {
@ -60,25 +59,29 @@ class _RegisterState extends State<Register> with CommonMixin{
FocusScope.of(context).requestFocus(_theFocus);
String userName = _userNameController.text.trim();
String userPwd = _passwordController.text.trim();
if (userName == '') return toMsg('请填写用户账号');
if (userPwd == '') return toMsg('请填写密码');
if (!readAgreement) return toMsg('请勾选我已阅读用户协议和隐私协议');
try {
String userName = _userNameController.text.trim();
String userPwd = _passwordController.text.trim();
if (userName == '') return toMsg('请填写用户账号');
if (userPwd == '') return toMsg('请填写密码');
if (!readAgreement) return toMsg('请勾选我已阅读用户协议和隐私协议');
String userPwdMd5 = CommonUtils.generateMD5(userPwd);
print('注册userPwdMd5=$userPwdMd5');
EasyLoading.show(status: 'loading...');
RestClient client = await getClientLogin();
BaseStructureResult<dynamic> resultData = await client.toRegister(UserLoginParams(userName, userPwdMd5));
String userPwdMd5 = CommonUtils.generateMD5(userPwd);
print('注册userPwdMd5=$userPwdMd5');
EasyLoading.show(status: 'loading...');
RestClient client = await getClientLogin();
BaseStructureResult<dynamic> resultData = await client.toRegister(UserLoginParams(userName, userPwdMd5, 0));
if (resultData.code != 200) {
return toMsg(resultData.message ?? '注册失败,请重试');
if (resultData.code != 200) {
return toMsg(resultData.message ?? '注册失败,请重试');
}
ToastUtils.showSuccess('注册成功,请登录');
//
RouterManager.router.navigateTo(context, RouterManager.loginPath);
} finally {
EasyLoading.dismiss();
}
EasyLoading.dismiss();
ToastUtils.showSuccess('注册成功,请登录');
//
RouterManager.router.navigateTo(context, RouterManager.loginPath);
}
void _showPassword() {
@ -232,10 +235,8 @@ class _RegisterState extends State<Register> with CommonMixin{
checkColor: Colors.white,
value: readAgreement,
onChanged: (value) {
FocusScope.of(context)
.requestFocus(_pwdFocus);
FocusScope.of(context)
.requestFocus(_theFocus);
FocusScope.of(context).requestFocus(_pwdFocus);
FocusScope.of(context).requestFocus(_theFocus);
setState(() {
readAgreement = value ?? false;
});
@ -270,18 +271,15 @@ class _RegisterState extends State<Register> with CommonMixin{
),
]),
)
],
),
)),
Positioned(
top: MediaQuery.of(context).padding.top+20.r,
top: MediaQuery.of(context).padding.top + 20.r,
left: 20.r,
child: InkWell(
onTap: () => Navigator.pop(context),
child: Icon(Icons.arrow_back_ios_new_rounded,
color: Colors.white, size: 24.sp),
child: Icon(Icons.arrow_back_ios_new_rounded, color: Colors.white, size: 24.sp),
),
),
],

View File

@ -63,6 +63,7 @@ import 'package:marking_app/common/model/review/review_page_params.dart';
import 'package:marking_app/common/model/review/review_tab.dart';
import 'package:marking_app/common/model/sys/system_version.dart';
import 'package:marking_app/common/model/user/user_info.dart';
import 'package:marking_app/common/model/user/user_login.dart';
import 'package:retrofit/retrofit.dart' as the_retrofit;
import 'package:marking_app/common/model/user/user_login_params.dart';
@ -81,6 +82,10 @@ abstract class RestClient {
@the_retrofit.POST("/auth/login/exam-marking/user")
Future<BaseStructureResult<dynamic>> toLogin(@the_retrofit.Body() UserLoginParams params);
//
@the_retrofit.GET("/auth/login/exam-marking/user-schools")
Future<BaseStructureResult<List<UseLoginSchool>>> toLoginGetSchools(@the_retrofit.Query("loginName") String loginName);
//
@the_retrofit.GET("/api/img-svr/minio-cfg")
Future<BaseStructureResult<UploadImgSecretKey>> getImageUploadKey();

View File

@ -15,7 +15,7 @@ publish_to: "none" # Remove this line if you wish to publish to pub.dev
# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.
# Read more about iOS versioning at
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
version: 1.0.107+2
version: 1.0.108+3
environment:
sdk: ">=2.17.1 <3.0.0"
@ -104,7 +104,7 @@ dependencies:
# multi_select_flutter: ^4.1.3
dropdown_button2: ^2.3.9
# copy
clipboard: ^0.1.3
# clipboard: ^0.1.3
image: ^4.1.3
awesome_dialog: ^3.1.0
badges: ^3.1.2