作业提交与互评系统应用


欢迎加入开源鸿蒙跨平台社区:
https://openharmonycrossplatform.csdn.net

一、项目概述

运行效果图

image-20260410231111141

image-20260410231116793

image-20260410231122048

image-20260410231126413

1.1 应用简介

作业提交与互评系统是一款教育学习应用,为学生提供作业提交、互评、成绩查询等功能。支持多种作业类型、在线提交、匿名互评、成绩统计,提升学习效率。应用涵盖作业管理、提交系统、互评模块、成绩查询四大模块。

应用以教育的蓝色为主色调,象征知识与学习。学生可以快速提交作业、参与互评、查看成绩、了解学习进度,享受便捷的学习体验。

1.2 核心功能

功能模块 功能描述 实现方式
作业管理 查看作业列表、截止时间 列表展示
在线提交 文件上传、文本提交 表单系统
互评系统 匿名互评、评分标准 评分机制
成绩查询 查看成绩、排名统计 数据可视化
消息通知 作业提醒、成绩通知 推送服务
历史记录 提交记录、互评记录 时间轴

1.3 作业类型定义

序号 类型名称 Emoji 描述
1 文档作业 📄 Word、PDF文档
2 代码作业 💻 编程代码
3 演示作业 📊 PPT演示
4 视频作业 🎥 视频文件
5 音频作业 🎵 音频文件
6 图片作业 🖼️ 图片文件

1.4 作业状态定义

序号 状态名称 Emoji 描述
1 未开始 ⏸️ 作业未开放
2 进行中 🔄 作业进行中
3 待互评 等待互评
4 互评中 ✍️ 正在互评
5 已完成 作业已完成
6 已截止 作业已截止

1.5 评分等级定义

序号 等级名称 Emoji 分数范围
1 优秀 ⭐⭐⭐⭐⭐ 90-100分
2 良好 ⭐⭐⭐⭐ 80-89分
3 中等 ⭐⭐⭐ 70-79分
4 及格 ⭐⭐ 60-69分
5 不及格 0-59分

1.6 提交方式定义

序号 方式名称 Emoji 描述
1 文件上传 📤 上传文件
2 在线文本 ✏️ 在线编辑
3 链接提交 🔗 提交链接
4 图片上传 📷 上传图片

1.7 技术栈

技术领域 技术选型 版本要求
开发框架 Flutter >= 3.0.0
编程语言 Dart >= 2.17.0
状态管理 Provider >= 6.0.0
文件处理 file_picker >= 5.0.0
数据持久化 shared_preferences >= 2.0.0
设计规范 Material Design 3 -
目标平台 鸿蒙OS / iOS / Android API 21+

1.8 项目结构

lib/
└── main_homework_peer_review.dart
    ├── HomeworkPeerReviewApp      # 应用入口
    ├── HomeworkType                # 作业类型枚举
    ├── HomeworkStatus              # 作业状态枚举
    ├── GradeLevel                  # 评分等级枚举
    ├── SubmissionMethod            # 提交方式枚举
    ├── Homework                    # 作业模型
    ├── Submission                  # 提交模型
    ├── Review                      # 互评模型
    ├── HomeworkPeerReviewHomePage  # 主页面(底部导航)
    ├── _buildHomeworkPage          # 作业页面
    ├── _buildSubmitPage            # 提交页面
    ├── _buildReviewPage            # 互评页面
    ├── _buildGradePage             # 成绩页面
    ├── HomeworkCard                # 作业卡片组件
    └── HomeworkDetailPage          # 作业详情页

二、系统架构

2.1 整体架构图

Data Layer

Business Layer

Presentation Layer

主页面
HomeworkPeerReviewHomePage

作业页

提交页

互评页

成绩页

作业列表

作业详情

截止时间

提交表单

文件上传

提交记录

待评作业

评分标准

互评结果

成绩列表

排名统计

成绩分析

作业管理
HomeworkManager

提交服务
SubmissionService

互评引擎
ReviewEngine

成绩统计
GradeCalculator

Homework
作业数据

Submission
提交数据

Review
互评数据

Grade
成绩数据

2.2 类图设计

has

has

belongs to

reviews

HomeworkPeerReviewApp

+Widget build()

«enumeration»

HomeworkType

+String label

+String emoji

+document()

+code()

+presentation()

+video()

+audio()

+image()

«enumeration»

HomeworkStatus

+String label

+String emoji

+notStarted()

+inProgress()

+pendingReview()

+reviewing()

+completed()

+closed()

Homework

