Compare commits
2 Commits
main
...
update_sco
| Author | SHA1 | Date |
|---|---|---|
|
|
1104862e84 | |
|
|
6a3601df9b |
|
|
@ -230,4 +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
|
||||
marking_app/lib/common/model/marking/marking_exam_status_flag.g.dart
|
||||
|
|
|
|||
|
|
@ -117,4 +117,4 @@ SPEC CHECKSUMS:
|
|||
|
||||
PODFILE CHECKSUM: 64629b724b9886c2d78e6972ff5ef90e370df047
|
||||
|
||||
COCOAPODS: 1.12.1
|
||||
COCOAPODS: 1.11.3
|
||||
|
|
|
|||
|
|
@ -16,177 +16,6 @@
|
|||
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;
|
||||
|
|
@ -201,7 +30,6 @@
|
|||
/* 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>"; };
|
||||
|
|
@ -236,43 +64,11 @@
|
|||
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 = (
|
||||
|
|
@ -379,12 +175,6 @@
|
|||
mainGroup = 97C146E51CF9000F007C117D;
|
||||
productRefGroup = 97C146EF1CF9000F007C117D /* Products */;
|
||||
projectDirPath = "";
|
||||
projectReferences = (
|
||||
{
|
||||
ProductGroup = 0B2156252C0D8FFF00D5A718 /* Products */;
|
||||
ProjectRef = 0B2156242C0D8FFF00D5A718 /* Pods.xcodeproj */;
|
||||
},
|
||||
);
|
||||
projectRoot = "";
|
||||
targets = (
|
||||
97C146ED1CF9000F007C117D /* Runner */,
|
||||
|
|
@ -392,201 +182,6 @@
|
|||
};
|
||||
/* 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;
|
||||
|
|
@ -757,7 +352,7 @@
|
|||
ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES;
|
||||
ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = "";
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CURRENT_PROJECT_VERSION = 25;
|
||||
CURRENT_PROJECT_VERSION = 24;
|
||||
DEVELOPMENT_TEAM = CYDU583KN6;
|
||||
ENABLE_BITCODE = NO;
|
||||
INFOPLIST_FILE = Runner/Info.plist;
|
||||
|
|
@ -765,7 +360,7 @@
|
|||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 1.0.108;
|
||||
MARKETING_VERSION = 1.0.107;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.example.markingApp;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
|
||||
|
|
@ -895,7 +490,7 @@
|
|||
ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES;
|
||||
ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = "";
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CURRENT_PROJECT_VERSION = 25;
|
||||
CURRENT_PROJECT_VERSION = 24;
|
||||
DEVELOPMENT_TEAM = CYDU583KN6;
|
||||
ENABLE_BITCODE = NO;
|
||||
INFOPLIST_FILE = Runner/Info.plist;
|
||||
|
|
@ -903,7 +498,7 @@
|
|||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 1.0.108;
|
||||
MARKETING_VERSION = 1.0.107;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.example.markingApp;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
|
||||
|
|
@ -925,7 +520,7 @@
|
|||
ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES;
|
||||
ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = "";
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CURRENT_PROJECT_VERSION = 25;
|
||||
CURRENT_PROJECT_VERSION = 24;
|
||||
DEVELOPMENT_TEAM = CYDU583KN6;
|
||||
ENABLE_BITCODE = NO;
|
||||
INFOPLIST_FILE = Runner/Info.plist;
|
||||
|
|
@ -933,7 +528,7 @@
|
|||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 1.0.108;
|
||||
MARKETING_VERSION = 1.0.107;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.example.markingApp;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
|
||||
|
|
|
|||
|
|
@ -2,7 +2,8 @@
|
|||
enum KeyboardType {
|
||||
INPUT_TYPE, // 输入型
|
||||
RIGHT_SELECTION, // 右侧选择型
|
||||
BOTTOM_SELECTION // 底部选择型
|
||||
BOTTOM_SELECTION, // 底部选择型
|
||||
CLICK_TO_RATE_AND_REVIEW, // 点击打分批阅
|
||||
}
|
||||
|
||||
// 键盘排序规则
|
||||
|
|
@ -17,3 +18,12 @@ enum ScreenDirection {
|
|||
HORIZONTAL_SCREEN, // 横屏
|
||||
VERTICAL_SCREEN // 竖屏
|
||||
}
|
||||
|
||||
// 点击打分打分方式
|
||||
enum ClickOnScoringMethod {
|
||||
INCREMENTAL(title: '点击递增'),
|
||||
DECREASING(title: '点击递减');
|
||||
|
||||
const ClickOnScoringMethod({required this.title});
|
||||
final String title;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -166,6 +166,10 @@ class DoMarkingKeyboardModel extends Object {
|
|||
@JsonKey(name: 'commonScores', includeIfNull: false)
|
||||
MarkingCommonScoreItems? commonScores;
|
||||
|
||||
// 常用打分项
|
||||
@JsonKey(name: 'clickOnScoringMethod', includeIfNull: false)
|
||||
ClickOnScoringMethod? clickOnScoringMethod;
|
||||
|
||||
// 默认输入型键盘
|
||||
DoMarkingKeyboardModel({
|
||||
this.hideQuestionId = false,
|
||||
|
|
|
|||
|
|
@ -0,0 +1,18 @@
|
|||
import 'package:json_annotation/json_annotation.dart';
|
||||
|
||||
part 'marking_exam_status_flag.g.dart';
|
||||
|
||||
@JsonSerializable()
|
||||
class MarkingExamStatusFlag extends Object {
|
||||
@JsonKey(name: 'markingUserDetailId')
|
||||
int markingUserDetailId;
|
||||
|
||||
@JsonKey(name: 'markingFlag')
|
||||
int? markingFlag;
|
||||
|
||||
MarkingExamStatusFlag({required this.markingUserDetailId, this.markingFlag});
|
||||
|
||||
factory MarkingExamStatusFlag.fromJson(Map<String, dynamic> srcJson) => _$MarkingExamStatusFlagFromJson(srcJson);
|
||||
|
||||
Map<String, dynamic> toJson() => _$MarkingExamStatusFlagToJson(this);
|
||||
}
|
||||
|
|
@ -6,8 +6,6 @@
|
|||
* @FilePath: \marking_app\lib\common\model\marking\marking_text_question.dart
|
||||
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
|
||||
*/
|
||||
import 'dart:convert';
|
||||
|
||||
import 'package:json_annotation/json_annotation.dart';
|
||||
import 'package:marking_app/common/model/marking/progress_of_marking.dart';
|
||||
import 'package:marking_app/utils/image/gallery_example_item_model.dart';
|
||||
|
|
@ -46,6 +44,10 @@ class MarkingTextQuestion extends Object {
|
|||
@JsonKey(name: 'subQuestionDetailList')
|
||||
List<SubQuestions> subQuestionDetailList;
|
||||
|
||||
// 点击打分 打分位置
|
||||
@JsonKey(name: 'scorePosition')
|
||||
List<ScorePositionModel> scorePosition;
|
||||
|
||||
// 当前试题位置
|
||||
// @JsonKey(name: 'questionIndex')
|
||||
// int questionIndex;
|
||||
|
|
@ -57,6 +59,9 @@ class MarkingTextQuestion extends Object {
|
|||
// @JsonKey(name: 'currentIndex')
|
||||
// int currentIndex;
|
||||
|
||||
@JsonKey(name: 'markingFlag') // 试题状态 默认null 1:优秀 2:错误卷
|
||||
int? markingFlag;
|
||||
|
||||
@JsonKey(name: 'lastOne')
|
||||
bool lastOne;
|
||||
|
||||
|
|
@ -126,6 +131,7 @@ class MarkingTextQuestion extends Object {
|
|||
this.scoreInterval = 1,
|
||||
this.markingProgress,
|
||||
this.completeRating = false,
|
||||
this.scorePosition = const [],
|
||||
this.originalPaperAbsoluteUrl = const [],
|
||||
// this.totalCount = 0,
|
||||
// this.currentIndex = 0,
|
||||
|
|
@ -159,7 +165,6 @@ class MarkingTextQuestion extends Object {
|
|||
// return HistoricalScoring.fromJson(e as Map<String, dynamic>);
|
||||
// }).toList();
|
||||
// }
|
||||
// TODO 删除
|
||||
// this.historicalScorings = [
|
||||
// HistoricalScoring.fromJson({'scorel': 1.5, 'name': 'wy', 'markingUserld': 121321231313}),
|
||||
// HistoricalScoring.fromJson({'scorel': 5, 'name': '汪杨', 'markingUserld': 121321231313})
|
||||
|
|
@ -290,3 +295,21 @@ class ExceptionInfo extends Object {
|
|||
|
||||
Map<String, dynamic> toJson() => _$ExceptionInfoToJson(this);
|
||||
}
|
||||
|
||||
@JsonSerializable()
|
||||
class ScorePositionModel extends Object {
|
||||
@JsonKey(name: 'position')
|
||||
List<dynamic> position;
|
||||
|
||||
@JsonKey(name: 'questionNum')
|
||||
String questionNum;
|
||||
|
||||
@JsonKey(name: 'subQuestionNum')
|
||||
String? subQuestionNum;
|
||||
|
||||
ScorePositionModel({required this.position, required this.questionNum, this.subQuestionNum});
|
||||
|
||||
factory ScorePositionModel.fromJson(Map<String, dynamic> srcJson) => _$ScorePositionModelFromJson(srcJson);
|
||||
|
||||
Map<String, dynamic> toJson() => _$ScorePositionModelToJson(this);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,12 +6,14 @@
|
|||
* @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;
|
||||
|
||||
|
|
@ -21,28 +23,10 @@ class UserLogin extends Object {
|
|||
@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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
|
||||
@JsonKey(name: 'schoolId')
|
||||
int? schoolId;
|
||||
|
||||
UserLoginParams(this.loginName, this.password, [this.schoolId]);
|
||||
UserLoginParams(this.loginName,this.password,);
|
||||
|
||||
factory UserLoginParams.fromJson(Map<String, dynamic> srcJson) => _$UserLoginParamsFromJson(srcJson);
|
||||
|
||||
Map<String, dynamic> toJson() => _$UserLoginParamsToJson(this);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -56,6 +56,16 @@ class MarkingKeyboardSwitch extends ConsumerWidget {
|
|||
submitCall: submitCall,
|
||||
synchroScore: synchroScore,
|
||||
);
|
||||
case KeyboardType.CLICK_TO_RATE_AND_REVIEW:
|
||||
return SelectableKeyboard(
|
||||
data: data,
|
||||
markingUserId: markingUserId,
|
||||
subtopicIndex: subtopicIndex,
|
||||
questScore: questScore,
|
||||
totalScore: data.totalScore,
|
||||
submitCall: submitCall,
|
||||
synchroScore: synchroScore,
|
||||
);
|
||||
case KeyboardType.BOTTOM_SELECTION:
|
||||
return const SizedBox();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -50,6 +50,7 @@ class _MarkingSetingState extends ConsumerState<MarkingSeting> {
|
|||
late double scoreInterval; // 分值间隔设置
|
||||
late int keyboardIndex; // 键盘下标
|
||||
late bool autoSubmitToNextQuestion; // 提交并自动跳转下一题
|
||||
ClickOnScoringMethod? _clickOnScoringMethod; //点击打分计分方式
|
||||
late RemoveListener _markingKeyboardListener;
|
||||
MarkingCommonScoreItems? _commonScoreItems;
|
||||
@override
|
||||
|
|
@ -57,17 +58,15 @@ class _MarkingSetingState extends ConsumerState<MarkingSeting> {
|
|||
// 当前
|
||||
_markingKeyboardListener = ref.read(markingKeyboardProvider.notifier).addListener((state) {
|
||||
MarkingCommonScoreItems? theCommonScores = state.commonScores;
|
||||
if (theCommonScores != null &&
|
||||
widget.questionNum == theCommonScores.questionNum &&
|
||||
widget.markingUserId == theCommonScores.id) {
|
||||
if (theCommonScores != null && widget.questionNum == theCommonScores.questionNum && widget.markingUserId == theCommonScores.id) {
|
||||
_commonScoreItems = state.commonScores;
|
||||
}
|
||||
keyboardModel = state;
|
||||
keyboardIndex = state.keyboard.index;
|
||||
sortType = state.sort;
|
||||
autoSubmitToNextQuestion = state.autoSubmitToNextQuestion;
|
||||
scoreInterval = state.getScoreStepSize(
|
||||
widget.markingUserId, widget.questionNum, widget.defaultScoreInterval); // 或者对应试卷和试题的步长
|
||||
_clickOnScoringMethod = state.clickOnScoringMethod;
|
||||
scoreInterval = state.getScoreStepSize(widget.markingUserId, widget.questionNum, widget.defaultScoreInterval); // 或者对应试卷和试题的步长
|
||||
isHorizontal = state.screenDirection == ScreenDirection.HORIZONTAL_SCREEN;
|
||||
|
||||
keyboardTypes = KeyboardType.values.map((e) {
|
||||
|
|
@ -112,54 +111,19 @@ class _MarkingSetingState extends ConsumerState<MarkingSeting> {
|
|||
case KeyboardType.RIGHT_SELECTION:
|
||||
case KeyboardType.BOTTOM_SELECTION:
|
||||
// 底部键盘和右侧键盘
|
||||
model.setScoreStepSize(
|
||||
widget.markingUserId, widget.questionNum, widget.defaultScoreInterval, scoreInterval); // 设置分值
|
||||
model.setScoreStepSize(widget.markingUserId, widget.questionNum, widget.defaultScoreInterval, scoreInterval); // 设置分值
|
||||
model.sort = sortType;
|
||||
break;
|
||||
case KeyboardType.CLICK_TO_RATE_AND_REVIEW:
|
||||
// 点击打分 (打分步长、计分方式)
|
||||
model.clickOnScoringMethod = _clickOnScoringMethod;
|
||||
break;
|
||||
}
|
||||
model.screenDirection = keyboardModel.screenDirection;
|
||||
model.autoSubmitToNextQuestion = autoSubmitToNextQuestion;
|
||||
if (_commonScoreItems != null) model.commonScores = _commonScoreItems!.score.isNotEmpty ? _commonScoreItems : null;
|
||||
ref.read(markingKeyboardProvider.notifier).toggleKeyboard(model);
|
||||
setTimeOut(300, () => widget.close(true));
|
||||
|
||||
/// 取消保存数据确认按钮
|
||||
// showDialog(
|
||||
// // 表示点击灰色背景的时候是否消失弹出框
|
||||
// barrierDismissible: false,
|
||||
// context: context,
|
||||
// builder: (context1) {
|
||||
// return AlertDialog(content: quickText("请确定当前阅卷习惯配置?"), actions: <Widget>[
|
||||
// TextButton(
|
||||
// child: quickText("取消"),
|
||||
// onPressed: () {
|
||||
// Navigator.pop(context1, 'Cancle');
|
||||
// },
|
||||
// ),
|
||||
// TextButton(
|
||||
// child: quickText("确定", color: Theme.of(context).primaryColor),
|
||||
// onPressed: () {
|
||||
// TheDoMarkingKeyboardModel theCurrent = keyboardTypes[keyboardIndex]; // 当前选中的键盘
|
||||
// DoMarkingKeyboardModel model = theCurrent.model;
|
||||
// switch (model.keyboard) {
|
||||
// case KeyboardType.INPUT_TYPE:
|
||||
// // 输入型键盘
|
||||
// break;
|
||||
// case KeyboardType.RIGHT_SELECTION:
|
||||
// case KeyboardType.BOTTOM_SELECTION:
|
||||
// // 底部键盘和右侧键盘
|
||||
// model.setScoreStepSize(widget.markingUserId, widget.questionNum, widget.defaultScoreInterval, scoreInterval); // 设置分值
|
||||
// model.sort = sortType;
|
||||
// break;
|
||||
// }
|
||||
// model.screenDirection = keyboardModel.screenDirection;
|
||||
// model.autoSubmitToNextQuestion = autoSubmitToNextQuestion;
|
||||
// ref.read(markingKeyboardProvider.notifier).toggleKeyboard(model);
|
||||
// Navigator.pop(context1, 'Cancle');
|
||||
// setTimeOut(300, () => widget.close(true));
|
||||
// })
|
||||
// ]);
|
||||
// });
|
||||
}
|
||||
|
||||
@override
|
||||
|
|
@ -191,9 +155,9 @@ class _MarkingSetingState extends ConsumerState<MarkingSeting> {
|
|||
// crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
getKeyboardBox(),
|
||||
getAutoNextQuestBox(),
|
||||
getScoreIntervalSetBox(),
|
||||
if (keyboardIndex != 0)
|
||||
if (keyboardIndex != KeyboardType.CLICK_TO_RATE_AND_REVIEW.index) getAutoNextQuestBox(), // 自动提交 点击打分不能自动提交
|
||||
getScoreIntervalSetBox(), // 分值间隔
|
||||
if (![0, KeyboardType.CLICK_TO_RATE_AND_REVIEW.index].contains(keyboardIndex))
|
||||
$CommonScoringList(
|
||||
score: widget.questTotalScore!,
|
||||
scoreInterval: scoreInterval,
|
||||
|
|
@ -208,6 +172,10 @@ class _MarkingSetingState extends ConsumerState<MarkingSeting> {
|
|||
},
|
||||
),
|
||||
getSetScoringRulesBox(),
|
||||
$ClickOnScoringMethod(keyboardTypes[keyboardIndex].model.keyboard, _clickOnScoringMethod, (ClickOnScoringMethod mode) {
|
||||
_clickOnScoringMethod = mode;
|
||||
toUpState(setState, () {}, mounted);
|
||||
}),
|
||||
],
|
||||
),
|
||||
),
|
||||
|
|
@ -323,7 +291,7 @@ class _MarkingSetingState extends ConsumerState<MarkingSeting> {
|
|||
|
||||
// 给分规则区域
|
||||
Widget getSetScoringRulesBox() {
|
||||
if (keyboardTypes[keyboardIndex].model.keyboard == KeyboardType.INPUT_TYPE) {
|
||||
if ([KeyboardType.INPUT_TYPE, KeyboardType.CLICK_TO_RATE_AND_REVIEW].contains(keyboardTypes[keyboardIndex].model.keyboard)) {
|
||||
return Container();
|
||||
}
|
||||
|
||||
|
|
@ -342,9 +310,7 @@ class _MarkingSetingState extends ConsumerState<MarkingSeting> {
|
|||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
Wrap(
|
||||
children: SortKeyboard.values
|
||||
.where((element) => element != SortKeyboard.FULL_AND_AERO_TOP_INVERTED_ORDER)
|
||||
.map((e) {
|
||||
children: SortKeyboard.values.where((element) => element != SortKeyboard.FULL_AND_AERO_TOP_INVERTED_ORDER).map((e) {
|
||||
String title;
|
||||
switch (e) {
|
||||
case SortKeyboard.INVERTED_ORDER:
|
||||
|
|
@ -399,7 +365,7 @@ class _MarkingSetingState extends ConsumerState<MarkingSeting> {
|
|||
|
||||
// 分值间隔设置
|
||||
Widget getScoreIntervalSetBox() {
|
||||
if (keyboardTypes[keyboardIndex].model.keyboard == KeyboardType.INPUT_TYPE) {
|
||||
if ([KeyboardType.INPUT_TYPE].contains(keyboardTypes[keyboardIndex].model.keyboard)) {
|
||||
return Container();
|
||||
}
|
||||
|
||||
|
|
@ -413,8 +379,7 @@ class _MarkingSetingState extends ConsumerState<MarkingSeting> {
|
|||
children: [
|
||||
InkWell(
|
||||
onTap: () {
|
||||
AchievementView(title: "分值间隔", subTitle: "设定当前题目的分数按钮的间隔分值", color: Theme.of(context).primaryColor)
|
||||
.show(context);
|
||||
AchievementView(title: "分值间隔", subTitle: "设定当前题目的分数按钮的间隔分值", color: Theme.of(context).primaryColor).show(context);
|
||||
},
|
||||
child: Row(
|
||||
children: [
|
||||
|
|
@ -507,8 +472,6 @@ class _MarkingSetingState extends ConsumerState<MarkingSeting> {
|
|||
),
|
||||
);
|
||||
}
|
||||
|
||||
void _showPopover(BuildContext context) {}
|
||||
}
|
||||
|
||||
class TheDoMarkingKeyboardModel {
|
||||
|
|
@ -527,6 +490,9 @@ class TheDoMarkingKeyboardModel {
|
|||
case KeyboardType.BOTTOM_SELECTION:
|
||||
title = '底部选择型键盘';
|
||||
break;
|
||||
case KeyboardType.CLICK_TO_RATE_AND_REVIEW:
|
||||
title = '点击打分';
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -551,8 +517,7 @@ Widget $commonScoringList(BuildContext context,
|
|||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Container(
|
||||
child:
|
||||
quickText('常用打分项', size: 14.sp, color: const Color.fromRGBO(45, 56, 76, 1), fontWeight: FontWeight.bold),
|
||||
child: quickText('常用打分项', size: 14.sp, color: const Color.fromRGBO(45, 56, 76, 1), fontWeight: FontWeight.bold),
|
||||
),
|
||||
SizedBox(height: 10.h),
|
||||
Expanded(
|
||||
|
|
@ -579,9 +544,7 @@ Widget $commonScoringList(BuildContext context,
|
|||
decoration: BoxDecoration(
|
||||
border: Border.all(
|
||||
width: 1.h,
|
||||
color: isSelected
|
||||
? Theme.of(context).primaryColor.withOpacity(0.5)
|
||||
: const Color.fromRGBO(224, 230, 255, 1),
|
||||
color: isSelected ? Theme.of(context).primaryColor.withOpacity(0.5) : const Color.fromRGBO(224, 230, 255, 1),
|
||||
),
|
||||
color: isSelected ? Colors.white : Colors.grey[300],
|
||||
borderRadius: BorderRadius.all(Radius.circular(2.w)),
|
||||
|
|
@ -600,3 +563,51 @@ Widget $commonScoringList(BuildContext context,
|
|||
),
|
||||
);
|
||||
}
|
||||
|
||||
// 点击打分打分方式
|
||||
@swidget
|
||||
Widget $clickOnScoringMethod(
|
||||
BuildContext context, KeyboardType keyboard, ClickOnScoringMethod? clickOnScoringMethod, Function(ClickOnScoringMethod) call) {
|
||||
if (keyboard != KeyboardType.CLICK_TO_RATE_AND_REVIEW) return SizedBox();
|
||||
|
||||
List<ClickOnScoringMethod> modes = ClickOnScoringMethod.values;
|
||||
return Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
SizedBox(height: 50.h),
|
||||
quickText(
|
||||
'计分方式',
|
||||
size: 14.sp,
|
||||
fontWeight: FontWeight.bold,
|
||||
color: const Color.fromRGBO(45, 56, 76, 1),
|
||||
),
|
||||
SizedBox(height: 12.h),
|
||||
Row(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: modes.map((e) {
|
||||
return InkWell(
|
||||
onTap: () => call(e),
|
||||
child: Container(
|
||||
margin: EdgeInsets.only(right: 20.w),
|
||||
padding: EdgeInsets.symmetric(horizontal: 4.w, vertical: 4.h),
|
||||
decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(4.r), boxShadow: [
|
||||
BoxShadow(
|
||||
color: Colors.black.withOpacity(0.2),
|
||||
offset: Offset(1, 1), // 阴影与容器的距离
|
||||
blurRadius: 6.r, // 高斯的标准偏差与盒子的形状卷积。
|
||||
spreadRadius: 1.r,
|
||||
),
|
||||
]),
|
||||
child: quickText(
|
||||
e.title,
|
||||
size: 14.sp,
|
||||
color: clickOnScoringMethod == e ? Theme.of(context).primaryColor : const Color.fromRGBO(80, 87, 103, 1),
|
||||
),
|
||||
),
|
||||
);
|
||||
}).toList(),
|
||||
)
|
||||
],
|
||||
);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -9,7 +9,6 @@
|
|||
|
||||
import 'dart:convert';
|
||||
import 'dart:io';
|
||||
import 'package:collection/collection.dart';
|
||||
import 'package:dio/dio.dart';
|
||||
|
||||
import 'package:dio/adapter.dart';
|
||||
|
|
@ -17,9 +16,7 @@ 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';
|
||||
|
|
@ -35,8 +32,6 @@ 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);
|
||||
|
||||
|
|
@ -60,9 +55,6 @@ 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;
|
||||
|
|
@ -89,7 +81,13 @@ 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();
|
||||
|
|
@ -105,60 +103,27 @@ 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 {
|
||||
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(() {});
|
||||
RestClient client = await getClientLogin();
|
||||
BaseStructureResult<dynamic> resultData = await client.showRegister();
|
||||
if (resultData.success) {
|
||||
setState(() {
|
||||
showRegister = resultData.data;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
void userNameListener() {
|
||||
String userName = _userNameController.text.trim();
|
||||
String userName = _userNameController.text;
|
||||
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);
|
||||
}
|
||||
|
|
@ -297,11 +262,9 @@ class _TheLoginState extends ConsumerState<TheLogin> with CommonMixin {
|
|||
labelStyle: TextStyle(fontSize: 16.sp, color: const Color.fromRGBO(148, 163, 182, 1)),
|
||||
),
|
||||
),
|
||||
$SchoolDataDropDown(schools, schoolId, (int? id) {
|
||||
schoolId = id;
|
||||
lastTimeSchoolId = null;
|
||||
}),
|
||||
SizedBox(height: 12.h),
|
||||
SizedBox(
|
||||
height: 12.h,
|
||||
),
|
||||
Row(
|
||||
children: [
|
||||
Container(
|
||||
|
|
@ -326,7 +289,13 @@ 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)
|
||||
|
|
@ -334,7 +303,10 @@ 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(
|
||||
|
|
@ -351,7 +323,9 @@ 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,
|
||||
|
|
@ -435,13 +409,14 @@ class _TheLoginState extends ConsumerState<TheLogin> with CommonMixin {
|
|||
void toLogin() async {
|
||||
if (!canLogin) return;
|
||||
|
||||
setState(() => canLogin = false);
|
||||
|
||||
void toMsg(msg) {
|
||||
Future.delayed(Duration.zero, () => ToastUtils.showError(msg));
|
||||
ToastUtils.showError(msg);
|
||||
setState(() => canLogin = true);
|
||||
}
|
||||
|
||||
try {
|
||||
setState(() => canLogin = false);
|
||||
FocusScope.of(context).requestFocus(_theFocus);
|
||||
if (!readAgreement) {
|
||||
var resFlag = await showDialog<bool>(
|
||||
|
|
@ -484,13 +459,12 @@ 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, schoolId!));
|
||||
BaseStructureResult<dynamic> resultData = await client.toLogin(UserLoginParams(userName, userPwdMd5));
|
||||
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 ?? '登录失败,请重试');
|
||||
|
|
@ -508,7 +482,7 @@ class _TheLoginState extends ConsumerState<TheLogin> with CommonMixin {
|
|||
fastData.setUser(userRes.data!).then((value) {
|
||||
// 记住密码
|
||||
if (keepPwd) {
|
||||
fastData.setUserPwdAndAccount({'pwd': userPwd, 'account': userName, 'schoolId': schoolId.toString()});
|
||||
fastData.setUserPwdAndAccount({'pwd': userPwd, 'account': userName});
|
||||
}
|
||||
// 更新
|
||||
ref.read(userProvider.notifier).initUserInfo();
|
||||
|
|
@ -551,41 +525,3 @@ 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(),
|
||||
),
|
||||
)
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@ import 'package:hooks_riverpod/hooks_riverpod.dart';
|
|||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
import 'package:marking_app/common/model/enum/review_marks_bottom_btns_enum.dart';
|
||||
import 'package:marking_app/common/model/event_bus/bottom_annotation_switch_cleanall.dart';
|
||||
import 'package:marking_app/common/model/marking/marking_text_question.dart';
|
||||
import 'package:marking_app/pages/common/event_bus_mixin.dart';
|
||||
import 'package:marking_app/utils/anti_shake_throttling.dart';
|
||||
import 'package:marking_app/utils/my_text.dart';
|
||||
|
|
@ -12,7 +13,9 @@ import '../provider/do_paper_bottom_review_marks_provider.dart';
|
|||
|
||||
// 底部批阅动作切换区域
|
||||
class DoPaperBottomReviewMarks extends StatefulHookConsumerWidget {
|
||||
const DoPaperBottomReviewMarks({super.key});
|
||||
final MarkingTextQuestion data;
|
||||
final Function(int) examStatusCall;
|
||||
const DoPaperBottomReviewMarks(this.data, this.examStatusCall, {super.key});
|
||||
|
||||
@override
|
||||
ConsumerState<DoPaperBottomReviewMarks> createState() => _DoPaperBottomReviewMarksState();
|
||||
|
|
@ -35,6 +38,9 @@ class _DoPaperBottomReviewMarksState extends ConsumerState<DoPaperBottomReviewMa
|
|||
Widget build(BuildContext context) {
|
||||
var btnEnum = ref.watch(doPaperBottomReviewMarksProvider);
|
||||
Color actionColor = Theme.of(context).primaryColor.withOpacity(0.9);
|
||||
var markingFlag = widget.data.markingFlag; // 试卷状态 默认null 1:优秀 2:错误卷
|
||||
|
||||
print('状态:$markingFlag');
|
||||
return Positioned(
|
||||
left: 3.w,
|
||||
bottom: 6.h,
|
||||
|
|
@ -80,41 +86,77 @@ class _DoPaperBottomReviewMarksState extends ConsumerState<DoPaperBottomReviewMa
|
|||
icon: Icon(Icons.reply_outlined,
|
||||
color: btnEnum == ReviewMarksBottomBtnsEnum.RETURN_PREVIOUS_LEVEL ? actionColor : Colors.white, size: 34.r),
|
||||
),
|
||||
SizedBox(width: 4.w),
|
||||
SizedBox(width: 10.w),
|
||||
// 批阅痕迹 ==> 清空
|
||||
IconButton(
|
||||
onPressed: () => easyThrottle(
|
||||
// IconButton(
|
||||
// onPressed: () => easyThrottle(
|
||||
// 'REVIEW_MARKS_BOTTOM_BTNS',
|
||||
// duration: const Duration(milliseconds: 100),
|
||||
// () async {
|
||||
// var resFlag = await showDialog<bool>(
|
||||
// context: context,
|
||||
// builder: (BuildContext context) {
|
||||
// return CupertinoAlertDialog(
|
||||
// title: quickText('撤销批阅痕迹', size: 14.sp, color: Color.fromARGB(255, 53, 52, 52)),
|
||||
// content: SingleChildScrollView(
|
||||
// padding: EdgeInsets.only(top: 4.h),
|
||||
// child: RichText(text: TextSpan(text: '请确认需要撤销所有批阅痕迹?', style: TextStyle(color: Color.fromARGB(255, 58, 58, 58)))),
|
||||
// ),
|
||||
// actions: <Widget>[
|
||||
// CupertinoDialogAction(
|
||||
// child: Text("取消", style: TextStyle(color: Color.fromARGB(255, 58, 58, 58))),
|
||||
// onPressed: () => Navigator.of(context).pop(false),
|
||||
// ),
|
||||
// CupertinoDialogAction(
|
||||
// child: Text("确定"),
|
||||
// onPressed: () => Navigator.of(context).pop(true),
|
||||
// ),
|
||||
// ],
|
||||
// );
|
||||
// },
|
||||
// );
|
||||
// if (resFlag == true) eventFire(model: BottomAnnotationSwitchCleanallOfMarking(cleanAll: true));
|
||||
// },
|
||||
// ),
|
||||
// padding: EdgeInsets.zero,
|
||||
// icon: Icon(Icons.reply_all_outlined, color: btnEnum == ReviewMarksBottomBtnsEnum.CLEAR_ALL ? actionColor : Colors.white, size: 34.r),
|
||||
// ),
|
||||
GestureDetector(
|
||||
onTap: () => easyThrottle(
|
||||
'REVIEW_MARKS_BOTTOM_BTNS',
|
||||
duration: const Duration(milliseconds: 100),
|
||||
() async {
|
||||
var resFlag = await showDialog<bool>(
|
||||
context: context,
|
||||
builder: (BuildContext context) {
|
||||
return CupertinoAlertDialog(
|
||||
title: quickText('撤销批阅痕迹', size: 14.sp, color: Color.fromARGB(255, 53, 52, 52)),
|
||||
content: SingleChildScrollView(
|
||||
padding: EdgeInsets.only(top: 4.h),
|
||||
child: RichText(text: TextSpan(text: '请确认需要撤销所有批阅痕迹?', style: TextStyle(color: Color.fromARGB(255, 58, 58, 58)))),
|
||||
),
|
||||
actions: <Widget>[
|
||||
CupertinoDialogAction(
|
||||
child: Text("取消", style: TextStyle(color: Color.fromARGB(255, 58, 58, 58))),
|
||||
onPressed: () => Navigator.of(context).pop(false),
|
||||
),
|
||||
CupertinoDialogAction(
|
||||
child: Text("确定"),
|
||||
onPressed: () => Navigator.of(context).pop(true),
|
||||
),
|
||||
],
|
||||
);
|
||||
},
|
||||
);
|
||||
if (resFlag == true) eventFire(model: BottomAnnotationSwitchCleanallOfMarking(cleanAll: true));
|
||||
},
|
||||
() async => widget.examStatusCall(1),
|
||||
),
|
||||
child: quickText(
|
||||
'优',
|
||||
size: 23.sp,
|
||||
fontWeight: FontWeight.bold,
|
||||
color: markingFlag == 1 ? Theme.of(context).primaryColor : Colors.white,
|
||||
),
|
||||
padding: EdgeInsets.zero,
|
||||
icon: Icon(Icons.reply_all_outlined, color: btnEnum == ReviewMarksBottomBtnsEnum.CLEAR_ALL ? actionColor : Colors.white, size: 34.r),
|
||||
),
|
||||
SizedBox(width: 5.w),
|
||||
GestureDetector(
|
||||
onTap: () => easyThrottle(
|
||||
'REVIEW_MARKS_BOTTOM_BTNS',
|
||||
duration: const Duration(milliseconds: 100),
|
||||
() async => widget.examStatusCall(2),
|
||||
),
|
||||
child: quickText(
|
||||
'错',
|
||||
size: 23.sp,
|
||||
fontWeight: FontWeight.bold,
|
||||
color: markingFlag == 2 ? Theme.of(context).primaryColor : Colors.white,
|
||||
),
|
||||
),
|
||||
// IconButton(
|
||||
// onPressed: () => easyThrottle(
|
||||
// 'REVIEW_MARKS_BOTTOM_BTNS',
|
||||
// duration: const Duration(milliseconds: 100),
|
||||
// () async {},
|
||||
// ),
|
||||
// padding: EdgeInsets.zero,
|
||||
// icon: Icon(Icons.reply_all_outlined, color: btnEnum == ReviewMarksBottomBtnsEnum.CLEAR_ALL ? actionColor : Colors.white, size: 34.r),
|
||||
// ),
|
||||
],
|
||||
),
|
||||
),
|
||||
|
|
|
|||
|
|
@ -31,9 +31,11 @@ import 'package:marking_app/common/model/enum/KeyboardType.dart';
|
|||
import 'package:marking_app/common/model/enum/marking_list_type.dart';
|
||||
import 'package:marking_app/common/model/enum/review_marks_bottom_btns_enum.dart';
|
||||
import 'package:marking_app/common/model/event_bus/bottom_annotation_switch_cleanall.dart';
|
||||
import 'package:marking_app/common/model/job/upload_file_interface_config_params.dart';
|
||||
import 'package:marking_app/common/model/marking/current_review_task.dart';
|
||||
import 'package:marking_app/common/model/marking/do_marking_keyboard_model.dart';
|
||||
import 'package:marking_app/common/model/marking/keyboard_assist_event.dart';
|
||||
import 'package:marking_app/common/model/marking/marking_exam_status_flag.dart';
|
||||
import 'package:marking_app/common/model/marking/marking_tag_single_params.dart';
|
||||
import 'package:marking_app/common/model/marking/marking_text_question.dart';
|
||||
import 'package:marking_app/common/model/marking/marking_text_question_params.dart';
|
||||
|
|
@ -312,6 +314,13 @@ class _MarkingPapersState extends ConsumerState<DoPapers>
|
|||
);
|
||||
}
|
||||
|
||||
Future<void> toMarkingFlag(int markingUserDetailId, int? markingFlag) async {
|
||||
// toMarkingFlag
|
||||
var _client = await getClient();
|
||||
var res = await _client.toMarkingFlag(MarkingExamStatusFlag(markingUserDetailId: markingUserDetailId, markingFlag: markingFlag));
|
||||
if (res.success) toUpState(setState, () => currentQuestion?.markingFlag = markingFlag, mounted);
|
||||
}
|
||||
|
||||
// 查看答案
|
||||
void viewAnswer() async {
|
||||
String? questionNum = currentQuestion?.questionNum;
|
||||
|
|
@ -1933,7 +1942,7 @@ class _MarkingPapersState extends ConsumerState<DoPapers>
|
|||
},
|
||||
),
|
||||
),
|
||||
|
||||
$ExamStatusBox(data), // 试卷状态
|
||||
// 大题评分展示框
|
||||
if (!hasSubtopic)
|
||||
Positioned(
|
||||
|
|
@ -1953,10 +1962,7 @@ class _MarkingPapersState extends ConsumerState<DoPapers>
|
|||
data.completeRating
|
||||
? getDoubleRemoveZero(data.score)
|
||||
: '请评分,满分${getDoubleRemoveZero(currentQuestion?.totalScore)}',
|
||||
style: TextStyle(
|
||||
fontSize: 18.sp,
|
||||
color: const Color.fromRGBO(46, 91, 255, 1),
|
||||
),
|
||||
style: TextStyle(fontSize: 18.sp, color: const Color.fromRGBO(46, 91, 255, 1)),
|
||||
),
|
||||
),
|
||||
),
|
||||
|
|
@ -2002,7 +2008,10 @@ class _MarkingPapersState extends ConsumerState<DoPapers>
|
|||
),
|
||||
),
|
||||
// 底部批阅痕迹按钮
|
||||
DoPaperBottomReviewMarks(),
|
||||
DoPaperBottomReviewMarks(data, (e) async {
|
||||
// 试卷状态切换
|
||||
await toMarkingFlag(data.id, data.markingFlag == e ? null : e);
|
||||
}),
|
||||
// 下一题 按钮
|
||||
if (!_theOldAnnotationGraffiti && pressedNextTest != null && isNormal)
|
||||
Positioned(
|
||||
|
|
@ -2756,3 +2765,74 @@ Widget $arbitrationQuestionInfo({required bool show, required bool isBroadwise,
|
|||
),
|
||||
);
|
||||
}
|
||||
|
||||
// 试卷状态 优秀卷 错误卷 默认卷
|
||||
@hwidget
|
||||
Widget $examStatusBox(MarkingTextQuestion? data) {
|
||||
ValueNotifier<int> markingFlag = useState(data?.markingFlag ?? 0);
|
||||
|
||||
useValueChanged<int?, void>(data?.markingFlag, (oldValue, oldResult) {
|
||||
markingFlag.value = data?.markingFlag ?? 0;
|
||||
});
|
||||
|
||||
if (data == null || data.markingFlag == null || markingFlag.value == 0) return Container();
|
||||
|
||||
var _strVal = markingFlag.value == 1 ? '优' : '错';
|
||||
return Positioned(
|
||||
top: 60.h,
|
||||
left: 4.w,
|
||||
child: CustomPaint(
|
||||
painter: CircleWithText(_strVal),
|
||||
size: Size(90.r, 90.r), // 设置你需要的尺寸
|
||||
),
|
||||
// Container(
|
||||
// padding: EdgeInsets.symmetric(horizontal: 6.w, vertical: 10.h),
|
||||
// decoration: BoxDecoration(
|
||||
// borderRadius: BorderRadius.circular(100.r),
|
||||
// border: Border.all(width: 10.r, color: Colors.red),
|
||||
// ),
|
||||
// child: quickText(markingFlag.value == 1 ? '优秀' : '错误'),
|
||||
// ),
|
||||
);
|
||||
}
|
||||
|
||||
class CircleWithText extends CustomPainter {
|
||||
final String textVal;
|
||||
const CircleWithText(this.textVal);
|
||||
@override
|
||||
void paint(Canvas canvas, Size size) {
|
||||
final paint = Paint()
|
||||
..style = PaintingStyle.stroke
|
||||
..strokeWidth = 5.r
|
||||
..color = Colors.red.withOpacity(0.8);
|
||||
|
||||
// 绘制红色圆圈边框
|
||||
final radius = size.width / 2; // 假设宽高相等,取宽度的一半作为半径
|
||||
canvas.drawCircle(Offset(size.width / 2, size.height / 2), radius, paint);
|
||||
|
||||
// 绘制“优”字
|
||||
final textSpan = TextSpan(text: textVal, style: TextStyle(color: Colors.red.withOpacity(0.8), fontWeight: FontWeight.bold, fontSize: 44.sp));
|
||||
|
||||
final textPainter =
|
||||
TextPainter(text: TextSpan(children: [textSpan]), textDirection: TextDirection.ltr, textAlign: TextAlign.center, textScaleFactor: 1.0);
|
||||
|
||||
// 只设置maxWidth,因为TextPainter.layout不需要maxHeight
|
||||
textPainter.layout(maxWidth: size.width);
|
||||
|
||||
// 计算文本绘制的偏移量,使其居中
|
||||
final offset = Offset(
|
||||
(size.width - textPainter.width) / 2,
|
||||
(size.height - textPainter.height) / 2,
|
||||
);
|
||||
|
||||
// 注意:这里textPainter.height可能不准确,因为TextPainter默认不会自动换行
|
||||
// 如果需要精确控制文本在圆中的位置,可能需要手动调整偏移量
|
||||
|
||||
textPainter.paint(canvas, offset);
|
||||
}
|
||||
|
||||
@override
|
||||
bool shouldRepaint(CustomPainter oldDelegate) {
|
||||
return oldDelegate != this;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -20,7 +20,8 @@ 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; // 密码
|
||||
//文本输入框控制器
|
||||
|
|
@ -32,7 +33,7 @@ class _RegisterState extends State<Register> with CommonMixin {
|
|||
bool canLogin = true;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
void initState(){
|
||||
super.initState();
|
||||
_userNameController = TextEditingController();
|
||||
_passwordController = TextEditingController();
|
||||
|
|
@ -49,7 +50,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) {
|
||||
|
|
@ -59,29 +60,25 @@ class _RegisterState extends State<Register> with CommonMixin {
|
|||
|
||||
FocusScope.of(context).requestFocus(_theFocus);
|
||||
|
||||
try {
|
||||
String userName = _userNameController.text.trim();
|
||||
String userPwd = _passwordController.text.trim();
|
||||
if (userName == '') return toMsg('请填写用户账号');
|
||||
if (userPwd == '') return toMsg('请填写密码');
|
||||
if (!readAgreement) return toMsg('请勾选我已阅读用户协议和隐私协议');
|
||||
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, 0));
|
||||
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));
|
||||
|
||||
if (resultData.code != 200) {
|
||||
return toMsg(resultData.message ?? '注册失败,请重试');
|
||||
}
|
||||
|
||||
ToastUtils.showSuccess('注册成功,请登录');
|
||||
// 跳转登录页
|
||||
RouterManager.router.navigateTo(context, RouterManager.loginPath);
|
||||
} finally {
|
||||
EasyLoading.dismiss();
|
||||
if (resultData.code != 200) {
|
||||
return toMsg(resultData.message ?? '注册失败,请重试');
|
||||
}
|
||||
EasyLoading.dismiss();
|
||||
ToastUtils.showSuccess('注册成功,请登录');
|
||||
// 跳转登录页
|
||||
RouterManager.router.navigateTo(context, RouterManager.loginPath);
|
||||
}
|
||||
|
||||
void _showPassword() {
|
||||
|
|
@ -235,8 +232,10 @@ 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;
|
||||
});
|
||||
|
|
@ -271,15 +270,18 @@ 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),
|
||||
),
|
||||
),
|
||||
],
|
||||
|
|
|
|||
|
|
@ -41,6 +41,7 @@ import 'package:marking_app/common/model/job/review_again_list_params.dart';
|
|||
import 'package:marking_app/common/model/job/upload_file_interface_config.dart';
|
||||
import 'package:marking_app/common/model/job/upload_file_interface_config_params.dart';
|
||||
import 'package:marking_app/common/model/marking/marking_abnormal_res.dart';
|
||||
import 'package:marking_app/common/model/marking/marking_exam_status_flag.dart';
|
||||
import 'package:marking_app/common/model/marking/marking_item.dart';
|
||||
import 'package:marking_app/common/model/marking/marking_list_params.dart';
|
||||
import 'package:marking_app/common/model/marking/marking_statistics.dart';
|
||||
|
|
@ -63,7 +64,6 @@ 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';
|
||||
|
||||
|
|
@ -82,10 +82,6 @@ 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();
|
||||
|
|
@ -199,6 +195,9 @@ abstract class RestClient {
|
|||
@the_retrofit.GET("/api/Upload")
|
||||
Future<BaseStructureResult<UploadFileInterfaceConfig>> getMarkingUploadFile(@the_retrofit.Queries() UploadFileInterfaceConfigParams params);
|
||||
|
||||
// 阅卷 => 上传图片请求参数
|
||||
@the_retrofit.PUT("/api/marking/flag")
|
||||
Future<BaseStructureResult> toMarkingFlag(@the_retrofit.Body() MarkingExamStatusFlag params);
|
||||
// ------------------------------------------ 作业 ------------------------------------------
|
||||
|
||||
// 作业 => 作业列表
|
||||
|
|
|
|||
|
|
@ -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.108+3
|
||||
version: 1.0.107+2
|
||||
|
||||
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
|
||||
|
|
|
|||
Loading…
Reference in New Issue