Compare commits

..

2 Commits

Author SHA1 Message Date
1147192855@qq.com 1104862e84 no message 2024-06-13 09:29:40 +08:00
1147192855@qq.com 6a3601df9b no message 2024-05-23 17:53:08 +08:00
17 changed files with 395 additions and 681 deletions

2
.gitignore vendored
View File

@ -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

View File

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

View File

@ -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";

View File

@ -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;
}

View File

@ -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,

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);
}
}

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;
@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);
}
}

View File

@ -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();
}

View File

@ -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(),
)
],
);
}

View File

@ -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(),
),
)
],
),
);
}

View File

@ -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),
// ),
],
),
),

View File

@ -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);
// maxWidthTextPainter.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;
}
}

View File

@ -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),
),
),
],

View File

@ -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);
// ------------------------------------------ ------------------------------------------
// =>

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.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