+String id

+String title

+String description

+HomeworkType type

+HomeworkStatus status

+DateTime deadline

+int maxScore

+int reviewCount

+String courseId

+String teacherId

+DateTime createdAt

Submission

+String id

+String homeworkId

+String studentId

+String content

+List<String> attachments

+DateTime submittedAt

+bool isLate

Review

+String id

+String submissionId

+String reviewerId

+int score

+String comment

+DateTime reviewedAt

2.3 页面导航流程

作业

提交

互评

成绩

应用启动

作业页

底部导航

作业列表

作业详情

提交作业

上传文件

提交成功

我的提交

查看提交记录

修改提交

待评作业

查看作业

评分

填写评语

提交互评

成绩列表

成绩详情

查看排名

2.4 作业提交流程

作业管理 提交服务 提交页 学生 作业管理 提交服务 提交页 学生 选择作业 获取作业信息 返回作业详情 上传文件 处理文件 文件上传成功 填写说明 点击提交 创建提交记录 更新作业状态 提交成功

三、核心模块设计

3.1 数据模型设计

3.1.1 作业类型枚举 (HomeworkType)
enum HomeworkType {
  document(
    label: '文档作业',
    emoji: '📄',
    color: Color(0xFF2196F3),
  ),
  code(
    label: '代码作业',
    emoji: '💻',
    color: Color(0xFF4CAF50),
  ),
  presentation(
    label: '演示作业',
    emoji: '📊',
    color: Color(0xFFFF9800),
  ),
  video(
    label: '视频作业',
    emoji: '🎥',
    color: Color(0xFFE91E63),
  ),
  audio(
    label: '音频作业',
    emoji: '🎵',
    color: Color(0xFF9C27B0),
  ),
  image(
    label: '图片作业',
    emoji: '🖼️',
    color: Color(0xFF00BCD4),
  );

  final String label;
  final String emoji;
  final Color color;
}
3.1.2 作业状态枚举 (HomeworkStatus)
enum HomeworkStatus {
  notStarted(label: '未开始', emoji: '⏸️'),
  inProgress(label: '进行中', emoji: '🔄'),
  pendingReview(label: '待互评', emoji: '⏳'),
  reviewing(label: '互评中', emoji: '✍️'),
  completed(label: '已完成', emoji: '✅'),
  closed(label: '已截止', emoji: '⏰');

  final String label;
  final String emoji;

  const HomeworkStatus({required this.label, required this.emoji});
}
3.1.3 作业模型 (Homework)
class Homework {
  final String id;              // 作业ID
  final String title;           // 作业标题
  final String description;     // 作业描述
  final HomeworkType type;      // 作业类型
  HomeworkStatus status;        // 作业状态
  final DateTime deadline;      // 截止时间
  final int maxScore;           // 最高分数
  final int reviewCount;        // 需要互评数量
  final String courseId;        // 课程ID
  final String teacherId;       // 教师ID
  final DateTime createdAt;     // 创建时间

  Homework({
    required this.id,
    required this.title,
    required this.description,
    required this.type,
    required this.status,
    required this.deadline,
    required this.maxScore,
    required this.reviewCount,
    required this.courseId,
    required this.teacherId,
    required this.createdAt,
  });
}
3.1.4 提交模型 (Submission)
class Submission {
  final String id;              // 提交ID
  final String homeworkId;      // 作业ID
  final String studentId;       // 学生ID
  final String content;         // 提交内容
  final List<String> attachments; // 附件列表
  final DateTime submittedAt;   // 提交时间
  final bool isLate;            // 是否迟交

  Submission({
    required this.id,
    required this.homeworkId,
    required this.studentId,
    required this.content,
    required this.attachments,
    required this.submittedAt,
    required this.isLate,
  });
}
3.1.5 互评模型 (Review)
class Review {
  final String id;              // 互评ID
  final String submissionId;    // 提交ID
  final String reviewerId;      // 评阅人ID
  final int score;              // 评分
  final String comment;         // 评语
  final DateTime reviewedAt;    // 评阅时间

  Review({
    required this.id,
    required this.submissionId,
    required this.reviewerId,
    required this.score,
    required this.comment,
    required this.reviewedAt,
  });
}
3.1.6 作业类型分布
35% 25% 20% 10% 5% 5% 作业类型分布示例 文档作业 代码作业 演示作业 视频作业 音频作业 图片作业

3.2 页面结构设计

3.2.1 主页面布局

HomeworkPeerReviewHomePage

IndexedStack

作业页

提交页

