Merge pull request 'mcy_new' (#1) from mcy_new into master
Reviewed-on: #1
|
|
@ -3,20 +3,18 @@
|
||||||
*.log
|
*.log
|
||||||
*.pyc
|
*.pyc
|
||||||
*.swp
|
*.swp
|
||||||
.DS_Store
|
**/.DS_Store
|
||||||
.atom/
|
**/.atom/
|
||||||
.buildlog/
|
**/.buildlog/
|
||||||
.history
|
**/.history
|
||||||
.svn/
|
**/.svn/
|
||||||
migrate_working_dir/
|
**/migrate_working_dir/
|
||||||
|
|
||||||
# IntelliJ related
|
# IntelliJ related
|
||||||
*.iml
|
*.iml
|
||||||
*.ipr
|
*.ipr
|
||||||
*.iws
|
*.iws
|
||||||
.idea/
|
.idea/
|
||||||
|
|
||||||
# 编译文件不上传
|
|
||||||
*.g.dart
|
*.g.dart
|
||||||
|
|
||||||
# The .vscode folder contains launch configuration and tasks you configure in
|
# The .vscode folder contains launch configuration and tasks you configure in
|
||||||
|
|
@ -27,13 +25,13 @@ migrate_working_dir/
|
||||||
# Flutter/Dart/Pub related
|
# Flutter/Dart/Pub related
|
||||||
**/doc/api/
|
**/doc/api/
|
||||||
**/ios/Flutter/.last_build_id
|
**/ios/Flutter/.last_build_id
|
||||||
.dart_tool/
|
**/.dart_tool/
|
||||||
.flutter-plugins
|
**/.flutter-plugins
|
||||||
.flutter-plugins-dependencies
|
**/.flutter-plugins-dependencies
|
||||||
.packages
|
**/.pub-cache/
|
||||||
.pub-cache/
|
**/.pub/
|
||||||
.pub/
|
**/build/
|
||||||
/build/
|
**/lib/*.g.dart
|
||||||
|
|
||||||
# Symbolication related
|
# Symbolication related
|
||||||
app.*.symbols
|
app.*.symbols
|
||||||
|
|
@ -42,21 +40,18 @@ app.*.symbols
|
||||||
app.*.map.json
|
app.*.map.json
|
||||||
|
|
||||||
# Android Studio will place build artifacts here
|
# Android Studio will place build artifacts here
|
||||||
/android/app/debug
|
**/android/app/debug
|
||||||
/android/app/profile
|
**/android/app/profile
|
||||||
/android/app/release
|
**/android/app/release
|
||||||
/.fvm/flutter_sdk
|
making_school_asignment_app/*.g.dart
|
||||||
lib/common/api/retrofit_client.g.dart
|
making_school_asignment_app/pubspec.lock
|
||||||
lib/common/job/user_info.g.dart
|
making_school_asignment_app/lib/common/api/retrofit_client.g.dart
|
||||||
lib/common/job/user_info.g.dart
|
making_school_asignment_app/lib/page/home_page/children/read_over/read_over_view.g.dart
|
||||||
lib/common/job/user_login.g.dart
|
making_school_asignment_app/lib/page/home_page/children/read_over/read_over_view.g.dart
|
||||||
lib/common/job/common/upload_img_secret_key.g.dart
|
making_school_asignment_app/lib/page/home_page/children/read_over/read_over_view.g.dart
|
||||||
lib/common/job/common/base_structure_result.g.dart
|
making_school_asignment_app/lib/common/api/retrofit_client.g.dart
|
||||||
lib/common/job/common/base_page.g.dart
|
making_school_asignment_app/lib/page/home_page/children/read_over/read_over_view.g.dart
|
||||||
lib/common/job/common/base_page_report.g.dart
|
.vscode/settings.json
|
||||||
lib/common/job/common/base_page_data.g.dart
|
.vscode/launch.json
|
||||||
lib/common/job/common/base_page_data_report.g.dart
|
making_school_asignment_app/.fvm/fvm_config.json
|
||||||
/.fvm/flutter_sdk
|
making_school_asignment_app/.fvm/flutter_sdk
|
||||||
.fvm/fvm_config.json
|
|
||||||
pubspec.lock
|
|
||||||
pubspec.lock
|
|
||||||
|
|
|
||||||
33
.metadata
|
|
@ -1,33 +0,0 @@
|
||||||
# This file tracks properties of this Flutter project.
|
|
||||||
# Used by Flutter tool to assess capabilities and perform upgrades etc.
|
|
||||||
#
|
|
||||||
# This file should be version controlled.
|
|
||||||
|
|
||||||
version:
|
|
||||||
revision: d3d8effc686d73e0114d71abdcccef63fa1f25d2
|
|
||||||
channel: stable
|
|
||||||
|
|
||||||
project_type: app
|
|
||||||
|
|
||||||
# Tracks metadata for the flutter migrate command
|
|
||||||
migration:
|
|
||||||
platforms:
|
|
||||||
- platform: root
|
|
||||||
create_revision: d3d8effc686d73e0114d71abdcccef63fa1f25d2
|
|
||||||
base_revision: d3d8effc686d73e0114d71abdcccef63fa1f25d2
|
|
||||||
- platform: android
|
|
||||||
create_revision: d3d8effc686d73e0114d71abdcccef63fa1f25d2
|
|
||||||
base_revision: d3d8effc686d73e0114d71abdcccef63fa1f25d2
|
|
||||||
- platform: ios
|
|
||||||
create_revision: d3d8effc686d73e0114d71abdcccef63fa1f25d2
|
|
||||||
base_revision: d3d8effc686d73e0114d71abdcccef63fa1f25d2
|
|
||||||
|
|
||||||
# User provided section
|
|
||||||
|
|
||||||
# List of Local paths (relative to this file) that should be
|
|
||||||
# ignored by the migrate tool.
|
|
||||||
#
|
|
||||||
# Files that are not part of the templates will be ignored by default.
|
|
||||||
unmanaged_files:
|
|
||||||
- 'lib/main.dart'
|
|
||||||
- 'ios/Runner.xcodeproj/project.pbxproj'
|
|
||||||
|
|
@ -1,73 +0,0 @@
|
||||||
def localProperties = new Properties()
|
|
||||||
def localPropertiesFile = rootProject.file('local.properties')
|
|
||||||
if (localPropertiesFile.exists()) {
|
|
||||||
localPropertiesFile.withReader('UTF-8') { reader ->
|
|
||||||
localProperties.load(reader)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
def flutterRoot = localProperties.getProperty('flutter.sdk')
|
|
||||||
if (flutterRoot == null) {
|
|
||||||
throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
|
|
||||||
}
|
|
||||||
|
|
||||||
def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
|
|
||||||
if (flutterVersionCode == null) {
|
|
||||||
flutterVersionCode = '1'
|
|
||||||
}
|
|
||||||
|
|
||||||
def flutterVersionName = localProperties.getProperty('flutter.versionName')
|
|
||||||
if (flutterVersionName == null) {
|
|
||||||
flutterVersionName = '1.0'
|
|
||||||
}
|
|
||||||
|
|
||||||
apply plugin: 'com.android.application'
|
|
||||||
apply plugin: 'kotlin-android'
|
|
||||||
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
|
|
||||||
|
|
||||||
android {
|
|
||||||
namespace "com.example.school_asignment_app"
|
|
||||||
compileSdkVersion flutter.compileSdkVersion
|
|
||||||
ndkVersion flutter.ndkVersion
|
|
||||||
|
|
||||||
compileOptions {
|
|
||||||
sourceCompatibility JavaVersion.VERSION_1_8
|
|
||||||
targetCompatibility JavaVersion.VERSION_1_8
|
|
||||||
}
|
|
||||||
|
|
||||||
kotlinOptions {
|
|
||||||
jvmTarget = '1.8'
|
|
||||||
}
|
|
||||||
|
|
||||||
sourceSets {
|
|
||||||
main.java.srcDirs += 'src/main/kotlin'
|
|
||||||
}
|
|
||||||
|
|
||||||
defaultConfig {
|
|
||||||
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
|
|
||||||
applicationId "com.example.school_asignment_app"
|
|
||||||
// You can update the following values to match your application needs.
|
|
||||||
// For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
|
|
||||||
// minSdkVersion flutter.minSdkVersion
|
|
||||||
minSdkVersion 21
|
|
||||||
targetSdkVersion flutter.targetSdkVersion
|
|
||||||
versionCode flutterVersionCode.toInteger()
|
|
||||||
versionName flutterVersionName
|
|
||||||
}
|
|
||||||
|
|
||||||
buildTypes {
|
|
||||||
release {
|
|
||||||
// TODO: Add your own signing config for the release build.
|
|
||||||
// Signing with the debug keys for now, so `flutter run --release` works.
|
|
||||||
signingConfig signingConfigs.debug
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
flutter {
|
|
||||||
source '../..'
|
|
||||||
}
|
|
||||||
|
|
||||||
dependencies {
|
|
||||||
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
|
|
||||||
}
|
|
||||||
|
|
@ -1,33 +0,0 @@
|
||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
|
||||||
<application
|
|
||||||
android:label="school_asignment_app"
|
|
||||||
android:name="${applicationName}"
|
|
||||||
android:icon="@mipmap/ic_launcher">
|
|
||||||
<activity
|
|
||||||
android:name=".MainActivity"
|
|
||||||
android:exported="true"
|
|
||||||
android:launchMode="singleTop"
|
|
||||||
android:theme="@style/LaunchTheme"
|
|
||||||
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
|
|
||||||
android:hardwareAccelerated="true"
|
|
||||||
android:windowSoftInputMode="adjustResize">
|
|
||||||
<!-- Specifies an Android theme to apply to this Activity as soon as
|
|
||||||
the Android process has started. This theme is visible to the user
|
|
||||||
while the Flutter UI initializes. After that, this theme continues
|
|
||||||
to determine the Window background behind the Flutter UI. -->
|
|
||||||
<meta-data
|
|
||||||
android:name="io.flutter.embedding.android.NormalTheme"
|
|
||||||
android:resource="@style/NormalTheme"
|
|
||||||
/>
|
|
||||||
<intent-filter>
|
|
||||||
<action android:name="android.intent.action.MAIN"/>
|
|
||||||
<category android:name="android.intent.category.LAUNCHER"/>
|
|
||||||
</intent-filter>
|
|
||||||
</activity>
|
|
||||||
<!-- Don't delete the meta-data below.
|
|
||||||
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
|
|
||||||
<meta-data
|
|
||||||
android:name="flutterEmbedding"
|
|
||||||
android:value="2" />
|
|
||||||
</application>
|
|
||||||
</manifest>
|
|
||||||
|
|
@ -1,6 +0,0 @@
|
||||||
package com.example.school_asignment_app
|
|
||||||
|
|
||||||
import io.flutter.embedding.android.FlutterActivity
|
|
||||||
|
|
||||||
class MainActivity: FlutterActivity() {
|
|
||||||
}
|
|
||||||
|
|
@ -1,12 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<!-- Modify this file to customize your launch splash screen -->
|
|
||||||
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
|
|
||||||
<item android:drawable="?android:colorBackground" />
|
|
||||||
|
|
||||||
<!-- You can insert your own image assets here -->
|
|
||||||
<!-- <item>
|
|
||||||
<bitmap
|
|
||||||
android:gravity="center"
|
|
||||||
android:src="@mipmap/launch_image" />
|
|
||||||
</item> -->
|
|
||||||
</layer-list>
|
|
||||||
|
|
@ -1,12 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<!-- Modify this file to customize your launch splash screen -->
|
|
||||||
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
|
|
||||||
<item android:drawable="@android:color/white" />
|
|
||||||
|
|
||||||
<!-- You can insert your own image assets here -->
|
|
||||||
<!-- <item>
|
|
||||||
<bitmap
|
|
||||||
android:gravity="center"
|
|
||||||
android:src="@mipmap/launch_image" />
|
|
||||||
</item> -->
|
|
||||||
</layer-list>
|
|
||||||
|
Before Width: | Height: | Size: 544 B |
|
Before Width: | Height: | Size: 442 B |
|
Before Width: | Height: | Size: 721 B |
|
Before Width: | Height: | Size: 1.0 KiB |
|
Before Width: | Height: | Size: 1.4 KiB |
|
|
@ -1,7 +0,0 @@
|
||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
|
||||||
<!-- The INTERNET permission is required for development. Specifically,
|
|
||||||
the Flutter tool needs it to communicate with the running application
|
|
||||||
to allow setting breakpoints, to provide hot reload, etc.
|
|
||||||
-->
|
|
||||||
<uses-permission android:name="android.permission.INTERNET"/>
|
|
||||||
</manifest>
|
|
||||||
|
|
@ -1,31 +0,0 @@
|
||||||
buildscript {
|
|
||||||
ext.kotlin_version = '1.7.10'
|
|
||||||
repositories {
|
|
||||||
google()
|
|
||||||
mavenCentral()
|
|
||||||
}
|
|
||||||
|
|
||||||
dependencies {
|
|
||||||
classpath 'com.android.tools.build:gradle:7.3.0'
|
|
||||||
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
allprojects {
|
|
||||||
repositories {
|
|
||||||
google()
|
|
||||||
mavenCentral()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
rootProject.buildDir = '../build'
|
|
||||||
subprojects {
|
|
||||||
project.buildDir = "${rootProject.buildDir}/${project.name}"
|
|
||||||
}
|
|
||||||
subprojects {
|
|
||||||
project.evaluationDependsOn(':app')
|
|
||||||
}
|
|
||||||
|
|
||||||
tasks.register("clean", Delete) {
|
|
||||||
delete rootProject.buildDir
|
|
||||||
}
|
|
||||||
|
|
@ -1,3 +0,0 @@
|
||||||
org.gradle.jvmargs=-Xmx1536M
|
|
||||||
android.useAndroidX=true
|
|
||||||
android.enableJetifier=true
|
|
||||||
|
|
@ -1,11 +0,0 @@
|
||||||
include ':app'
|
|
||||||
|
|
||||||
def localPropertiesFile = new File(rootProject.projectDir, "local.properties")
|
|
||||||
def properties = new Properties()
|
|
||||||
|
|
||||||
assert localPropertiesFile.exists()
|
|
||||||
localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) }
|
|
||||||
|
|
||||||
def flutterSdkPath = properties.getProperty("flutter.sdk")
|
|
||||||
assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
|
|
||||||
apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle"
|
|
||||||
|
Before Width: | Height: | Size: 886 B |
|
Before Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 857 B |
|
Before Width: | Height: | Size: 2.7 KiB |
|
Before Width: | Height: | Size: 105 KiB |
|
Before Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 112 KiB |
|
Before Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 3.2 KiB |
|
Before Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 3.2 KiB |
|
Before Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 5.0 KiB |
|
Before Width: | Height: | Size: 200 KiB |
|
Before Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 177 KiB |
|
Before Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 4.8 KiB |
|
Before Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 4.9 KiB |
|
Before Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 7.9 KiB |
|
Before Width: | Height: | Size: 296 KiB |
|
Before Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 140 KiB |
|
Before Width: | Height: | Size: 790 B |
|
Before Width: | Height: | Size: 546 B |
|
Before Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 942 B |
|
Before Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 303 B |
|
Before Width: | Height: | Size: 326 B |
|
Before Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 544 B |
|
Before Width: | Height: | Size: 292 KiB |
|
Before Width: | Height: | Size: 40 KiB |
|
Before Width: | Height: | Size: 468 B |
|
Before Width: | Height: | Size: 833 B |
|
Before Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 1.2 KiB |
|
|
@ -1 +0,0 @@
|
||||||
#include "Generated.xcconfig"
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
#include "Generated.xcconfig"
|
|
||||||
|
|
@ -1,122 +0,0 @@
|
||||||
{
|
|
||||||
"images" : [
|
|
||||||
{
|
|
||||||
"size" : "20x20",
|
|
||||||
"idiom" : "iphone",
|
|
||||||
"filename" : "Icon-App-20x20@2x.png",
|
|
||||||
"scale" : "2x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"size" : "20x20",
|
|
||||||
"idiom" : "iphone",
|
|
||||||
"filename" : "Icon-App-20x20@3x.png",
|
|
||||||
"scale" : "3x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"size" : "29x29",
|
|
||||||
"idiom" : "iphone",
|
|
||||||
"filename" : "Icon-App-29x29@1x.png",
|
|
||||||
"scale" : "1x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"size" : "29x29",
|
|
||||||
"idiom" : "iphone",
|
|
||||||
"filename" : "Icon-App-29x29@2x.png",
|
|
||||||
"scale" : "2x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"size" : "29x29",
|
|
||||||
"idiom" : "iphone",
|
|
||||||
"filename" : "Icon-App-29x29@3x.png",
|
|
||||||
"scale" : "3x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"size" : "40x40",
|
|
||||||
"idiom" : "iphone",
|
|
||||||
"filename" : "Icon-App-40x40@2x.png",
|
|
||||||
"scale" : "2x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"size" : "40x40",
|
|
||||||
"idiom" : "iphone",
|
|
||||||
"filename" : "Icon-App-40x40@3x.png",
|
|
||||||
"scale" : "3x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"size" : "60x60",
|
|
||||||
"idiom" : "iphone",
|
|
||||||
"filename" : "Icon-App-60x60@2x.png",
|
|
||||||
"scale" : "2x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"size" : "60x60",
|
|
||||||
"idiom" : "iphone",
|
|
||||||
"filename" : "Icon-App-60x60@3x.png",
|
|
||||||
"scale" : "3x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"size" : "20x20",
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"filename" : "Icon-App-20x20@1x.png",
|
|
||||||
"scale" : "1x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"size" : "20x20",
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"filename" : "Icon-App-20x20@2x.png",
|
|
||||||
"scale" : "2x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"size" : "29x29",
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"filename" : "Icon-App-29x29@1x.png",
|
|
||||||
"scale" : "1x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"size" : "29x29",
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"filename" : "Icon-App-29x29@2x.png",
|
|
||||||
"scale" : "2x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"size" : "40x40",
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"filename" : "Icon-App-40x40@1x.png",
|
|
||||||
"scale" : "1x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"size" : "40x40",
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"filename" : "Icon-App-40x40@2x.png",
|
|
||||||
"scale" : "2x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"size" : "76x76",
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"filename" : "Icon-App-76x76@1x.png",
|
|
||||||
"scale" : "1x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"size" : "76x76",
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"filename" : "Icon-App-76x76@2x.png",
|
|
||||||
"scale" : "2x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"size" : "83.5x83.5",
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"filename" : "Icon-App-83.5x83.5@2x.png",
|
|
||||||
"scale" : "2x"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"size" : "1024x1024",
|
|
||||||
"idiom" : "ios-marketing",
|
|
||||||
"filename" : "Icon-App-1024x1024@1x.png",
|
|
||||||
"scale" : "1x"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"info" : {
|
|
||||||
"version" : 1,
|
|
||||||
"author" : "xcode"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
Before Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 295 B |
|
Before Width: | Height: | Size: 406 B |
|
Before Width: | Height: | Size: 450 B |
|
Before Width: | Height: | Size: 282 B |
|
Before Width: | Height: | Size: 462 B |
|
Before Width: | Height: | Size: 704 B |
|
Before Width: | Height: | Size: 406 B |
|
Before Width: | Height: | Size: 586 B |
|
Before Width: | Height: | Size: 862 B |
|
Before Width: | Height: | Size: 862 B |
|
Before Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 762 B |
|
Before Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 68 B |
|
Before Width: | Height: | Size: 68 B |
|
Before Width: | Height: | Size: 68 B |
|
|
@ -1,5 +0,0 @@
|
||||||
# Launch Screen Assets
|
|
||||||
|
|
||||||
You can customize the launch screen with your own desired assets by replacing the image files in this directory.
|
|
||||||
|
|
||||||
You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images.
|
|
||||||
|
|
@ -1,51 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
||||||
<plist version="1.0">
|
|
||||||
<dict>
|
|
||||||
<key>CFBundleDevelopmentRegion</key>
|
|
||||||
<string>$(DEVELOPMENT_LANGUAGE)</string>
|
|
||||||
<key>CFBundleDisplayName</key>
|
|
||||||
<string>School Asignment App</string>
|
|
||||||
<key>CFBundleExecutable</key>
|
|
||||||
<string>$(EXECUTABLE_NAME)</string>
|
|
||||||
<key>CFBundleIdentifier</key>
|
|
||||||
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
|
|
||||||
<key>CFBundleInfoDictionaryVersion</key>
|
|
||||||
<string>6.0</string>
|
|
||||||
<key>CFBundleName</key>
|
|
||||||
<string>school_asignment_app</string>
|
|
||||||
<key>CFBundlePackageType</key>
|
|
||||||
<string>APPL</string>
|
|
||||||
<key>CFBundleShortVersionString</key>
|
|
||||||
<string>$(FLUTTER_BUILD_NAME)</string>
|
|
||||||
<key>CFBundleSignature</key>
|
|
||||||
<string>????</string>
|
|
||||||
<key>CFBundleVersion</key>
|
|
||||||
<string>$(FLUTTER_BUILD_NUMBER)</string>
|
|
||||||
<key>LSRequiresIPhoneOS</key>
|
|
||||||
<true/>
|
|
||||||
<key>UILaunchStoryboardName</key>
|
|
||||||
<string>LaunchScreen</string>
|
|
||||||
<key>UIMainStoryboardFile</key>
|
|
||||||
<string>Main</string>
|
|
||||||
<key>UISupportedInterfaceOrientations</key>
|
|
||||||
<array>
|
|
||||||
<string>UIInterfaceOrientationPortrait</string>
|
|
||||||
<string>UIInterfaceOrientationLandscapeLeft</string>
|
|
||||||
<string>UIInterfaceOrientationLandscapeRight</string>
|
|
||||||
</array>
|
|
||||||
<key>UISupportedInterfaceOrientations~ipad</key>
|
|
||||||
<array>
|
|
||||||
<string>UIInterfaceOrientationPortrait</string>
|
|
||||||
<string>UIInterfaceOrientationPortraitUpsideDown</string>
|
|
||||||
<string>UIInterfaceOrientationLandscapeLeft</string>
|
|
||||||
<string>UIInterfaceOrientationLandscapeRight</string>
|
|
||||||
</array>
|
|
||||||
<key>UIViewControllerBasedStatusBarAppearance</key>
|
|
||||||
<false/>
|
|
||||||
<key>CADisableMinimumFrameDurationOnPhone</key>
|
|
||||||
<true/>
|
|
||||||
<key>UIApplicationSupportsIndirectInputEvents</key>
|
|
||||||
<true/>
|
|
||||||
</dict>
|
|
||||||
</plist>
|
|
||||||
|
|
@ -1,101 +0,0 @@
|
||||||
import 'package:dio/dio.dart' hide Headers;
|
|
||||||
import 'package:retrofit/retrofit.dart';
|
|
||||||
import 'package:school_asignment_app/common/job/annotated_class.dart';
|
|
||||||
import 'package:school_asignment_app/common/job/class_item.dart';
|
|
||||||
import 'package:school_asignment_app/common/job/common/app_version_model.dart';
|
|
||||||
import 'package:school_asignment_app/common/job/common/base_app_version.dart';
|
|
||||||
import 'package:school_asignment_app/common/job/common/base_page_data.dart';
|
|
||||||
import 'package:school_asignment_app/common/job/enum_subject.dart';
|
|
||||||
import 'package:school_asignment_app/common/job/homework_details.dart';
|
|
||||||
import 'package:school_asignment_app/common/job/knowledge_points_grasp.dart';
|
|
||||||
import 'package:school_asignment_app/common/job/knowledge_report_detail.dart';
|
|
||||||
import 'package:school_asignment_app/common/job/student_history.dart';
|
|
||||||
import 'package:school_asignment_app/common/job/student_history_params.dart';
|
|
||||||
import 'package:school_asignment_app/common/job/student_item.dart';
|
|
||||||
import 'package:school_asignment_app/common/job/student_personal_info.dart';
|
|
||||||
import 'package:school_asignment_app/common/job/user_info_detail.dart';
|
|
||||||
import 'package:school_asignment_app/common/job/work_student.dart';
|
|
||||||
import 'package:school_asignment_app/common/job/work_student_params.dart';
|
|
||||||
|
|
||||||
part 'retrofit_client.g.dart';
|
|
||||||
|
|
||||||
@RestApi(parser: Parser.JsonSerializable)
|
|
||||||
@Headers(<String, dynamic>{"Content-Type": "application/json"})
|
|
||||||
abstract class RetrofitClient {
|
|
||||||
factory RetrofitClient(Dio dio, {String? baseUrl}) = _RetrofitClient;
|
|
||||||
|
|
||||||
/* start 系统系列接口 */
|
|
||||||
@POST("/api/infra/AppVersion/GetList")
|
|
||||||
Future<BasePageData<AppVersionModel>?> getAppVersions(@Body() BaseAppVersion appVersion);
|
|
||||||
|
|
||||||
/* start 系统系列接口 */
|
|
||||||
|
|
||||||
@POST("/api/rbac/Auth/DcLogin")
|
|
||||||
Future toLogin(@Field() String account, @Field() String password);
|
|
||||||
|
|
||||||
@GET("/api/rbac/User/GetUser")
|
|
||||||
Future<UserInfoDetail?> getUser(@Query('userId') String userId);
|
|
||||||
|
|
||||||
//未批阅,已批阅列表
|
|
||||||
@GET("/api/hms/Homework/GetList")
|
|
||||||
Future<WorkStudent> getWorkList(@Queries() WorkStudentParams params);
|
|
||||||
|
|
||||||
//获取科目,年级
|
|
||||||
@GET("/api/app/Common/GetEnumInfos")
|
|
||||||
Future<Map<String, List<EnumSubject>>> getEnumSubjectList(@Query('enumNames') List enumNames);
|
|
||||||
|
|
||||||
//学生班级
|
|
||||||
@GET("/api/rbac/SchoolUser/GetTeacherClassSubject")
|
|
||||||
Future<List<ClassItem>> getStudentClass();
|
|
||||||
|
|
||||||
//获取优先批阅状态学生列表
|
|
||||||
@GET("/api/rbac/Student/GetPriorityAnnotateStudents")
|
|
||||||
Future<List<StudentItem>> getStudentList(@Query('ClassId') String classId,@Query('Subject') int subject );
|
|
||||||
|
|
||||||
//待批阅列表
|
|
||||||
@GET("/api/hms/Annotate/GetUnAnnotateList")
|
|
||||||
Future<WorkStudent> getUnAnnotateList(@Queries() WorkStudentParams params);
|
|
||||||
|
|
||||||
//已批阅列表
|
|
||||||
@GET("/api/hms/Annotate/GetAnnotatedList")
|
|
||||||
Future<WorkStudent> getAnnotatedList(@Queries() WorkStudentParams params);
|
|
||||||
|
|
||||||
//获取批阅班级
|
|
||||||
@GET("/api/hms/Annotate/Get")
|
|
||||||
Future<List<AnnotatedClass>> getAnnotatedClassList(@Query('homeworkId') String homeworkId);
|
|
||||||
|
|
||||||
//作业明细
|
|
||||||
@GET("/api/hms/HmsReport/GetHomeworkDtls")
|
|
||||||
Future<HomeworkDetails> getHomeworkDetails(@Query('homeworkId') String homeworkId,@Query('classId') String classId);
|
|
||||||
|
|
||||||
//学生历史作业
|
|
||||||
@GET("/api/hms/HmsReport/GetStudentHistory")
|
|
||||||
Future<StudentHistory> getStudentHistory(@Queries() StudentHistoryParams params);
|
|
||||||
|
|
||||||
//修改学生优先批阅状态
|
|
||||||
@POST("/api/rbac/Student/PriorityAnnotateStudent")
|
|
||||||
Future getAnnotateStudent(@Field() String classId, @Field() int studentId,@Field() bool priorityAnnotate,@Field() int subject);
|
|
||||||
|
|
||||||
//学生作业信息
|
|
||||||
@GET("/api/hms/HmsReport/GetStudentHomework")
|
|
||||||
Future<StudentPersonalInfo> getStudentHomework(@Query('HomeworkId') String homeworkId,@Query('StudentId') int studentId);
|
|
||||||
|
|
||||||
//知识点掌握
|
|
||||||
@GET("/api/hms/HmsReport/GetKnowledgeReport")
|
|
||||||
Future<List<KnowledgePointsGrasp>> getKnowledgeReport(@Query('DateStart') String dateStart,@Query('DateEnd') String dateEnd,@Query('KnowledgeName') String knowledgeName);
|
|
||||||
|
|
||||||
//知识点掌握详情
|
|
||||||
@GET("/api/hms/HmsReport/GetKnowledgeReportDetail")
|
|
||||||
Future<List<KnowledgeReportDetail>> getKnowledgeReportDetail(@Query('DateStart') String dateStart,@Query('DateEnd') String dateEnd,@Query('KnowledgeId') int knowledgeId);
|
|
||||||
|
|
||||||
//学生
|
|
||||||
@GET("/api/hms/HmsReport/GetQuestionStudentState")
|
|
||||||
Future<List<Students>> getQuestionStudentState(@Query('HomeworkId') String homeworkId,@Query('TemplateId') int templateId,@Query('QuestionNo') int questionNo);
|
|
||||||
|
|
||||||
|
|
||||||
//收集订正
|
|
||||||
@POST("/api/hms/Homework/Collect")
|
|
||||||
Future getCollect(@Field() String homeworkId);
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -1,6 +0,0 @@
|
||||||
import 'package:school_asignment_app/common/request/rest_dio.dart';
|
|
||||||
import 'package:school_asignment_app/common/api/retrofit_client.dart';
|
|
||||||
|
|
||||||
mixin RequestToolMixin {
|
|
||||||
RetrofitClient getClient() => RequestTool.instance.getClient();
|
|
||||||
}
|
|
||||||
|
|
@ -1,205 +0,0 @@
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
|
||||||
import 'package:get/get.dart';
|
|
||||||
import 'package:school_asignment_app/common/job/homework_details.dart';
|
|
||||||
import 'package:school_asignment_app/page/home_page/children/quick_data_check/quick_data_check_state.dart';
|
|
||||||
|
|
||||||
class Utils{
|
|
||||||
Utils._internal();
|
|
||||||
|
|
||||||
/// 关闭键盘
|
|
||||||
static void hideKeyboard() {
|
|
||||||
FocusScopeNode? currentFocus = Get.focusScope?.nearestScope;
|
|
||||||
if (currentFocus == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (!currentFocus.hasPrimaryFocus && currentFocus.focusedChild != null) {
|
|
||||||
FocusManager.instance.primaryFocus?.unfocus();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 是否是平板
|
|
||||||
static bool isPad([double mobilePhoneScale = 1.2]) {
|
|
||||||
return ScreenUtil().scaleWidth > mobilePhoneScale;
|
|
||||||
}
|
|
||||||
|
|
||||||
static String getDoubleRemoveZero(double? val, [String? defaultVal]) {
|
|
||||||
try {
|
|
||||||
if (val == null) throw Exception('数据为空');
|
|
||||||
List<String> _valArr = val.toString().split('.');
|
|
||||||
if (_valArr.length >= 2) {
|
|
||||||
if (int.parse(_valArr[1]) == 0) {
|
|
||||||
return val.toInt().toString();
|
|
||||||
}
|
|
||||||
return val.toString();
|
|
||||||
}
|
|
||||||
return val.toInt().toString();
|
|
||||||
} catch (e) {
|
|
||||||
return defaultVal ?? '';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// 去除小数点
|
|
||||||
static String doubleToStringAsFixed(double val, {int fractionDigits = 2}) {
|
|
||||||
return val.toStringAsFixed(fractionDigits).replaceAll(RegExp(r'\.0*$'), '');
|
|
||||||
}
|
|
||||||
|
|
||||||
static calcRate (int divisor, int dividend) {
|
|
||||||
if(dividend != 0){
|
|
||||||
return ((100 * divisor) / dividend);
|
|
||||||
// return ((100 * divisor) / dividend).toStringAsFixed(0);
|
|
||||||
}else{
|
|
||||||
return 0.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/// 秒转时分秒
|
|
||||||
static String second2HMS(int sec, {bool isEasy = false}) {
|
|
||||||
String hms = "0";
|
|
||||||
if (!isEasy) hms = "0秒";
|
|
||||||
if (sec > 0) {
|
|
||||||
int h = sec ~/ 3600;
|
|
||||||
int m = (sec % 3600) ~/ 60;
|
|
||||||
int s = sec % 60;
|
|
||||||
if(h>0){
|
|
||||||
hms = "$h时$m分$s秒";
|
|
||||||
}else{
|
|
||||||
if(m>0){
|
|
||||||
hms = "$m分$s秒";
|
|
||||||
}else{
|
|
||||||
hms = "$s秒";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return hms;
|
|
||||||
}
|
|
||||||
|
|
||||||
static getHomeworkData(HomeworkDetails data){
|
|
||||||
|
|
||||||
CountData dataCount = CountData();
|
|
||||||
List<Dtls> kgt = data.dtls.where((w) => w.questionType == 1).toList();
|
|
||||||
dataCount.kgtAnswerCount = kgt.where((w) => w.state != 0).length;
|
|
||||||
dataCount.kgtOkCount = kgt.where((w) => w.state == 3).length;
|
|
||||||
dataCount.kgtDtlCount = kgt.length;
|
|
||||||
dataCount.kgtAnswerRate = Utils.calcRate(dataCount.kgtAnswerCount!, dataCount.kgtDtlCount!);
|
|
||||||
dataCount.kgtOkRate = Utils.calcRate(dataCount.kgtOkCount!, dataCount.kgtDtlCount!);
|
|
||||||
dataCount.kgtCount = data.questions.where((w) => w.questionType == 1).length;
|
|
||||||
|
|
||||||
List<Dtls> zgt = data.dtls.where((w) => w.questionType == 2).toList();
|
|
||||||
dataCount.zgtAnswerCount = zgt.where((w) => w.state != 0).length;
|
|
||||||
dataCount.zgtOkCount = zgt.where((w) => w.state == 3).length;
|
|
||||||
dataCount.zgtDtlCount = zgt.length;
|
|
||||||
dataCount.zgtAnswerRate = Utils.calcRate(dataCount.zgtAnswerCount!, dataCount.zgtDtlCount!);
|
|
||||||
dataCount.zgtOkRate = Utils.calcRate(dataCount.zgtOkCount!, dataCount.zgtDtlCount!);
|
|
||||||
dataCount.zgtCount = data.questions.where((w) => w.questionType == 2).length;
|
|
||||||
dataCount.studentCount = data.students.length;
|
|
||||||
dataCount.priorityStudents = data.students.where((w) => w.priorityAnnotate!).toList();
|
|
||||||
|
|
||||||
|
|
||||||
for(var que in data.questions){
|
|
||||||
List<Dtls> ques = data.dtls.where((w) => w.templateId == que.templateId && w.questionNo == que.questionNo).toList();
|
|
||||||
que.answerCount = ques.where((w) => w.state != 0).length;
|
|
||||||
que.answerRate = Utils.calcRate(que.answerCount!, dataCount.studentCount!);
|
|
||||||
int okCount = ques.where((w) => w.state == 3).length;
|
|
||||||
que.okRate = Utils.calcRate(okCount, dataCount.studentCount!) ;
|
|
||||||
que.priorityInfo = ques.where((w) {
|
|
||||||
return dataCount.priorityStudents!.indexWhere((s) {
|
|
||||||
w.studentName = s.studentName;
|
|
||||||
return s.studentId == w.studentId;
|
|
||||||
}) > -1 && w.state != 3;
|
|
||||||
}).toList();
|
|
||||||
|
|
||||||
que.answerNgStudents = ques.where((w) {
|
|
||||||
w.studentName = data.students.firstWhere((s) => s.studentId == w.studentId).studentName;
|
|
||||||
return w.state == 2;
|
|
||||||
}).toList();
|
|
||||||
|
|
||||||
que.noAnswerStudents = ques.where((w) {
|
|
||||||
return w.state == 0;
|
|
||||||
}).toList();
|
|
||||||
que.answerOkStudents = ques.where((w) {
|
|
||||||
return w.state == 3;
|
|
||||||
}).toList();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
dataCount.studentSubmitCount = data.students.where((s) => s.state != 0).length;
|
|
||||||
|
|
||||||
for(var stu in data.students){
|
|
||||||
stu.kgtStu = kgt.where((w) => w.studentId == stu.studentId).toList();
|
|
||||||
stu.kgtStu!.sort((a, b) => a.questionNo.compareTo(b.questionNo));
|
|
||||||
stu.kgtOkCount = stu.kgtStu!.where((w) => w.state == 3).length;
|
|
||||||
stu.kgtErrorCount = stu.kgtStu!.where((w) => w.state == 2).length;
|
|
||||||
stu.kgtAnswerCount = stu.kgtStu!.where((w) => w.state != 0).length;
|
|
||||||
|
|
||||||
stu.zgtStu = zgt.where((w) => w.studentId == stu.studentId).toList();
|
|
||||||
stu.zgtStu!.sort((a, b) => a.questionNo.compareTo(b.questionNo));
|
|
||||||
stu.zgtOkCount = stu.zgtStu!.where((w) => w.state == 3).length;
|
|
||||||
stu.zgtErrorCount = stu.zgtStu!.where((w) => w.state == 2).length;
|
|
||||||
stu.zgtUnrated = stu.zgtStu!.where((w) => w.state == 1).length;
|
|
||||||
stu.zgtAnswerCount = stu.zgtStu!.where((w) => w.state != 0).length;
|
|
||||||
stu.allOk = data.dtls.where((w) {
|
|
||||||
if(stu.studentId == w.studentId){
|
|
||||||
stu.useTime = w.useTime;
|
|
||||||
}
|
|
||||||
for(var que in data.questions){
|
|
||||||
if(w.templateId == que.templateId && w.questionNo == que.questionNo){
|
|
||||||
w.answer = que.answer;
|
|
||||||
w.questionPicture = que.questionPicture;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return w.studentId == stu.studentId && w.state != 3;
|
|
||||||
} ).length??0;
|
|
||||||
if( (stu.kgtStu!.length - stu.kgtAnswerCount!) + (stu.zgtStu!.length-stu.zgtAnswerCount!) == (stu.kgtStu!.length + stu.zgtStu!.length)){
|
|
||||||
stu.allNotDone = true;
|
|
||||||
}else{
|
|
||||||
stu.allNotDone = false;
|
|
||||||
}
|
|
||||||
stu.noAnswerCount = data.dtls.where((w) => w.state == 0 && stu.studentId == w.studentId).length;
|
|
||||||
|
|
||||||
List<Questions> ques = data.questions;
|
|
||||||
stu.queDtls =data.dtls.where((w) => w.studentId == stu.studentId && ques.indexWhere((q) => w.templateId == q.templateId && w.questionNo == q.questionNo) > -1).toList();
|
|
||||||
int okCount = stu.queDtls!.where((w) => w.state == 3).length;
|
|
||||||
int ttlCount = stu.queDtls!.length;
|
|
||||||
stu.okRate = Utils.calcRate(okCount, ttlCount);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
data.students.sort((a, b) {
|
|
||||||
int num1 = a.state;
|
|
||||||
int num2 = b.state;
|
|
||||||
return num2.compareTo(num1);
|
|
||||||
});
|
|
||||||
|
|
||||||
for(var know in data.knows){
|
|
||||||
List<Questions> ques = data.questions.where((w) => w.knows.indexWhere((k) => k.knowledgeId == know.knowledgeId) > -1).toList();
|
|
||||||
List<Dtls> queDtls = data.dtls.where((w) => ques.indexWhere((q) => w.templateId == q.templateId && w.questionNo == q.questionNo) > -1).toList();
|
|
||||||
know.okCount = queDtls.where((w) => w.state == 3).length;
|
|
||||||
know.ttlCount = queDtls.length;
|
|
||||||
know.okRate = Utils.calcRate(know.okCount!, know.ttlCount!);
|
|
||||||
}
|
|
||||||
|
|
||||||
return dataCount;
|
|
||||||
}
|
|
||||||
|
|
||||||
static DateTime getWeekStartDate() {
|
|
||||||
DateTime now = DateTime.now();
|
|
||||||
int dayOfWeek = now.weekday; // 获取今天是周几(1代表周一,7代表周日)
|
|
||||||
int diff = dayOfWeek - 1; // 计算今天距离周一的天数差
|
|
||||||
if (diff < 0) {
|
|
||||||
diff += 7; // 如果是周日,则需要加上一周的天数
|
|
||||||
}
|
|
||||||
return now.subtract(Duration(days: diff)); // 减去天数差,得到本周一的时间
|
|
||||||
}
|
|
||||||
|
|
||||||
static DateTime getWeekEndDate() {
|
|
||||||
DateTime now = DateTime.now();
|
|
||||||
int dayOfWeek = now.weekday; // 获取今天是周几
|
|
||||||
int diff = 7 - dayOfWeek; // 计算今天距离周日的天数差
|
|
||||||
if (diff == 0) {
|
|
||||||
diff = 7; // 如果是周日,则加上一周的天数
|
|
||||||
}
|
|
||||||
return now.add(Duration(days: diff)); // 加上天数差减一,得到本周日的时间
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,93 +0,0 @@
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:flutter/services.dart';
|
|
||||||
import 'package:flutter_localizations/flutter_localizations.dart';
|
|
||||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
|
||||||
import 'package:get/get.dart';
|
|
||||||
import 'package:school_asignment_app/common/config/app_config.dart';
|
|
||||||
import 'package:school_asignment_app/common/config/colorUtils.dart';
|
|
||||||
import 'package:school_asignment_app/common/store/user_store.dart';
|
|
||||||
import 'package:school_asignment_app/common/utils/storage.dart';
|
|
||||||
import 'package:school_asignment_app/common/utils/utils.dart';
|
|
||||||
import 'package:school_asignment_app/routes/app_pages.dart';
|
|
||||||
import 'package:flutter_easyloading/flutter_easyloading.dart';
|
|
||||||
|
|
||||||
void main() async {
|
|
||||||
// 在测试模式下运行Get
|
|
||||||
Get.testMode = true;
|
|
||||||
|
|
||||||
/// 初始化本地存储
|
|
||||||
await Get.putAsync(() => StorageService().init());
|
|
||||||
|
|
||||||
/// 初始化UserStore
|
|
||||||
Get.put<UserStore>(UserStore().init());
|
|
||||||
|
|
||||||
SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, overlays: [SystemUiOverlay.top, SystemUiOverlay.bottom]); // 屏幕刘海
|
|
||||||
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]); // 屏幕强制竖屏
|
|
||||||
runApp(const MyApp());
|
|
||||||
}
|
|
||||||
|
|
||||||
class MyApp extends StatelessWidget {
|
|
||||||
const MyApp({super.key});
|
|
||||||
|
|
||||||
// This widget is the root of your application.
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return ScreenUtilInit(
|
|
||||||
designSize: const Size(AppConfig.UI_WIDTH, AppConfig.UI_HEIGHT),
|
|
||||||
minTextAdapt: true,
|
|
||||||
splitScreenMode: true,
|
|
||||||
builder: (BuildContext context, Widget? child) => GetMaterialApp(
|
|
||||||
title: '作业',
|
|
||||||
theme: ThemeData(
|
|
||||||
brightness: Brightness.light,
|
|
||||||
primarySwatch: createMaterialColor(const Color.fromRGBO(46, 91, 255, 1)),
|
|
||||||
primaryColor: const Color.fromRGBO(46, 91, 255, 1),
|
|
||||||
// textTheme: Typography.englishLike2018.apply(fontSizeFactor: 1.sp,),
|
|
||||||
primaryTextTheme: TextTheme(
|
|
||||||
bodyLarge: TextStyle(fontSize: 14.sp, color: Colors.black87),
|
|
||||||
),
|
|
||||||
useMaterial3: true,
|
|
||||||
),
|
|
||||||
enableLog: true,
|
|
||||||
logWriterCallback: (text, {bool isError = false}) {
|
|
||||||
// isError ? LoggerUtils.e(text) : LoggerUtils.i(text);
|
|
||||||
},
|
|
||||||
// 这里是国际化支持,确保添加flutter_localizations依赖
|
|
||||||
supportedLocales: const [
|
|
||||||
Locale('zh', 'CN'), // 中文简体
|
|
||||||
// 其他支持的locale可以在这里添加
|
|
||||||
],
|
|
||||||
localizationsDelegates: const [
|
|
||||||
// ...其他delegates
|
|
||||||
GlobalMaterialLocalizations.delegate,
|
|
||||||
GlobalWidgetsLocalizations.delegate,
|
|
||||||
GlobalCupertinoLocalizations.delegate, // 如果你使用了Cupertino风格的组件
|
|
||||||
// ...添加其他必要的delegates
|
|
||||||
],
|
|
||||||
localeResolutionCallback: (locale, supportedLocales) {
|
|
||||||
// 在这里可以实现自定义的locale解析逻辑
|
|
||||||
// 如果需要,返回你想要的Locale对象
|
|
||||||
return locale;
|
|
||||||
},
|
|
||||||
//默认专场动画
|
|
||||||
defaultTransition: Transition.fade,
|
|
||||||
//初始化路由页面
|
|
||||||
initialRoute: Routes.startPage,
|
|
||||||
/// 路由表
|
|
||||||
getPages: AppPages.pages,
|
|
||||||
builder: EasyLoading.init(
|
|
||||||
builder: (context, child) {
|
|
||||||
return MediaQuery(
|
|
||||||
//Setting font does not change with system font size
|
|
||||||
data: MediaQuery.of(context).copyWith(textScaleFactor: 1.0),
|
|
||||||
child: Scaffold(
|
|
||||||
body: GestureDetector(onTap: () => Utils.hideKeyboard(), child: child),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
),
|
|
||||||
// home: const MyHomePage(title: 'Flutter Demo Home Page'),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,121 +0,0 @@
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
|
||||||
import 'package:get/get.dart';
|
|
||||||
import 'package:package_info/package_info.dart';
|
|
||||||
import 'package:school_asignment_app/page/global_widget/my_text.dart';
|
|
||||||
// 其他页面
|
|
||||||
|
|
||||||
class OhterPage extends StatefulWidget {
|
|
||||||
const OhterPage({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
State<OhterPage> createState() => _OhterPageState();
|
|
||||||
}
|
|
||||||
|
|
||||||
class _OhterPageState extends State<OhterPage> {
|
|
||||||
RxString localVersion = ''.obs;
|
|
||||||
|
|
||||||
@override
|
|
||||||
void initState() {
|
|
||||||
super.initState();
|
|
||||||
getPageInfo();
|
|
||||||
}
|
|
||||||
|
|
||||||
// 获取当前版本号
|
|
||||||
getPageInfo() async {
|
|
||||||
PackageInfo packageInfo = await PackageInfo.fromPlatform();
|
|
||||||
localVersion.value = packageInfo.version;
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
final personalInfoTitleStly = TextStyle(
|
|
||||||
color: const Color.fromRGBO(80, 87, 103, 1),
|
|
||||||
fontSize: 16.sp,
|
|
||||||
);
|
|
||||||
final personalInfoValStly = TextStyle(
|
|
||||||
color: const Color.fromRGBO(148, 163, 182, 1),
|
|
||||||
fontSize: 16.sp,
|
|
||||||
);
|
|
||||||
|
|
||||||
return Scaffold(
|
|
||||||
backgroundColor: const Color.fromRGBO(248, 248, 248, 1),
|
|
||||||
appBar: AppBar(
|
|
||||||
backgroundColor: Theme.of(context).primaryColor,
|
|
||||||
title: quickText('其他', color: Colors.white),
|
|
||||||
),
|
|
||||||
body: Stack(
|
|
||||||
alignment: const FractionalOffset(0.5, 0.98),
|
|
||||||
children: [
|
|
||||||
ListView(
|
|
||||||
children: [
|
|
||||||
Container(
|
|
||||||
margin: EdgeInsets.symmetric(vertical: 22.h, horizontal: 16.w),
|
|
||||||
padding: EdgeInsets.symmetric(vertical: 22.h, horizontal: 16.w),
|
|
||||||
height: 130.h,
|
|
||||||
decoration: BoxDecoration(
|
|
||||||
borderRadius: BorderRadius.all(Radius.circular(6.w)),
|
|
||||||
color: Colors.white,
|
|
||||||
boxShadow: const [
|
|
||||||
BoxShadow(
|
|
||||||
color: Color.fromRGBO(46, 91, 255, 0.1),
|
|
||||||
offset: Offset.zero, //阴影y轴偏移量
|
|
||||||
blurRadius: 20, //阴影模糊程度
|
|
||||||
spreadRadius: 10, //阴影扩散程度
|
|
||||||
)
|
|
||||||
],
|
|
||||||
),
|
|
||||||
child: Column(
|
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
||||||
children: [
|
|
||||||
InkWell(
|
|
||||||
onTap: () {
|
|
||||||
/* RouterManager.router.navigateTo(
|
|
||||||
context,
|
|
||||||
transition: TransitionType.fadeIn,
|
|
||||||
'${RouterManager.agreementPath}?type=${AGREEMENT_KEY.PRIVACY_GREEMENT.name}',
|
|
||||||
);*/
|
|
||||||
},
|
|
||||||
child: Container(
|
|
||||||
padding: EdgeInsets.only(bottom: 4.h),
|
|
||||||
child: Row(
|
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
||||||
children: [
|
|
||||||
Text('用户隐私协议', style: personalInfoTitleStly),
|
|
||||||
Icon(
|
|
||||||
Icons.arrow_forward_ios,
|
|
||||||
color: const Color.fromRGBO(80, 87, 103, 1),
|
|
||||||
size: 16.sp,
|
|
||||||
)
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
Container(
|
|
||||||
height: 1.w,
|
|
||||||
color: const Color.fromRGBO(240, 243, 255, 1),
|
|
||||||
),
|
|
||||||
SizedBox(height: 8.h),
|
|
||||||
Row(
|
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
||||||
children: [
|
|
||||||
Text('APP版本', style: personalInfoTitleStly),
|
|
||||||
Obx(() {
|
|
||||||
return quickText(localVersion);
|
|
||||||
})
|
|
||||||
],
|
|
||||||
)
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
Row(
|
|
||||||
mainAxisSize: MainAxisSize.min,
|
|
||||||
mainAxisAlignment: MainAxisAlignment.center,
|
|
||||||
children: [Text('APP备案号: ', style: personalInfoTitleStly), quickText('渝ICP备17007225号-3A', size: 14.sp)],
|
|
||||||
),
|
|
||||||
],
|
|
||||||
));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,55 +0,0 @@
|
||||||
import 'package:flutter_easyloading/flutter_easyloading.dart';
|
|
||||||
import 'package:get/get.dart';
|
|
||||||
import 'package:get_storage/get_storage.dart';
|
|
||||||
import 'package:school_asignment_app/common/job/annotated_class.dart';
|
|
||||||
import 'package:school_asignment_app/common/mixins/request_tool_mixin.dart';
|
|
||||||
import 'package:school_asignment_app/routes/app_pages.dart';
|
|
||||||
|
|
||||||
import 'annotate_class_state.dart';
|
|
||||||
|
|
||||||
class AnnotateClassLogic extends GetxController with RequestToolMixin{
|
|
||||||
final AnnotateClassState state = AnnotateClassState();
|
|
||||||
|
|
||||||
@override
|
|
||||||
void onInit(){
|
|
||||||
super.onInit();
|
|
||||||
state.homeworkId.value = Get.arguments['id']??'';
|
|
||||||
state.name.value = Get.arguments['name']??'';
|
|
||||||
state.grade = Get.arguments['grade'];
|
|
||||||
state.completed.value = Get.arguments['completed']??false;
|
|
||||||
EasyLoading.show(status: 'loading...');
|
|
||||||
getList();
|
|
||||||
}
|
|
||||||
|
|
||||||
void getList() async{
|
|
||||||
List<AnnotatedClass> data = await getClient(). getAnnotatedClassList(state.homeworkId.value);
|
|
||||||
state.classList.value = data;
|
|
||||||
|
|
||||||
for (var element in state.classList.value) {
|
|
||||||
int commitStudentCount = 0;
|
|
||||||
int noCommitStudentCount = 0;
|
|
||||||
for (var student in element.students) {
|
|
||||||
if(student.state == 0){
|
|
||||||
noCommitStudentCount ++;
|
|
||||||
}else{
|
|
||||||
commitStudentCount ++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
element.commitStudentCount = commitStudentCount;
|
|
||||||
element.noCommitStudentCount = noCommitStudentCount;
|
|
||||||
}
|
|
||||||
|
|
||||||
EasyLoading.dismiss();
|
|
||||||
}
|
|
||||||
|
|
||||||
void goQuickDataCheck(item){
|
|
||||||
Get.toNamed(Routes.quickDataCheckPage,arguments: {'homeworkId':state.homeworkId.value,'classId':item.classId,'grade':state.grade,'className':item.className
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
void gojobReport(item){
|
|
||||||
Get.toNamed(Routes.jobReportPage,arguments: {'title':state.name.value,'homeworkId':state.homeworkId.value,'grade':state.grade,'className':item.className});
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -1,95 +0,0 @@
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
|
||||||
import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart';
|
|
||||||
import 'package:get/get.dart';
|
|
||||||
import 'package:percent_indicator/percent_indicator.dart';
|
|
||||||
import 'package:school_asignment_app/common/job/annotated_class.dart';
|
|
||||||
import 'package:school_asignment_app/common/utils/utils.dart';
|
|
||||||
import 'package:school_asignment_app/page/global_widget/ReturnToHomepage.dart';
|
|
||||||
import 'package:school_asignment_app/page/global_widget/my_text.dart';
|
|
||||||
import 'package:school_asignment_app/page/home_page/children/annotate_class/widget/annotate_item.dart';
|
|
||||||
import 'package:school_asignment_app/page/home_page/widget/progress_bar.dart';
|
|
||||||
import 'package:school_asignment_app/routes/app_pages.dart';
|
|
||||||
import 'annotate_class_logic.dart';
|
|
||||||
import 'widget/completed_annotate_item.dart';
|
|
||||||
|
|
||||||
class AnnotateClassPage extends StatefulWidget {
|
|
||||||
const AnnotateClassPage({Key? key}) : super(key: key);
|
|
||||||
|
|
||||||
@override
|
|
||||||
State<AnnotateClassPage> createState() => _AnnotateClassPageState();
|
|
||||||
}
|
|
||||||
|
|
||||||
class _AnnotateClassPageState extends State<AnnotateClassPage> {
|
|
||||||
final logic = Get.find<AnnotateClassLogic>();
|
|
||||||
final state = Get.find<AnnotateClassLogic>().state;
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
|
|
||||||
return Scaffold(
|
|
||||||
backgroundColor: const Color.fromRGBO(245, 245, 245, 1),
|
|
||||||
appBar: AppBar(
|
|
||||||
backgroundColor: Colors.white,
|
|
||||||
title: Obx(() {
|
|
||||||
return Text(state.name.value,
|
|
||||||
style:
|
|
||||||
TextStyle(fontSize: 14.sp, color: const Color(0xFF333333)));
|
|
||||||
}),
|
|
||||||
centerTitle: true,
|
|
||||||
leading: IconButton(
|
|
||||||
icon: const Icon(Icons.arrow_back_ios, color: Colors.black),
|
|
||||||
onPressed: () => Navigator.of(context).pop(),
|
|
||||||
),
|
|
||||||
actions: const [
|
|
||||||
ReturnToHomepage(),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
body: Padding(
|
|
||||||
padding: EdgeInsets.symmetric(vertical: 14.r, horizontal: 14.r),
|
|
||||||
child: Obx(() {
|
|
||||||
return
|
|
||||||
state.completed.value? Utils.isPad()?GridView(
|
|
||||||
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
|
|
||||||
crossAxisCount: 2, //横轴三个子widget
|
|
||||||
mainAxisSpacing: 10.h,
|
|
||||||
crossAxisSpacing: 6.w,
|
|
||||||
childAspectRatio: 1.48 //宽高比为1时,子widget
|
|
||||||
),
|
|
||||||
children: state.classList.map((taskItem) {
|
|
||||||
return CompletedAnnotateItem(taskItem:taskItem,logic: logic,);
|
|
||||||
}).toList(),
|
|
||||||
):ListView.builder(
|
|
||||||
itemCount: state.classList.length,
|
|
||||||
itemBuilder: (context, index) {
|
|
||||||
AnnotatedClass taskItem = state.classList[index];
|
|
||||||
return CompletedAnnotateItem(taskItem:taskItem,logic: logic,);
|
|
||||||
}):
|
|
||||||
|
|
||||||
Utils.isPad()?MasonryGridView.count(
|
|
||||||
crossAxisCount: 2, //几列
|
|
||||||
mainAxisSpacing: 4.w, // 间距
|
|
||||||
crossAxisSpacing: 4.h, // 纵向间距?
|
|
||||||
itemCount: state.classList.length,
|
|
||||||
itemBuilder: (context, index) {
|
|
||||||
AnnotatedClass item = state.classList[index];
|
|
||||||
return AnnotateItem(item: item,font: 8.sp,name: state.name.value,logic: logic,);
|
|
||||||
},
|
|
||||||
):
|
|
||||||
ListView.builder(
|
|
||||||
itemCount: state.classList.length,
|
|
||||||
itemBuilder: (context, index) {
|
|
||||||
AnnotatedClass item = state.classList[index];
|
|
||||||
return AnnotateItem(item: item,font: 12.sp,name: state.name.value,logic: logic,);
|
|
||||||
});
|
|
||||||
}),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
void dispose() {
|
|
||||||
Get.delete<AnnotateClassLogic>();
|
|
||||||
super.dispose();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,241 +0,0 @@
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
|
||||||
import 'package:get/get.dart';
|
|
||||||
import 'package:percent_indicator/percent_indicator.dart';
|
|
||||||
import 'package:school_asignment_app/common/job/annotated_class.dart';
|
|
||||||
import 'package:school_asignment_app/common/utils/enum_untils.dart';
|
|
||||||
import 'package:school_asignment_app/page/global_widget/my_text.dart';
|
|
||||||
import 'package:school_asignment_app/page/home_page/children/annotate_class/annotate_class_logic.dart';
|
|
||||||
import 'package:school_asignment_app/page/home_page/children/annotate_class/annotate_class_state.dart';
|
|
||||||
import 'package:school_asignment_app/page/home_page/children/annotate_class/widget/item_btn.dart';
|
|
||||||
import 'package:school_asignment_app/page/home_page/widget/progress_bar.dart';
|
|
||||||
import 'package:school_asignment_app/routes/app_pages.dart';
|
|
||||||
|
|
||||||
class AnnotateItem extends StatefulWidget {
|
|
||||||
final AnnotatedClass item;
|
|
||||||
final double font;
|
|
||||||
final String name;
|
|
||||||
final AnnotateClassLogic logic;
|
|
||||||
const AnnotateItem({Key? key, required this.item,required this.font,required this.name,required this.logic}) : super(key: key);
|
|
||||||
|
|
||||||
@override
|
|
||||||
State<AnnotateItem> createState() => _AnnotateItemState();
|
|
||||||
}
|
|
||||||
|
|
||||||
class _AnnotateItemState extends State<AnnotateItem> {
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return Container(
|
|
||||||
padding: EdgeInsets.only(top: 10.r),
|
|
||||||
margin: EdgeInsets.only(bottom: 10.r),
|
|
||||||
decoration: BoxDecoration(
|
|
||||||
color: Colors.white,
|
|
||||||
borderRadius: BorderRadiusDirectional.circular(4.r),
|
|
||||||
boxShadow: const [BoxShadow(color: Color.fromRGBO(0, 0, 0, 0.15), blurRadius: 10)],
|
|
||||||
),
|
|
||||||
child: Column(
|
|
||||||
children: [
|
|
||||||
Padding(
|
|
||||||
padding: EdgeInsets.symmetric(horizontal: 10.r),
|
|
||||||
child: Row(
|
|
||||||
children: [
|
|
||||||
Text(
|
|
||||||
'${EnumUtils.formatGrade(widget.item.grade)}${widget.item.className}',
|
|
||||||
style: TextStyle(
|
|
||||||
fontSize: widget.font,
|
|
||||||
color: const Color(0xFF000000)),
|
|
||||||
),
|
|
||||||
const Spacer(),
|
|
||||||
Text(
|
|
||||||
'已交:${widget.item.commitStudentCount}',
|
|
||||||
style: TextStyle(
|
|
||||||
fontSize: widget.font - 2.sp,
|
|
||||||
color: const Color(0xFF6888FD)),
|
|
||||||
),
|
|
||||||
SizedBox(
|
|
||||||
width: 20.r,
|
|
||||||
),
|
|
||||||
Text(
|
|
||||||
'未交:${widget.item.noCommitStudentCount}',
|
|
||||||
style: TextStyle(
|
|
||||||
fontSize: widget.font - 2.sp,
|
|
||||||
color: const Color(0xFFFF5656)),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
SizedBox(
|
|
||||||
height: 10.r,
|
|
||||||
),
|
|
||||||
Padding(
|
|
||||||
padding: EdgeInsets.symmetric(horizontal: 8.r),
|
|
||||||
child: Row(
|
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
||||||
children:
|
|
||||||
widget.item.finishTime != null ?
|
|
||||||
[
|
|
||||||
Expanded(
|
|
||||||
flex:4,
|
|
||||||
child:ItemBtn(title: "收藏夹",font: widget.font - 2.sp,
|
|
||||||
clickFunction: (){
|
|
||||||
|
|
||||||
},),
|
|
||||||
),
|
|
||||||
const Expanded(flex: 1, child: SizedBox()),
|
|
||||||
const Expanded(flex: 4, child: SizedBox()),
|
|
||||||
const Expanded(flex: 1, child: SizedBox()),
|
|
||||||
const Expanded(flex: 4, child: SizedBox()),
|
|
||||||
|
|
||||||
]:[
|
|
||||||
Expanded(
|
|
||||||
flex: 4,
|
|
||||||
child: ItemBtn(title: "一键批阅",font: widget.font - 2.sp,
|
|
||||||
clickFunction: (){
|
|
||||||
|
|
||||||
},),
|
|
||||||
),
|
|
||||||
const Expanded(flex: 1,child: Text(''),),
|
|
||||||
Expanded(
|
|
||||||
flex:4,
|
|
||||||
child: ItemBtn(title: "数据快查",font: widget.font - 2.sp,clickFunction: (){
|
|
||||||
widget.logic.goQuickDataCheck(widget.item);
|
|
||||||
},),
|
|
||||||
),
|
|
||||||
const Expanded(flex: 1,child: Text(''),),
|
|
||||||
Expanded(
|
|
||||||
flex:4,
|
|
||||||
child: ItemBtn(title: "收藏夹",font: widget.font - 2.sp,
|
|
||||||
clickFunction: (){
|
|
||||||
|
|
||||||
},),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
Padding(
|
|
||||||
padding: EdgeInsets.symmetric(vertical: 10.r,horizontal: 14.r),
|
|
||||||
child: Row(
|
|
||||||
children: [
|
|
||||||
Expanded(
|
|
||||||
child: LinearPercentIndicator(
|
|
||||||
padding: EdgeInsets.zero,
|
|
||||||
animation: true,
|
|
||||||
lineHeight: 8.h,
|
|
||||||
animationDuration: 2500,
|
|
||||||
|
|
||||||
percent: widget.item.annotateRate / 100,
|
|
||||||
linearGradient: LinearGradient(
|
|
||||||
tileMode: TileMode.mirror,
|
|
||||||
stops: const [0.0, 1.0],
|
|
||||||
colors: widget.item.annotateRate / 100 != 1
|
|
||||||
? [Theme.of(context).primaryColor.withOpacity(0.1), Theme.of(context).primaryColor]
|
|
||||||
: [
|
|
||||||
const Color.fromRGBO(144, 224, 190, 1).withOpacity(0.1),
|
|
||||||
const Color.fromRGBO(144, 224, 190, 1),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
// linearStrokeCap: LinearStrokeCap.butt,
|
|
||||||
// progressColor: Theme.of(context).primaryColor,
|
|
||||||
backgroundColor: const Color.fromRGBO(232, 232, 232, 1),
|
|
||||||
barRadius: Radius.circular(10.r),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
SizedBox(width: 7.w),
|
|
||||||
quickText('${widget.item.annotateRate}%',
|
|
||||||
size: widget.font - 2.sp, color: const Color.fromRGBO(70, 70, 70, 1))
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
ProgressBar(
|
|
||||||
title: '客观题正确率:',
|
|
||||||
color: const Color(0xFFB8C7FF),
|
|
||||||
percent: widget.item.kgtCorrectRate / 100,
|
|
||||||
marginEdg: EdgeInsets.zero,
|
|
||||||
padingEdg: EdgeInsets.only(top: 8.h,left: 14.r,right: 14.r),
|
|
||||||
fontSize:widget.font - 2.sp),
|
|
||||||
ProgressBar(
|
|
||||||
title: '主观题正确率:',
|
|
||||||
color: const Color(0xFFB8C7FF),
|
|
||||||
percent: widget.item.zgtCorrectRate / 100,
|
|
||||||
padingEdg: EdgeInsets.symmetric(horizontal: 10.r),
|
|
||||||
marginEdg: EdgeInsets.only(top: 8.h),
|
|
||||||
fontSize:widget.font - 2.sp),
|
|
||||||
ProgressBar(
|
|
||||||
title: '总正确率:',
|
|
||||||
color: const Color(0xFFB8C7FF),
|
|
||||||
percent: widget.item.correctRate / 100,
|
|
||||||
padingEdg: EdgeInsets.symmetric(horizontal: 10.r),
|
|
||||||
marginEdg: EdgeInsets.only(top: 8.h),
|
|
||||||
fontSize:widget.font - 2.sp),
|
|
||||||
|
|
||||||
Container(
|
|
||||||
margin: EdgeInsets.only(top: 10.r),
|
|
||||||
decoration: BoxDecoration(
|
|
||||||
borderRadius: BorderRadius.only(bottomLeft: Radius.circular(4.r), bottomRight: Radius.circular(4.r)),
|
|
||||||
color: Colors.white,
|
|
||||||
boxShadow: const [
|
|
||||||
BoxShadow(
|
|
||||||
color: Color.fromRGBO(0, 0, 0, 0.15),
|
|
||||||
offset: Offset(0, -0.0001), //阴影y轴偏移量
|
|
||||||
blurRadius: 4, //阴影模糊程度
|
|
||||||
spreadRadius: 0, //阴影扩散程度
|
|
||||||
)
|
|
||||||
],
|
|
||||||
),
|
|
||||||
|
|
||||||
child: Row(
|
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
||||||
children:
|
|
||||||
widget.item.finishTime != null ?
|
|
||||||
[
|
|
||||||
Expanded(
|
|
||||||
child: InkWell(
|
|
||||||
onTap: () {
|
|
||||||
widget.logic.goQuickDataCheck(widget.item);
|
|
||||||
},
|
|
||||||
child: Container(
|
|
||||||
alignment: Alignment.center,
|
|
||||||
child: quickText('数据快查', color: Color.fromRGBO(118, 118, 118, 1), size: widget.font),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
Container(width: 1.w, height: 30.h, color: const Color.fromRGBO(221, 221, 221, 1)),
|
|
||||||
Expanded(
|
|
||||||
child: InkWell(
|
|
||||||
onTap: () {
|
|
||||||
widget.logic.gojobReport(widget.item);
|
|
||||||
},
|
|
||||||
child: Container(
|
|
||||||
alignment: Alignment.center,
|
|
||||||
child: quickText('查看报告', color: Color.fromRGBO(118, 118, 118, 1), size: widget.font),
|
|
||||||
),
|
|
||||||
)),
|
|
||||||
]
|
|
||||||
:
|
|
||||||
[
|
|
||||||
Expanded(
|
|
||||||
child: InkWell(
|
|
||||||
onTap: () {},
|
|
||||||
child: Container(
|
|
||||||
alignment: Alignment.center,
|
|
||||||
child: quickText('批阅', color: const Color.fromRGBO(118, 118, 118, 1), size: widget.font),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
Container(width: 1.w, height: 30.h, color: const Color.fromRGBO(221, 221, 221, 1)),
|
|
||||||
Expanded(
|
|
||||||
child: InkWell(
|
|
||||||
onTap: () {},
|
|
||||||
child: Container(
|
|
||||||
alignment: Alignment.center,
|
|
||||||
child: quickText('结束批阅', color: const Color.fromRGBO(118, 118, 118, 1), size: widget.font),
|
|
||||||
),
|
|
||||||
)),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
)
|
|
||||||
],
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,353 +0,0 @@
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:flutter_easyloading/flutter_easyloading.dart';
|
|
||||||
import 'package:flutter_easyrefresh/easy_refresh.dart';
|
|
||||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
|
||||||
import 'package:get/get.dart';
|
|
||||||
import 'package:school_asignment_app/common/job/student_item.dart';
|
|
||||||
import 'package:school_asignment_app/common/utils/utils.dart';
|
|
||||||
import 'package:school_asignment_app/page/global_widget/MyEmptyWidget.dart';
|
|
||||||
import 'package:school_asignment_app/page/global_widget/ReturnToHomepage.dart';
|
|
||||||
import 'package:school_asignment_app/routes/app_pages.dart';
|
|
||||||
|
|
||||||
import 'class_student_logic.dart';
|
|
||||||
|
|
||||||
class ClassStudentPage extends StatefulWidget {
|
|
||||||
const ClassStudentPage({Key? key}) : super(key: key);
|
|
||||||
|
|
||||||
@override
|
|
||||||
State<ClassStudentPage> createState() => _ClassStudentPageState();
|
|
||||||
}
|
|
||||||
|
|
||||||
class _ClassStudentPageState extends State<ClassStudentPage> {
|
|
||||||
final logic = Get.find<ClassStudentLogic>();
|
|
||||||
final state = Get
|
|
||||||
.find<ClassStudentLogic>()
|
|
||||||
.state;
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return Scaffold(
|
|
||||||
backgroundColor: const Color.fromRGBO(245, 245, 245, 1),
|
|
||||||
appBar: AppBar(
|
|
||||||
backgroundColor: Colors.white,
|
|
||||||
title: Obx(() {
|
|
||||||
return Text(
|
|
||||||
state.title.value,
|
|
||||||
style: TextStyle(fontSize: 14.sp, color: const Color(0xFF333333)),
|
|
||||||
);
|
|
||||||
}),
|
|
||||||
centerTitle: true,
|
|
||||||
leading: IconButton(
|
|
||||||
icon: const Icon(Icons.arrow_back_ios, color: Colors.black),
|
|
||||||
onPressed: () => Navigator.of(context).pop(),
|
|
||||||
),
|
|
||||||
actions: const [
|
|
||||||
ReturnToHomepage(),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
body: Padding(
|
|
||||||
padding: EdgeInsets.symmetric(vertical: 14.r, horizontal: 14.r),
|
|
||||||
child: Obx(() {
|
|
||||||
return EasyRefresh(
|
|
||||||
firstRefresh: false,
|
|
||||||
taskIndependence: true,
|
|
||||||
controller: logic.refreshController,
|
|
||||||
header: MaterialHeader(),
|
|
||||||
footer: TaurusFooter(),
|
|
||||||
onRefresh: () async {
|
|
||||||
logic.getList();
|
|
||||||
},
|
|
||||||
child: state.studentList.isNotEmpty
|
|
||||||
? Utils.isPad()
|
|
||||||
? GridView(
|
|
||||||
shrinkWrap: true,
|
|
||||||
gridDelegate:
|
|
||||||
SliverGridDelegateWithFixedCrossAxisCount(
|
|
||||||
crossAxisCount: 2,
|
|
||||||
mainAxisSpacing: 10.r,
|
|
||||||
crossAxisSpacing: 10.r,
|
|
||||||
childAspectRatio: 556 / 112,
|
|
||||||
),
|
|
||||||
children: List.generate(state.studentList.length, (index) {
|
|
||||||
StudentItem item = state.studentList[index];
|
|
||||||
return InkWell(
|
|
||||||
onTap: () {
|
|
||||||
// RouterManager.router.navigateTo(context,
|
|
||||||
// '${RouterManager.jobPersonalDetailPath}?studentId=${item.studentId}&studentName=${Uri.encodeComponent(item.studentName)}');
|
|
||||||
Get.toNamed(Routes.studentWorkDetailPage,arguments: {'studentName':item.name,'studentId':item.id});
|
|
||||||
},
|
|
||||||
child: Container(
|
|
||||||
padding: EdgeInsets.symmetric(horizontal: 10.r),
|
|
||||||
decoration: BoxDecoration(
|
|
||||||
borderRadius:
|
|
||||||
BorderRadius.all(Radius.circular(10.r)),
|
|
||||||
color: Colors.white,
|
|
||||||
),
|
|
||||||
child: Row(
|
|
||||||
mainAxisAlignment:
|
|
||||||
MainAxisAlignment.spaceBetween,
|
|
||||||
children: [
|
|
||||||
Expanded(
|
|
||||||
child: Text(
|
|
||||||
item.name,
|
|
||||||
style: TextStyle(
|
|
||||||
fontSize: 12.sp,
|
|
||||||
color: const Color(0xFF6888FD)),
|
|
||||||
)),
|
|
||||||
|
|
||||||
state.page == 'answerTrajectory' ? Container(
|
|
||||||
height: 20.r,
|
|
||||||
width: 70.r,
|
|
||||||
decoration: BoxDecoration(
|
|
||||||
border: Border.all(
|
|
||||||
width: 1.r, color: const Color(0xFFFFA41E)),
|
|
||||||
borderRadius: BorderRadius.all(
|
|
||||||
Radius.circular(20.r)),
|
|
||||||
|
|
||||||
),
|
|
||||||
child: Center(child: Text('详情', style: TextStyle(
|
|
||||||
fontSize: 10.r, color: Color(0xFFFFA41E))),
|
|
||||||
)) : state.page == 'history' ? Container(
|
|
||||||
height: 20.r,
|
|
||||||
width: 70.r,
|
|
||||||
decoration: BoxDecoration(
|
|
||||||
color: const Color(0xFF6888FD),
|
|
||||||
borderRadius: BorderRadius.all(
|
|
||||||
Radius.circular(20.r))
|
|
||||||
),
|
|
||||||
child: Center(child: Text('历史作业', style: TextStyle(
|
|
||||||
fontSize: 10.r, color: Colors.white),)),
|
|
||||||
) :
|
|
||||||
item.priorityAnnotate
|
|
||||||
?
|
|
||||||
InkWell(
|
|
||||||
onTap: () {
|
|
||||||
logic.setJobReadLevel(
|
|
||||||
item.id, false);
|
|
||||||
EasyLoading.show(
|
|
||||||
status: 'loading...');
|
|
||||||
},
|
|
||||||
child: Container(
|
|
||||||
height: 20.r,
|
|
||||||
width: 80.r,
|
|
||||||
decoration: BoxDecoration(
|
|
||||||
borderRadius: BorderRadius.all(
|
|
||||||
Radius.circular(4.r)),
|
|
||||||
color: const Color(0xFFB7FFE0),
|
|
||||||
),
|
|
||||||
child: Row(
|
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
|
||||||
children: [
|
|
||||||
Padding(
|
|
||||||
padding: EdgeInsets.only(left: 3.r),
|
|
||||||
child: Image.asset(
|
|
||||||
'assets/images/youx_icon_active.png',
|
|
||||||
width: 14.r, height: 14.r,),
|
|
||||||
),
|
|
||||||
Padding(
|
|
||||||
padding: EdgeInsets.only(
|
|
||||||
top: 2.r, left: 4.r),
|
|
||||||
child: Text(
|
|
||||||
'优先批阅',
|
|
||||||
style: TextStyle(
|
|
||||||
fontSize: 10.sp,
|
|
||||||
color: const Color(0xFF4CC793)),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
)
|
|
||||||
: InkWell(
|
|
||||||
onTap: () {
|
|
||||||
logic.setJobReadLevel(
|
|
||||||
item.id, true);
|
|
||||||
EasyLoading.show(
|
|
||||||
status: 'loading...');
|
|
||||||
},
|
|
||||||
child: Container(
|
|
||||||
height: 20.r,
|
|
||||||
width: 80.r,
|
|
||||||
decoration: BoxDecoration(
|
|
||||||
borderRadius: BorderRadius.all(
|
|
||||||
Radius.circular(4.r)),
|
|
||||||
color: const Color(0xFFE1E1E1),
|
|
||||||
),
|
|
||||||
child: Row(
|
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
|
||||||
children: [
|
|
||||||
Padding(
|
|
||||||
padding: EdgeInsets.only(left: 3.r),
|
|
||||||
child: Image.asset(
|
|
||||||
'assets/images/youx_icon_default.png',
|
|
||||||
width: 14.r, height: 14.r,),
|
|
||||||
),
|
|
||||||
Padding(
|
|
||||||
padding: EdgeInsets.only(
|
|
||||||
top: 2.r, left: 4.r),
|
|
||||||
child: Text(
|
|
||||||
'优先批阅',
|
|
||||||
style: TextStyle(
|
|
||||||
fontSize: 10.sp,
|
|
||||||
color: const Color(0xFF8A9691)),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}),
|
|
||||||
)
|
|
||||||
: ListView.builder(
|
|
||||||
itemBuilder: (context, index) {
|
|
||||||
StudentItem item = state.studentList[index];
|
|
||||||
return InkWell(
|
|
||||||
onTap: () {
|
|
||||||
// RouterManager.router.navigateTo(context,
|
|
||||||
// '${RouterManager.jobPersonalDetailPath}?studentId=${item.studentId}&studentName=${Uri.encodeComponent(item.studentName)}');
|
|
||||||
Get.toNamed(Routes.studentWorkDetailPage,arguments: {'studentName':item.name,'studentId':item.id});
|
|
||||||
},
|
|
||||||
child: Container(
|
|
||||||
padding: EdgeInsets.symmetric(
|
|
||||||
vertical: 20.r, horizontal: 15.r),
|
|
||||||
margin: EdgeInsets.only(bottom: 15.r),
|
|
||||||
decoration: BoxDecoration(
|
|
||||||
borderRadius:
|
|
||||||
BorderRadius.all(Radius.circular(10.r)),
|
|
||||||
color: Colors.white,
|
|
||||||
),
|
|
||||||
child: Row(
|
|
||||||
mainAxisAlignment:
|
|
||||||
MainAxisAlignment.spaceBetween,
|
|
||||||
children: [
|
|
||||||
Expanded(
|
|
||||||
child: Text(
|
|
||||||
item.name,
|
|
||||||
style: TextStyle(
|
|
||||||
fontSize: 12.sp,
|
|
||||||
color: Color(0xFF6888FD)),
|
|
||||||
)),
|
|
||||||
state.page == 'answerTrajectory' ? Container(
|
|
||||||
height: 24.r,
|
|
||||||
width: 72.r,
|
|
||||||
decoration: BoxDecoration(
|
|
||||||
border: Border.all(
|
|
||||||
width: 1.r, color: Color(0xFFFFA41E)),
|
|
||||||
borderRadius: BorderRadius.all(
|
|
||||||
Radius.circular(20.r)),
|
|
||||||
|
|
||||||
),
|
|
||||||
child: Center(child: Text('详情', style: TextStyle(
|
|
||||||
fontSize: 10.r, color: Color(0xFFFFA41E))),
|
|
||||||
)) : state.page == 'history' ? Container(
|
|
||||||
height: 24.r,
|
|
||||||
width: 82.r,
|
|
||||||
decoration: BoxDecoration(
|
|
||||||
color: Color(0xFF6888FD),
|
|
||||||
borderRadius: BorderRadius.all(
|
|
||||||
Radius.circular(20.r))
|
|
||||||
),
|
|
||||||
child: Center(child: Text('历史作业', style: TextStyle(
|
|
||||||
fontSize: 10.r, color: Colors.white),)),
|
|
||||||
) :
|
|
||||||
item.priorityAnnotate
|
|
||||||
? InkWell(
|
|
||||||
onTap: () {
|
|
||||||
logic.setJobReadLevel(
|
|
||||||
item.id, false);
|
|
||||||
EasyLoading.show(
|
|
||||||
status: 'loading...');
|
|
||||||
},
|
|
||||||
child: Container(
|
|
||||||
height: 24.r,
|
|
||||||
width: 82.r,
|
|
||||||
decoration: BoxDecoration(
|
|
||||||
borderRadius: BorderRadius.all(
|
|
||||||
Radius.circular(4.r)),
|
|
||||||
color: Color(0xFFB7FFE0),
|
|
||||||
),
|
|
||||||
child: Row(
|
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
|
||||||
children: [
|
|
||||||
Padding(
|
|
||||||
padding: EdgeInsets.only(left: 3.r),
|
|
||||||
child: Image.asset(
|
|
||||||
'assets/images/youx_icon_active.png',
|
|
||||||
width: 14.r, height: 14.r,),
|
|
||||||
),
|
|
||||||
Padding(
|
|
||||||
padding: EdgeInsets.only(
|
|
||||||
top: 2.r, left: 4.r),
|
|
||||||
child: Text(
|
|
||||||
'优先批阅',
|
|
||||||
style: TextStyle(
|
|
||||||
fontSize: 10.sp,
|
|
||||||
color: const Color(0xFF4CC793)),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
)
|
|
||||||
: InkWell(
|
|
||||||
onTap: () {
|
|
||||||
logic.setJobReadLevel(
|
|
||||||
item.id, true);
|
|
||||||
EasyLoading.show(
|
|
||||||
status: 'loading...');
|
|
||||||
},
|
|
||||||
child: Container(
|
|
||||||
height: 24.r,
|
|
||||||
width: 82.r,
|
|
||||||
decoration: BoxDecoration(
|
|
||||||
borderRadius: BorderRadius.all(
|
|
||||||
Radius.circular(4.r)),
|
|
||||||
color: const Color(0xFFE1E1E1),
|
|
||||||
),
|
|
||||||
child: Row(
|
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
|
||||||
children: [
|
|
||||||
Padding(
|
|
||||||
padding: EdgeInsets.only(left: 3.r),
|
|
||||||
child: Image.asset(
|
|
||||||
'assets/images/youx_icon_default.png',
|
|
||||||
width: 14.r, height: 14.r,),
|
|
||||||
),
|
|
||||||
Padding(
|
|
||||||
padding: EdgeInsets.only(
|
|
||||||
top: 2.r, left: 4.r),
|
|
||||||
child: Text(
|
|
||||||
'优先批阅',
|
|
||||||
style: TextStyle(
|
|
||||||
fontSize: 10.sp,
|
|
||||||
color: const Color(0xFF8A9691)),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
itemCount: state.studentList.length,
|
|
||||||
)
|
|
||||||
: const MyEmptyWidget(),
|
|
||||||
);
|
|
||||||
}),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
void dispose() {
|
|
||||||
Get.delete<ClassStudentLogic>();
|
|
||||||
super.dispose();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,54 +0,0 @@
|
||||||
import 'package:flutter_easyloading/flutter_easyloading.dart';
|
|
||||||
import 'package:get/get.dart';
|
|
||||||
import 'package:school_asignment_app/common/job/annotated_class.dart';
|
|
||||||
import 'package:school_asignment_app/common/job/homework_details.dart';
|
|
||||||
import 'package:school_asignment_app/common/mixins/request_tool_mixin.dart';
|
|
||||||
import 'package:school_asignment_app/common/utils/utils.dart';
|
|
||||||
|
|
||||||
import 'job_report_state.dart';
|
|
||||||
|
|
||||||
class JobReportLogic extends GetxController with RequestToolMixin {
|
|
||||||
final JobReportState state = JobReportState();
|
|
||||||
|
|
||||||
@override
|
|
||||||
void onInit(){
|
|
||||||
super.onInit();
|
|
||||||
state.title.value = Get.arguments['title']??'';
|
|
||||||
state.homeworkId.value = Get.arguments['homeworkId']??'';
|
|
||||||
state.classId.value = Get.arguments['classId']??'';
|
|
||||||
state.className.value = Get.arguments['className']??'';
|
|
||||||
state.grade = Get.arguments['grade']??'';
|
|
||||||
EasyLoading.show(status: 'loading...');
|
|
||||||
getClass();
|
|
||||||
}
|
|
||||||
void getClass() async{
|
|
||||||
List<AnnotatedClass> data = await getClient(). getAnnotatedClassList(state.homeworkId.value);
|
|
||||||
state.involveClasses.value = data;
|
|
||||||
|
|
||||||
state.involveClasses.value = [state.classData.value, ...(data ?? [])];
|
|
||||||
for (var element in state.involveClasses) {
|
|
||||||
if (element.className == state.className.value && element.grade == state.grade ) {
|
|
||||||
state.classData.value = element;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
getWorkData();
|
|
||||||
}
|
|
||||||
void getWorkData() async{
|
|
||||||
HomeworkDetails data = await getClient(). getHomeworkDetails(state.homeworkId.value,state.classData.value.classId != '-1' ? state.classData.value.classId : '');
|
|
||||||
state.dataCount = Utils.getHomeworkData(data);
|
|
||||||
state.homeData = data;
|
|
||||||
state.kgReport.value = data.questions.where((w)=>w.questionType == 1).toList();
|
|
||||||
state.zgReport.value = data.questions.where((w)=>w.questionType == 2).toList();
|
|
||||||
state.studentList.value = [...data.students];
|
|
||||||
state.knowsList.value = data.knows;
|
|
||||||
state.hasData.value = true;
|
|
||||||
EasyLoading.dismiss();
|
|
||||||
|
|
||||||
state.studentList.sort((a, b) {
|
|
||||||
int num1 = a.kgtOkCount!+a.zgtOkCount!;
|
|
||||||
int num2 = b.kgtOkCount!+b.zgtOkCount!;
|
|
||||||
return num2.compareTo(num1);
|
|
||||||
});
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,131 +0,0 @@
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
|
||||||
import 'package:get/get.dart';
|
|
||||||
import 'package:school_asignment_app/common/job/annotated_class.dart';
|
|
||||||
import 'package:school_asignment_app/page/global_widget/MyEmptyWidget.dart';
|
|
||||||
import 'package:school_asignment_app/page/global_widget/ReturnToHomepage.dart';
|
|
||||||
import 'package:school_asignment_app/page/home_page/children/job_report/widget/dropdown_selection.dart';
|
|
||||||
import 'package:school_asignment_app/page/global_widget/my_text.dart';
|
|
||||||
import 'package:school_asignment_app/page/home_page/children/job_report/widget/knowledge_point.dart';
|
|
||||||
import 'package:school_asignment_app/page/home_page/children/job_report/widget/personnel_data_overview.dart';
|
|
||||||
import 'package:school_asignment_app/page/home_page/children/quick_data_check/widget/kgt_zgt_table.dart';
|
|
||||||
|
|
||||||
import 'job_report_logic.dart';
|
|
||||||
|
|
||||||
class JobReportPage extends StatefulWidget {
|
|
||||||
const JobReportPage({Key? key}) : super(key: key);
|
|
||||||
|
|
||||||
@override
|
|
||||||
State<JobReportPage> createState() => _JobReportPageState();
|
|
||||||
}
|
|
||||||
|
|
||||||
class _JobReportPageState extends State<JobReportPage> {
|
|
||||||
final logic = Get.find<JobReportLogic>();
|
|
||||||
final state = Get
|
|
||||||
.find<JobReportLogic>()
|
|
||||||
.state;
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return Scaffold(
|
|
||||||
backgroundColor: Color.fromRGBO(245, 245, 245, 1),
|
|
||||||
appBar: AppBar(
|
|
||||||
backgroundColor: Colors.white,
|
|
||||||
centerTitle: true,
|
|
||||||
title: Center(
|
|
||||||
child: Obx(() {
|
|
||||||
return quickText(
|
|
||||||
'${state.title.value}作业报告',
|
|
||||||
size: 14.sp,
|
|
||||||
color: const Color.fromRGBO(51, 51, 51, 1),
|
|
||||||
);
|
|
||||||
})),
|
|
||||||
leading: IconButton(
|
|
||||||
icon: const Icon(Icons.arrow_back_ios, color: Colors.black),
|
|
||||||
onPressed: () => Navigator.of(context).pop(),
|
|
||||||
),
|
|
||||||
actions: const [
|
|
||||||
ReturnToHomepage(),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
body: Obx(() {
|
|
||||||
if (state.hasData.value) {
|
|
||||||
return SingleChildScrollView(
|
|
||||||
child: Column(
|
|
||||||
children: [
|
|
||||||
// 下拉框
|
|
||||||
Container(
|
|
||||||
padding: EdgeInsets.symmetric(vertical: 10.h, horizontal: 10.w),
|
|
||||||
decoration: const BoxDecoration(
|
|
||||||
color: Colors.white,
|
|
||||||
),
|
|
||||||
child: Row(
|
|
||||||
children: [
|
|
||||||
Obx(() {
|
|
||||||
return DropdownSelection(involveClasses: state
|
|
||||||
.involveClasses.value,
|
|
||||||
classData: state.classData.value,
|
|
||||||
call: (AnnotatedClass item) {
|
|
||||||
state.classData.value = item;
|
|
||||||
if (item.grade == -1) state.classData.value = state.defaultClass;
|
|
||||||
logic.getWorkData();
|
|
||||||
});
|
|
||||||
}),
|
|
||||||
// Expanded(child: Text('')),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
//完成率、正确率
|
|
||||||
/* TopCount(
|
|
||||||
data, classData == null ? '' : classData!.className, widget.id),*/
|
|
||||||
//客观题、主观题
|
|
||||||
KgtZgtTable(studentCount: state.dataCount.studentCount!,
|
|
||||||
homeworkId: state.homeworkId.value,
|
|
||||||
kgReport: state.kgReport,
|
|
||||||
zgReport: state.zgReport,
|
|
||||||
kgtOkRate: state.dataCount.kgtOkRate!
|
|
||||||
.toStringAsFixed(0),
|
|
||||||
zgtOkRate: state.dataCount.zgtOkRate!
|
|
||||||
.toStringAsFixed(0)),
|
|
||||||
// 掌握知识点的情况
|
|
||||||
Container(
|
|
||||||
margin: EdgeInsets.symmetric(horizontal: 10.r),
|
|
||||||
child: KnowledgePoint(
|
|
||||||
knowsList:state.knowsList,data:state.homeData,className: state.classData.value.className,homeworkId:state.homeworkId.value)),
|
|
||||||
// 掌握知识点的情况
|
|
||||||
/* Container(
|
|
||||||
margin: EdgeInsets.symmetric(horizontal: 10.r),
|
|
||||||
child: $OverallPerformance(data.studentCount, data.overallTitles)),
|
|
||||||
// 单位时间答题情况
|
|
||||||
Container(
|
|
||||||
margin: EdgeInsets.symmetric(horizontal: 10.r),
|
|
||||||
child: $UnitTimeAnsweringSituation(widget.id, data.questionAnswerInfos)),*/
|
|
||||||
// 人员数据概况
|
|
||||||
Container(
|
|
||||||
margin: EdgeInsets.symmetric(horizontal: 10.r),
|
|
||||||
child: PersonnelDataOverview(studentList:state.studentList.value)),
|
|
||||||
|
|
||||||
SizedBox(height: 30.r,),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
return Padding(
|
|
||||||
padding: EdgeInsets.only(
|
|
||||||
top: MediaQuery
|
|
||||||
.of(context)
|
|
||||||
.size
|
|
||||||
.height / 2 - 200.r),
|
|
||||||
child: const MyEmptyWidget()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
void dispose() {
|
|
||||||
Get.delete<JobReportLogic>();
|
|
||||||
super.dispose();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,299 +0,0 @@
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
|
||||||
import 'package:get/get.dart';
|
|
||||||
import 'package:percent_indicator/linear_percent_indicator.dart';
|
|
||||||
import 'package:school_asignment_app/common/job/homework_details.dart';
|
|
||||||
import 'package:school_asignment_app/common/utils/utils.dart';
|
|
||||||
import 'package:school_asignment_app/page/global_widget/MyEmptyWidget.dart';
|
|
||||||
import 'package:school_asignment_app/page/global_widget/my_text.dart';
|
|
||||||
import 'package:school_asignment_app/routes/app_pages.dart';
|
|
||||||
|
|
||||||
class KnowledgePoint extends StatefulWidget {
|
|
||||||
final RxList<Knows> knowsList;
|
|
||||||
final HomeworkDetails data;
|
|
||||||
final String className;
|
|
||||||
final String homeworkId;
|
|
||||||
KnowledgePoint({Key? key,required this.knowsList,required this.data,required this.className,required this.homeworkId}) : super(key: key);
|
|
||||||
|
|
||||||
@override
|
|
||||||
State<KnowledgePoint> createState() => _KnowledgePointState();
|
|
||||||
}
|
|
||||||
|
|
||||||
class _KnowledgePointState extends State<KnowledgePoint> {
|
|
||||||
|
|
||||||
void goQuickCheckPersonalPath(studentId) {
|
|
||||||
if (studentId != null) {
|
|
||||||
Get.toNamed(Routes.studentPersonalPage,arguments: {'studentId':studentId,'homeworkId':widget.homeworkId});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void showPeopleListDialog(
|
|
||||||
{required BuildContext context,
|
|
||||||
required String title,
|
|
||||||
required List<Students> arr,}) {
|
|
||||||
showDialog(
|
|
||||||
context: context,
|
|
||||||
builder: (BuildContext context) {
|
|
||||||
return AlertDialog(
|
|
||||||
// insetPadding: EdgeInsets.symmetric(vertical: 20.r,horizontal: 20.r),
|
|
||||||
backgroundColor:const Color(0xFFFFFFFF),
|
|
||||||
contentPadding: EdgeInsets.all(20.r),
|
|
||||||
shape: RoundedRectangleBorder(
|
|
||||||
borderRadius: BorderRadius.all(Radius.circular(15.r))),
|
|
||||||
content: SizedBox(
|
|
||||||
width: MediaQuery.of(context).size.width * 0.7,
|
|
||||||
height: MediaQuery.of(context).size.height * 0.7,
|
|
||||||
child: Column(
|
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
|
||||||
children: [
|
|
||||||
Center(
|
|
||||||
child: Text(
|
|
||||||
title,
|
|
||||||
style: TextStyle(
|
|
||||||
fontSize: 15.sp,
|
|
||||||
color: const Color(0xFF3C3C3C),
|
|
||||||
fontWeight: FontWeight.w500),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
SizedBox(
|
|
||||||
height: 10.r,
|
|
||||||
),
|
|
||||||
Row(
|
|
||||||
children: [
|
|
||||||
Expanded(
|
|
||||||
flex: 2,
|
|
||||||
child: Center(
|
|
||||||
child: Text(
|
|
||||||
'姓名',
|
|
||||||
style: TextStyle(
|
|
||||||
fontSize: 12.sp,
|
|
||||||
color: const Color(0xFF6A6A6A)),
|
|
||||||
))),
|
|
||||||
SizedBox(width: 10.r,),
|
|
||||||
Expanded(
|
|
||||||
flex: 1,
|
|
||||||
child: Center(
|
|
||||||
child: Text(
|
|
||||||
'班级',
|
|
||||||
style: TextStyle(
|
|
||||||
fontSize: 12.sp,
|
|
||||||
color: const Color(0xFF6A6A6A)),
|
|
||||||
))),
|
|
||||||
SizedBox(width: 10.r,),
|
|
||||||
Expanded(
|
|
||||||
flex: 2,
|
|
||||||
child: Center(
|
|
||||||
child: Text(
|
|
||||||
'掌握度',
|
|
||||||
style: TextStyle(
|
|
||||||
fontSize: 12.sp,
|
|
||||||
color: const Color(0xFF6A6A6A)),
|
|
||||||
))),
|
|
||||||
SizedBox(width: 10.r,),
|
|
||||||
Expanded(
|
|
||||||
flex: 3,
|
|
||||||
child: Center(
|
|
||||||
child: Text(
|
|
||||||
'掌握情况',
|
|
||||||
style: TextStyle(
|
|
||||||
fontSize: 12.sp,
|
|
||||||
color: const Color(0xFF6A6A6A)),
|
|
||||||
))),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
SizedBox(
|
|
||||||
height: 5.r,
|
|
||||||
),
|
|
||||||
|
|
||||||
arr.isNotEmpty? Expanded(
|
|
||||||
child: ListView.builder(
|
|
||||||
shrinkWrap: true,
|
|
||||||
itemBuilder: (context, index) {
|
|
||||||
var item = arr[index];
|
|
||||||
return Container(
|
|
||||||
padding: EdgeInsets.symmetric(vertical: 5.r),
|
|
||||||
color: const Color(0xFFF0F0F0),
|
|
||||||
margin:EdgeInsets.only(bottom: 2.r),
|
|
||||||
child: Row(
|
|
||||||
children: [
|
|
||||||
Expanded(
|
|
||||||
flex: 2,
|
|
||||||
child: InkWell(
|
|
||||||
onTap: () {
|
|
||||||
goQuickCheckPersonalPath(
|
|
||||||
item.studentId);
|
|
||||||
},
|
|
||||||
child: Center(
|
|
||||||
child: Text(
|
|
||||||
item.studentName!,
|
|
||||||
style: TextStyle(
|
|
||||||
fontSize: 12.sp,
|
|
||||||
color: const Color(0xFF323232)),
|
|
||||||
)))),
|
|
||||||
SizedBox(width: 10.r,),
|
|
||||||
Expanded(
|
|
||||||
flex: 1,
|
|
||||||
child: Center(
|
|
||||||
child: Text(
|
|
||||||
widget.className == ''?'全部': widget.className,
|
|
||||||
style: TextStyle(
|
|
||||||
fontSize: 12.sp,
|
|
||||||
color: Color(0xFF323232)),
|
|
||||||
))),
|
|
||||||
SizedBox(width: 10.r,),
|
|
||||||
Expanded(
|
|
||||||
flex: 2,
|
|
||||||
child: Center(
|
|
||||||
child: Text(
|
|
||||||
'${item.okRate!.toStringAsFixed(0)}%',
|
|
||||||
style: TextStyle(
|
|
||||||
fontSize: 12.sp,
|
|
||||||
color: Color(0xFF323232)),
|
|
||||||
))),
|
|
||||||
SizedBox(width: 10.r,),
|
|
||||||
Expanded(
|
|
||||||
flex: 3,
|
|
||||||
child: Padding(
|
|
||||||
padding: EdgeInsets.symmetric(vertical: 2.r, horizontal: 5.r),
|
|
||||||
child: SingleChildScrollView(
|
|
||||||
child: Wrap(
|
|
||||||
direction: Axis.horizontal,
|
|
||||||
alignment: WrapAlignment.start,
|
|
||||||
spacing: 5,
|
|
||||||
runSpacing: 3,
|
|
||||||
children: List.generate(item.queDtls!.length, (index) {
|
|
||||||
Dtls kgInfo = item.queDtls![index];
|
|
||||||
return Container(
|
|
||||||
width: 14.r,
|
|
||||||
height: 14.r,
|
|
||||||
decoration: BoxDecoration(
|
|
||||||
color: kgInfo.state == 0
|
|
||||||
? const Color(0xFFD3D3D3)
|
|
||||||
: kgInfo.state == 1?Colors.white:kgInfo.state == 2
|
|
||||||
? const Color(0xFFFF7474)
|
|
||||||
: const Color(0xFF4CC793),
|
|
||||||
borderRadius: BorderRadius.all(Radius.circular(7.r))),
|
|
||||||
child: Center(
|
|
||||||
child: Text(
|
|
||||||
kgInfo.questionNo.toString(),
|
|
||||||
style: TextStyle(
|
|
||||||
fontSize: 8.sp,
|
|
||||||
color: kgInfo.state == 1
|
|
||||||
? Color(0xFF525252)
|
|
||||||
: Colors.white),
|
|
||||||
)),
|
|
||||||
);
|
|
||||||
})),
|
|
||||||
),
|
|
||||||
),),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
itemCount: arr.length,
|
|
||||||
),
|
|
||||||
): const MyEmptyWidget()
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return Container(
|
|
||||||
margin: EdgeInsets.only(top: 10.h),
|
|
||||||
padding: EdgeInsets.symmetric(vertical: 16.h, horizontal: 12.w),
|
|
||||||
constraints: BoxConstraints(maxHeight: 320.h),
|
|
||||||
decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(10.r)),
|
|
||||||
child: Column(
|
|
||||||
children: [
|
|
||||||
Container(
|
|
||||||
margin: EdgeInsets.only(bottom: 24.h),
|
|
||||||
child: quickText('知识点掌握情况', color: const Color.fromRGBO(92, 92, 92, 1), size: 14.sp, fontWeight: FontWeight.bold),
|
|
||||||
),
|
|
||||||
Expanded(
|
|
||||||
child: ListView(children: widget.knowsList.value.map((item) {
|
|
||||||
return Container(
|
|
||||||
margin: EdgeInsets.only(bottom: 15.h, left: 15.r, right: 15.r),
|
|
||||||
child: Column(
|
|
||||||
mainAxisSize: MainAxisSize.min,
|
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
||||||
children: [
|
|
||||||
Row(
|
|
||||||
children: [
|
|
||||||
Expanded(
|
|
||||||
flex: 10,
|
|
||||||
child: Row(
|
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
||||||
children: [
|
|
||||||
quickText(item.knowledgeName,
|
|
||||||
size: 12.sp, color: const Color.fromRGBO(152, 152, 152, 1)),
|
|
||||||
quickText('${item.okRate!.toStringAsFixed(0)}%',
|
|
||||||
size: 12.sp, color: const Color.fromRGBO(64, 64, 64, 1)),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
SizedBox(width: 10.w),
|
|
||||||
const Expanded(flex: 1, child: SizedBox()),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
SizedBox(height: 3.h),
|
|
||||||
Row(
|
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
||||||
children: [
|
|
||||||
Expanded(
|
|
||||||
flex: 10,
|
|
||||||
child: LinearPercentIndicator(
|
|
||||||
padding: EdgeInsets.zero,
|
|
||||||
animation: true,
|
|
||||||
lineHeight: 10.h,
|
|
||||||
animationDuration: 2500,
|
|
||||||
percent: item.okRate! / 100,
|
|
||||||
progressColor: Theme.of(context).primaryColor,
|
|
||||||
backgroundColor: const Color.fromRGBO(219, 224, 243, 1),
|
|
||||||
barRadius: Radius.circular(10.r),
|
|
||||||
)),
|
|
||||||
SizedBox(width: 10.w),
|
|
||||||
InkWell(
|
|
||||||
onTap: () {
|
|
||||||
List<Questions> ques = widget.data.questions.where((w) => w.knows.indexWhere((k) => k.knowledgeId == item.knowledgeId) > -1).toList();
|
|
||||||
List<Students> array2 = [...widget.data.students];
|
|
||||||
for(var stu in array2){
|
|
||||||
stu.queDtls = widget.data.dtls.where((w) => w.studentId == stu.studentId && ques.indexWhere((q) => w.templateId == q.templateId && w.questionNo == q.questionNo) > -1).toList();
|
|
||||||
int okCount = stu.queDtls!.where((w) => w.state == 3).length;
|
|
||||||
int ttlCount = stu.queDtls!.length;
|
|
||||||
stu.okRate = Utils.calcRate(okCount, ttlCount);
|
|
||||||
stu.queDtls!.sort((a, b) {
|
|
||||||
int num1 = a.questionNo;
|
|
||||||
int num2 = b.questionNo;
|
|
||||||
return num1.compareTo(num2);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
showPeopleListDialog(
|
|
||||||
context: context,
|
|
||||||
title: item.knowledgeName,
|
|
||||||
arr: array2,);
|
|
||||||
},
|
|
||||||
child: Row(
|
|
||||||
mainAxisSize: MainAxisSize.min,
|
|
||||||
children: [
|
|
||||||
quickText('查看', size: 12.sp, color: const Color.fromRGBO(239, 135, 20, 1)),
|
|
||||||
Icon(Icons.arrow_forward_ios, size: 11.sp, color: const Color.fromRGBO(239, 135, 20, 1)),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
)
|
|
||||||
],
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}).toList()),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,16 +0,0 @@
|
||||||
import 'package:get/get.dart';
|
|
||||||
import 'package:school_asignment_app/common/job/knowledge_points_grasp.dart';
|
|
||||||
import 'package:school_asignment_app/common/utils/utils.dart';
|
|
||||||
|
|
||||||
class KnowledgePointsGraspState {
|
|
||||||
KnowledgePointsGraspState() {
|
|
||||||
///Initialize variables
|
|
||||||
}
|
|
||||||
|
|
||||||
late int page = 1;
|
|
||||||
late int totalPages = 0;
|
|
||||||
late RxList<KnowledgePointsGrasp> dataList=RxList();
|
|
||||||
late String dateStart = Utils.getWeekStartDate().toString().substring(0, 10);
|
|
||||||
late String dateEnd = Utils.getWeekEndDate().toString().substring(0, 10);
|
|
||||||
late RxString customTimeStr = '自定义'.obs;
|
|
||||||
}
|
|
||||||
|
|
@ -1,265 +0,0 @@
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:flutter_easyloading/flutter_easyloading.dart';
|
|
||||||
import 'package:flutter_easyrefresh/easy_refresh.dart';
|
|
||||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
|
||||||
import 'package:get/get.dart';
|
|
||||||
import 'package:school_asignment_app/common/job/knowledge_points_grasp.dart';
|
|
||||||
import 'package:school_asignment_app/common/utils/utils.dart';
|
|
||||||
import 'package:school_asignment_app/page/global_widget/MyEmptyWidget.dart';
|
|
||||||
import 'package:school_asignment_app/page/global_widget/ReturnToHomepage.dart';
|
|
||||||
import 'package:school_asignment_app/page/home_page/children/student_work_detail/widget/job_condition_filter.dart';
|
|
||||||
import 'package:school_asignment_app/page/home_page/widget/progress_bar.dart';
|
|
||||||
import 'package:school_asignment_app/routes/app_pages.dart';
|
|
||||||
import 'package:syncfusion_flutter_datepicker/datepicker.dart';
|
|
||||||
|
|
||||||
import 'knowledge_points_grasp_logic.dart';
|
|
||||||
|
|
||||||
class KnowledgePointsGraspPage extends StatefulWidget {
|
|
||||||
const KnowledgePointsGraspPage({Key? key}) : super(key: key);
|
|
||||||
|
|
||||||
@override
|
|
||||||
State<KnowledgePointsGraspPage> createState() =>
|
|
||||||
_KnowledgePointsGraspPageState();
|
|
||||||
}
|
|
||||||
|
|
||||||
class _KnowledgePointsGraspPageState extends State<KnowledgePointsGraspPage> {
|
|
||||||
final logic = Get.find<KnowledgePointsGraspLogic>();
|
|
||||||
final state = Get
|
|
||||||
.find<KnowledgePointsGraspLogic>()
|
|
||||||
.state;
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return Scaffold(
|
|
||||||
backgroundColor: Color.fromRGBO(245, 245, 245, 1),
|
|
||||||
appBar: AppBar(
|
|
||||||
backgroundColor: Colors.white,
|
|
||||||
title: Text('知识点掌握',
|
|
||||||
style: TextStyle(fontSize: 14.sp, color: Color(0xFF333333))),
|
|
||||||
centerTitle: true,
|
|
||||||
leading: IconButton(
|
|
||||||
icon: Icon(Icons.arrow_back_ios, color: Colors.black),
|
|
||||||
onPressed: () => Navigator.of(context).pop(),
|
|
||||||
),
|
|
||||||
actions: const [
|
|
||||||
ReturnToHomepage(),
|
|
||||||
],
|
|
||||||
elevation: 0,
|
|
||||||
),
|
|
||||||
body: Column(
|
|
||||||
children: [
|
|
||||||
Container(
|
|
||||||
margin: EdgeInsets.all(15.r),
|
|
||||||
height: 30.r,
|
|
||||||
child: Row(
|
|
||||||
children: [
|
|
||||||
Expanded(
|
|
||||||
child: Container(
|
|
||||||
padding: EdgeInsets.only(left: 10.r, right: 10.r),
|
|
||||||
decoration: BoxDecoration(
|
|
||||||
borderRadius: BorderRadius.circular(6.r),
|
|
||||||
border: Border.all(width: 1.r, color: Color(0xFFDDDDDD)),
|
|
||||||
color: Colors.white,
|
|
||||||
),
|
|
||||||
child: TextField(
|
|
||||||
controller: logic.textController,
|
|
||||||
textInputAction: TextInputAction.next,
|
|
||||||
style: TextStyle(
|
|
||||||
color: const Color.fromRGBO(80, 87, 103, 1),
|
|
||||||
fontSize: 10.sp,
|
|
||||||
),
|
|
||||||
decoration: InputDecoration(
|
|
||||||
hintText: "请输入知识点名称",
|
|
||||||
hintStyle: TextStyle(fontSize: 10.sp,
|
|
||||||
color: const Color.fromRGBO(153, 153, 153, 1)),
|
|
||||||
labelStyle: TextStyle(fontSize: 10.sp,
|
|
||||||
color: const Color.fromRGBO(148, 163, 182, 1)),
|
|
||||||
border: InputBorder.none,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
SizedBox(width: 10.r,),
|
|
||||||
InkWell(
|
|
||||||
onTap: () {
|
|
||||||
state.page = 1;
|
|
||||||
logic.getList();
|
|
||||||
},
|
|
||||||
child: Container(
|
|
||||||
width: 50.r,
|
|
||||||
height: 30.r,
|
|
||||||
decoration: BoxDecoration(
|
|
||||||
borderRadius: BorderRadius.circular(4.r),
|
|
||||||
color: Color(0xFF6888FD),
|
|
||||||
),
|
|
||||||
child: Center(
|
|
||||||
child: Text('查询', style: TextStyle(
|
|
||||||
fontSize: 12.sp, color: Colors.white),),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
)
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
|
|
||||||
|
|
||||||
Obx(() {
|
|
||||||
return JobConditionFilter(
|
|
||||||
jobType: 1,
|
|
||||||
controller: logic.tabController,
|
|
||||||
customTimeStr: state.customTimeStr.value,
|
|
||||||
customTime: logic.tabController.index != 2 ||
|
|
||||||
((state.dateEnd == null || state.dateEnd == '') &&
|
|
||||||
(state.dateStart == null || state.dateStart == ''))
|
|
||||||
? null
|
|
||||||
: PickerDateRange(
|
|
||||||
state.dateStart == null || state.dateStart == ''
|
|
||||||
? null
|
|
||||||
: DateTime
|
|
||||||
.parse(state.dateStart!),
|
|
||||||
state.dateEnd == null || state.dateEnd == '' ? null : DateTime
|
|
||||||
.parse(state.dateEnd!),
|
|
||||||
),
|
|
||||||
onTimeFilter: (String? startTime, String? endTime) {
|
|
||||||
EasyLoading.show(status: 'loading...');
|
|
||||||
if (startTime == null && endTime == null) {
|
|
||||||
if (logic.tabController.index == 2) {
|
|
||||||
logic.tabController.animateTo(0);
|
|
||||||
}
|
|
||||||
state.dateStart = Utils.getWeekStartDate().toString().substring(0, 10);
|
|
||||||
state.dateEnd = Utils.getWeekEndDate().toString().substring(0, 10);
|
|
||||||
state.customTimeStr.value = '自定义';
|
|
||||||
} else {
|
|
||||||
state.dateStart = startTime ?? '';
|
|
||||||
state.dateEnd = endTime ?? '';
|
|
||||||
}
|
|
||||||
state.page = 1;
|
|
||||||
logic.getList();
|
|
||||||
// _refreshController2.callRefresh();
|
|
||||||
},
|
|
||||||
refreshTime: (value) {
|
|
||||||
if (value != null && value.startDate != null) {
|
|
||||||
state.customTimeStr.value =
|
|
||||||
value.startDate?.toString().substring(0, 10) ?? '';
|
|
||||||
if (value.endDate != null) {
|
|
||||||
if (!Utils.isPad() &&
|
|
||||||
value.startDate!.year == value.endDate!.year) {
|
|
||||||
state.customTimeStr.value =
|
|
||||||
'${value.startDate.toString().substring(5, 10)}~${value
|
|
||||||
.endDate.toString().substring(5, 10)}';
|
|
||||||
} else {
|
|
||||||
state.customTimeStr.value =
|
|
||||||
'${state.customTimeStr.value}~${value.endDate?.toString()
|
|
||||||
.substring(0, 10)}';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},);
|
|
||||||
}),
|
|
||||||
Expanded(
|
|
||||||
child: Padding(
|
|
||||||
padding: EdgeInsets.symmetric(vertical: 10.r),
|
|
||||||
child: Obx(() {
|
|
||||||
return EasyRefresh(
|
|
||||||
firstRefresh: false,
|
|
||||||
taskIndependence: true,
|
|
||||||
controller: logic.refreshController,
|
|
||||||
header: MaterialHeader(),
|
|
||||||
footer: TaurusFooter(),
|
|
||||||
onRefresh: () async {
|
|
||||||
state.page = 1;
|
|
||||||
logic.getList();
|
|
||||||
},
|
|
||||||
onLoad: () async {
|
|
||||||
if (state.page < state.totalPages) {
|
|
||||||
state.page += 1;
|
|
||||||
logic.getList();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
child: state.dataList.isNotEmpty
|
|
||||||
? ListView.builder(
|
|
||||||
itemCount: state.dataList.value.length,
|
|
||||||
itemBuilder: (context, index) {
|
|
||||||
KnowledgePointsGrasp item = state.dataList[index];
|
|
||||||
return InkWell(
|
|
||||||
onTap: () {
|
|
||||||
Get.toNamed(Routes.knowledgePointsGraspDetailPage,arguments: {'dateStart':state.dateStart,'dateEnd':state.dateEnd,'knowledgeId':item.knowledgeId,'knowledgeName':item.knowledgeName});
|
|
||||||
},
|
|
||||||
child: Container(
|
|
||||||
margin: EdgeInsets.symmetric(
|
|
||||||
vertical: 5.r, horizontal: 14.r),
|
|
||||||
padding: EdgeInsets.symmetric(
|
|
||||||
vertical: 14.r, horizontal: 10.r),
|
|
||||||
decoration: BoxDecoration(
|
|
||||||
borderRadius: BorderRadius.all(
|
|
||||||
Radius.circular(10.r)),
|
|
||||||
color: Colors.white),
|
|
||||||
child: Column(
|
|
||||||
mainAxisAlignment: MainAxisAlignment.start,
|
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
|
||||||
children: [
|
|
||||||
Row(
|
|
||||||
mainAxisAlignment: MainAxisAlignment.start,
|
|
||||||
crossAxisAlignment: CrossAxisAlignment.end,
|
|
||||||
children: [
|
|
||||||
Expanded(
|
|
||||||
child: Text(
|
|
||||||
item.knowledgeName,
|
|
||||||
style: TextStyle(fontSize: 14.sp,
|
|
||||||
color: Color(0xFF505050)),
|
|
||||||
)),
|
|
||||||
|
|
||||||
Container(
|
|
||||||
width: 49.r,
|
|
||||||
height: 22.r,
|
|
||||||
decoration: BoxDecoration(
|
|
||||||
borderRadius: BorderRadius.all(
|
|
||||||
Radius.circular(20.r)),
|
|
||||||
border: Border.all(width: 1.r,
|
|
||||||
color: Color(0xFF6888FD)),
|
|
||||||
),
|
|
||||||
child: Row(
|
|
||||||
mainAxisAlignment: MainAxisAlignment
|
|
||||||
.center,
|
|
||||||
children: [
|
|
||||||
Text(
|
|
||||||
'${item.count}次',
|
|
||||||
style: TextStyle(fontSize: 10.sp,
|
|
||||||
color: Color(0xFF6888FD)),
|
|
||||||
),
|
|
||||||
Image.asset(
|
|
||||||
'assets/images/right_icon_blue.png',
|
|
||||||
width: 8.r, height: 8.r,),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
SizedBox(height: 10.r,),
|
|
||||||
ProgressBar(
|
|
||||||
title: '正确率:',
|
|
||||||
color: Color(0xFF90E0BE),
|
|
||||||
percent: item.correctRate / 100,
|
|
||||||
padingEdg: EdgeInsets.zero,
|
|
||||||
marginEdg: EdgeInsets.only(top: 8.h)),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
})
|
|
||||||
: const MyEmptyWidget(),
|
|
||||||
);
|
|
||||||
}),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
void dispose() {
|
|
||||||
Get.delete<KnowledgePointsGraspLogic>();
|
|
||||||
super.dispose();
|
|
||||||
}
|
|
||||||
}
|
|
||||||