互评页

成绩页

NavigationBar

作业 Tab

提交 Tab

互评 Tab

成绩 Tab

3.2.2 作业页结构

作业页

SliverAppBar

状态筛选

作业列表

截止提醒

全部

进行中

待互评

已完成

作业卡片

作业标题

截止时间

作业状态

提交按钮

3.2.3 提交页结构

提交页

SliverAppBar

待提交作业

已提交作业

提交表单

作业列表

快速提交

提交记录

修改提交

文件上传

文本编辑

提交确认

3.2.4 互评页结构

互评页

SliverAppBar

待评作业

评分标准

互评表单

作业列表

作业内容

评分项

评分说明

评分选择

评语填写

提交互评

3.3 作业管理设计

未截止

已截止

创建作业

设置截止时间

发布作业

学生提交

检查截止

正常提交

迟交标记

进入互评

分配互评

学生互评

计算成绩

发布成绩

3.4 互评引擎设计

成绩计算 学生B 学生A 系统 成绩计算 学生B 学生A 系统 分配互评任务 分配互评任务 提交互评结果 记录评分 提交互评结果 记录评分 计算平均分 返回最终成绩 显示成绩

四、UI设计规范

4.1 配色方案

应用以教育的蓝色为主色调,象征知识与学习:

颜色类型 色值 用途
主色 #2196F3 (Blue) 导航、主题元素
辅助色 #64B5F6 作业页面
第三色 #42A5F5 提交页面
强调色 #90CAF9 互评页面
成功色 #4CAF50 完成状态
警告色 #FF9800 进行中状态
错误色 #F44336 截止状态
背景色 #FAFAFA 页面背景
卡片背景 #FFFFFF 作业卡片

4.2 作业类型颜色

类型 色值 视觉效果
文档作业 #2196F3 专业蓝色
代码作业 #4CAF50 代码绿色
演示作业 #FF9800 演示橙色
视频作业 #E91E63 视频粉色
音频作业 #9C27B0 音频紫色
图片作业 #00BCD4 图片青色

4.3 字体规范

元素 字号 字重 颜色
页面标题 24px Bold 主色
作业标题 18px Bold #000000
课程名称 16px Medium #666666
截止时间 14px Regular 警告色
状态标签 12px Regular 白色

4.4 组件规范

4.4.1 作业卡片设计
┌─────────────────────────────────────┐
│  📄 文档作业                    🔄 进行中 │
│                                     │
│  第三章课后习题                      │
│  课程: 高等数学                      │
│                                     │
│  截止时间: 2024-01-20 23:59         │
│  最高分: 100分                       │
│                                     │
│  [查看详情] [提交作业]               │
└─────────────────────────────────────┘
4.4.2 提交表单设计
┌─────────────────────────────────────┐
│  提交作业                            │
│                                     │
│  作业标题: 第三章课后习题             │
│                                     │
│  提交方式: [文件上传 ▼]              │
│                                     │
│  📤 点击上传文件                     │
│     或拖拽文件到此处                 │
│                                     │
│  提交说明:                           │
│  [________________________]         │
│  [________________________]         │
│                                     │
│  [取消] [提交]                       │
└─────────────────────────────────────┘
4.4.3 互评表单设计
┌─────────────────────────────────────┐
│  作业互评                            │
│                                     │
│  作业内容:                           │
│  [查看提交内容]                      │
│                                     │
│  评分标准:                           │
│  • 内容完整性 (40分)                 │
│  • 格式规范性 (30分)                 │
│  • 创新性 (30分)                     │
│                                     │
│  评分: [____] / 100                  │
│                                     │
│  评语:                               │
│  [________________________]         │
│  [________________________]         │
│                                     │
│  [取消] [提交互评]                   │
└─────────────────────────────────────┘
4.4.4 成绩卡片设计
┌─────────────────────────────────────┐
│  📊 成绩统计                         │
│                                     │
│  作业名称: 第三章课后习题             │
│  最终成绩: 95分 ⭐⭐⭐⭐⭐           │
│                                     │
│  互评详情:                           │
│  评阅人1: 96分 - 内容详实,格式规范   │
│  评阅人2: 94分 - 思路清晰,有创新     │
│  评阅人3: 95分 - 完成度高             │
│                                     │
│  班级排名: 第3名 / 50人              │
└─────────────────────────────────────┘

五、核心功能实现

5.1 作业管理实现

class HomeworkManager {
  final List<Homework> _homeworks = [];

  List<Homework> get homeworks => List.unmodifiable(_homeworks);

  void addHomework(Homework homework) {
    _homeworks.add(homework);
  }

  void updateHomeworkStatus(String homeworkId, HomeworkStatus status) {
    final index = _homeworks.indexWhere((h) => h.id == homeworkId);
    if (index != -1) {
      _homeworks[index].status = status;
    }
  }

  List<Homework> getHomeworksByStatus(HomeworkStatus status) {
    return _homeworks.where((h) => h.status == status).toList();
  }

  List<Homework> getHomeworksByType(HomeworkType type) {
    return _homeworks.where((h) => h.type == type).toList();
  }

  List<Homework> getUpcomingHomeworks() {
    final now = DateTime.now();
    return _homeworks.where((h) => h.deadline.isAfter(now)).toList();
  }
}

5.2 提交服务实现

class SubmissionService {
  final List<Submission> _submissions = [];

  List<Submission> get submissions => List.unmodifiable(_submissions);

  void submitHomework(Submission submission) {
    _submissions.add(submission);
  }

  void updateSubmission(Submission submission) {
    final index = _submissions.indexWhere((s) => s.id == submission.id);
    if (index != -1) {
      _submissions[index] = submission;
    }
  }

  List<Submission> getSubmissionsByHomework(String homeworkId) {
    return _submissions.where((s) => s.homeworkId == homeworkId).toList();
  }

  List<Submission> getSubmissionsByStudent(String studentId) {
    return _submissions.where((s) => s.studentId == studentId).toList();
  }

  bool hasSubmitted(String homeworkId, String studentId) {
    return _submissions.any((s) =>
        s.homeworkId == homeworkId && s.studentId == studentId);
  }
}

5.3 互评引擎实现

class ReviewEngine {
  final List<Review> _reviews = [];

  List<Review> get reviews => List.unmodifiable(_reviews);

  void submitReview(Review review) {
    _reviews.add(review);
  }

  List<Review> getReviewsBySubmission(String submissionId) {
    return _reviews.where((r) => r.submissionId == submissionId).toList();
  }

  double calculateAverageScore(String submissionId) {
    final submissionReviews = getReviewsBySubmission(submissionId);
    if (submissionReviews.isEmpty) return 0;
    
    final totalScore = submissionReviews.fold(0, (sum, r) => sum + r.score);
    return totalScore / submissionReviews.length;
  }

  Map<String, dynamic> getReviewStatistics(String submissionId) {
    final submissionReviews = getReviewsBySubmission(submissionId);
    if (submissionReviews.isEmpty) {
      return {
        'average': 0,
        'count': 0,
        'max': 0,
        'min': 0,
      };
    }
    
    final scores = submissionReviews.map((r) => r.score).toList();
    return {
      'average': calculateAverageScore(submissionId),
      'count': submissionReviews.length,
      'max': scores.reduce((a, b) => a > b ? a : b),
      'min': scores.reduce((a, b) => a < b ? a : b),
    };
  }
}

5.4 成绩统计实现

class GradeCalculator {
  final ReviewEngine reviewEngine;

  GradeCalculator(this.reviewEngine);

  Map<String, double> calculateGrades(List<String> submissionIds) {
    final grades = <String, double>{};
    
    for (final submissionId in submissionIds) {
      grades[submissionId] = reviewEngine.calculateAverageScore(submissionId);
    }
    
    return grades;
  }

  List<MapEntry<String, double>> getRankings(List<String> submissionIds) {
    final grades = calculateGrades(submissionIds);
    final sortedGrades = grades.entries.toList()
      ..sort((a, b) => b.value.compareTo(a.value));
    return sortedGrades;
  }

  Map<String, dynamic> getClassStatistics(List<String> submissionIds) {
    final grades = calculateGrades(submissionIds);
    final scores = grades.values.toList();
    
    if (scores.isEmpty) {
      return {
        'average': 0,
        'max': 0,
        'min': 0,
        'count': 0,
      };
    }
    
    return {
      'average': scores.reduce((a, b) => a + b) / scores.length,
      'max': scores.reduce((a, b) => a > b ? a : b),
      'min': scores.reduce((a, b) => a < b ? a : b),
      'count': scores.length,
    };
  }
}

5.5 文件上传实现

class FileUploadService {
  Future<List<String>> uploadFiles(List<String> filePaths) async {
    // 模拟文件上传
    await Future.delayed(const Duration(seconds: 2));
    
    // 返回模拟的文件URL
    return filePaths.map((path) => 'https://example.com/files/$path').toList();
  }

  Future<bool> deleteFile(String fileUrl) async {
    // 模拟文件删除
    await Future.delayed(const Duration(milliseconds: 500));
    return true;
  }

  String getFileExtension(String fileName) {
    return fileName.split('.').last.toLowerCase();
  }

  bool isValidFileType(String fileName, List<String> allowedTypes) {
    final extension = getFileExtension(fileName);
    return allowedTypes.contains(extension);
  }
}

六、交互设计

6.1 作业提交流程

文件上传 提交服务 作业页 学生 文件上传 提交服务 作业页 学生 选择作业 检查提交状态 未提交 点击提交 上传文件 上传成功 填写说明 确认提交 创建提交记录 提交成功

6.2 互评流程

未完成

已完成

查看待评作业

选择作业

查看提交内容

阅读评分标准

给出评分

填写评语

提交互评

互评数量

互评完成

6.3 成绩查询流程

查看作业列表

选择作业

查看成绩详情

查看互评详情

查看班级排名


七、扩展功能规划

7.1 后续版本规划

2024-01-07 2024-01-14 2024-01-21 2024-01-28 2024-02-04 2024-02-11 2024-02-18 2024-02-25 2024-03-03 2024-03-10 2024-03-17 2024-03-24 2024-03-31 基础UI框架 作业管理功能 提交功能 互评系统 成绩统计 消息通知 教师端管理 数据分析 AI辅助评分 V1.0 基础版本 V1.1 增强版本 V1.2 进阶版本 作业提交与互评系统开发计划

7.2 功能扩展建议

7.2.1 AI辅助

AI功能:

  • 自动评分建议
  • 内容相似度检测
  • 智能评语生成
  • 学习进度分析
7.2.2 协作学习

协作功能:

  • 小组作业
  • 在线讨论
  • 资源共享
  • 学习小组
7.2.3 数据分析

分析功能:

  • 学习轨迹
  • 成绩趋势
  • 能力雷达图
  • 学习报告

八、注意事项

8.1 开发注意事项

  1. 文件大小限制:上传文件需限制大小

  2. 截止时间判断:准确判断作业截止状态

  3. 匿名互评:确保互评匿名性

  4. 成绩计算:正确计算平均成绩

  5. 数据安全:保护学生作业数据

8.2 常见问题

问题 原因 解决方案
文件上传失败 文件过大 限制文件大小
提交超时 网络问题 重试机制
互评分配不均 算法问题 优化分配算法
成绩计算错误 数据问题 数据验证
截止时间错误 时区问题 统一时区

8.3 使用技巧

📚 作业提交与互评系统使用技巧 📚

提交技巧

  • 提前完成作业,避免迟交
  • 检查文件格式和大小
  • 填写详细的提交说明
  • 保存提交记录

互评技巧

  • 认真阅读评分标准
  • 客观公正地评分
  • 给出建设性评语
  • 按时完成互评任务

学习技巧

  • 关注作业截止时间
  • 查看互评反馈改进
  • 对比优秀作业学习
  • 定期查看成绩统计

九、运行说明

9.1 环境要求

环境 版本要求
Flutter SDK >= 3.0.0
Dart SDK >= 2.17.0
存储空间 建议100MB以上
鸿蒙OS API 21+

9.2 运行命令

# 查看可用设备
flutter devices

# 运行到iOS设备
flutter run -t lib/main_homework_peer_review.dart

# 运行到Android设备
flutter run -t lib/main_homework_peer_review.dart

# 运行到Web服务器
flutter run -d web-server -t lib/main_homework_peer_review.dart --web-port 8149

# 运行到鸿蒙设备
flutter run -d 127.0.0.1:5555 lib/main_homework_peer_review.dart

# 代码分析
flutter analyze lib/main_homework_peer_review.dart

十、总结

作业提交与互评系统应用通过作业管理、提交系统、互评模块、成绩查询四大模块,为学生提供了一个便捷的学习管理平台。应用支持多种作业类型、在线提交、匿名互评、成绩统计,提升学习效率。

核心功能涵盖作业管理、提交系统、互评引擎、成绩统计四大模块。作业管理支持多种作业类型和状态管理;提交系统支持文件上传和在线编辑;互评引擎支持匿名互评和评分计算;成绩统计支持成绩查询和排名分析。

应用采用 Material Design 3 设计规范,以教育的蓝色为主色调,象征知识与学习。通过本应用,希望能够帮助学生高效管理作业,提升学习效率,促进学习进步。

作业提交与互评系统——提升学习效率


Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