/obfpd

Primary LanguageJava

Java 课程大作业实验报告

[toc]

完成功能情况

  • 已完成的功能
    • 用户作业状况展示
      • 展示未完成作业数目及作业项目
      • 展示作业变动
    • 作业管理
      • 作业自动压缩打包
      • 自定义提交项目
      • 定期根据更改自动提交
      • 下载作业附件
    • 课件管理
      • 批量自定义下载课件
    • 论坛
      • 发表任意主题的帖子
      • 查看并回复帖子
    • 搜索
      • 根据标题搜索帖子
    • 设置
      • (自动)更改主题
      • 更改工作目录与缓存目录
      • 其它设置
  • 未完成的功能
    • 作业管理
      • 作业版本控制

关键技术

下面列举了几个客户端和服务端的关键技术特点。

  • 客户端:OBE数据的获取与处理
    • OBE不提供方便的API接口,所有数据操作都需要基于OBE现有的HTML表单、HTML样式中提取。客户端需要爬取的OBE数据,主要是用户个人的各项信息,如每次作业的提交状态,如果已经有评分,亦会爬取该作业对应的打分情况、给分标准等数据。
    • 在数据获取与处理中,主要使用了JSoup提供的查找指定id, class, tag的元素,通过观察OBE的固定样式,以获取用户的各项数据。而对于JSoup难以爬取的、格式较为混乱的数据(例如网页分页的页数等),则混合使用正则表达式匹配的方法,实现了较为精确的匹配。
  • 客户端:本地数据的管理&与OBE的交互
    • 通过类OBEManager,实现对本地数据的管理与操作。对于各项课程,使用OBECourses类进行维护;对于各项作业,使用OBEHomework类进行维护;而对于作业中的附件、课程课件等,则通过OBEAttachment维护。
    • 大致的层次结构是,OBEManager包含了一些元数据,以及一个ArrayList<OBECourses>,表示当前需要管理的课程列表;OBECourses则包含一些课程的元数据,一个ArrayList<OBEHomework>, ArrayList<OBEAttachment>,分别表示当前课程布置的各项作业以及当前课程发布的所有课程附件;OBEHomework则包含单次作业的所有信息,例如提交状态、作业描述、DDL、布置时间、系统中的ID、对应本地的数据文件位置、以及一个ArrayList<OBEAttachment>表示附件列表;OBEAttachment则维护了单个附件的信息,如附件名称、对应OBE系统中的编号等等。
    • 对于数据交互,例如提交某次作业、删除某次作业、提交某次作业对应的文件、下载某些课件或附件等,均封装在以上类中,方便快捷。
    • 上述做法充分利用了Java面向对象的优点,实现了对于多种类型数据的便捷管理。有了先前爬取的OBE数据,在组织本地文件时,需要到用户指定的位置,按照课程/作业/的目录格式组织文件。需要注意的是,由于作业名称中会包含一些非法字符,不能直接作为文件名,此处需要对作业名称进行特殊处理。
    • 对于作业的提交,每次触发手动或自动提交时,前端会返回给后端一个提交作业的列表,后端程序则会递归地对文件列表中的文件和目录进行遍历和压缩,使用ZipOutputStream, FileOutputStream将文件压缩、重命名后,使用先前封装好的函数,发送HTTP POST请求上传数据,再根据OBE服务器返回的信息判断是否提交成功,确认之后的逻辑。
  • 客户端:自动提交作业的实现
    • 对于自动提交,我们使用了一个后台线程,定期扫描所有打开了自动提交功能的作业,判断是否满足自动提交的条件(详见用户使用说明文档),若满足,则调用先前实现的作业提交函数,在后台线程提交作业。
    • 这里的关键在于平衡定期检查与自动提交的时间开销,确定作业自动提交的条件等,最大化地满足用户需要的同时,减小扫描文件造成的性能问题。
  • 服务端:数据库的组织与管理
    • 使用sql实现数据库。
    • 使用数据库的必要性:服务端无法做到追踪各种实时更新,对信息的维护需要在服务端上进行。 数据库维护了关于“课程”“作业”“作业更新”“讨论帖”“回复”的信息。
      • “作业更新”可以定时追踪作业的更新:超越了OBE原本的作业更新提醒功能,而能细化到展示作业的更新内容,包括但不限于:作业描述更新,延迟提交时间,etc。
      • “讨论帖”与“回复”维护了整个论坛系统。
    • 开发者-友好:提供了多样化,易于上手的数据库链接API。后续的新项目开发中,开发者可以在高鲁棒性的API下对数据库进行操作,查询数据库中的课程信息,以及论坛的各类账号查询。
  • 服务端:使用WebSocket与客户端的通信。
    • 使用WebSocket实现网络通信,服务端服务端可以部署在任何一台电脑或者服务器上。
    • HTTP 协议有一个缺陷是通信只能由客户端发起。HTTP 协议做不到服务器主动向客户端推送信息。轮询的效率低,非常浪费资源。使用WebSocket可以实现服务端和客户端之间的实时通信,效率极高。
  • 服务端:爬取OBE的全局数据。
    • 定时对OBE上所有的课程和作业进行爬取,可以从网页上爬取课程名称、教学班好、课程老师、作业名称、作业编号、作业内容、作业发布时间、作业DDL等信息。
    • 爬取过程中使用多线程爬取,只需40$s$便可完成所有作业的爬取和数据库中内容的检查与更新,实际的爬取速度取决于OBE的网速。
    • 对于有更改的作业和进行统计,在用户上线时对用户进行通知。

遇到的问题&解决方案

  • 遇到的问题:在网络通信的过程中,服务端和客户端无法连接和进行通信。

    解决方案:在服务端开放正确的端口,在客户端连接到正确的IP地址和端口,即可解决该问题。

程序亮点

作为一个实用程序,其亮点主要在于实用性。本程序可以实现同学们日常使用OBE时的大部分需求,同时实现了OBE系统当前没有提供的功能(如论坛、批量下载、自动提交、作业提醒等),解决了现实中的问题。

本程序用户友好,界面基于Java Swing技术和FlatLaf库实现,在没有使用复杂图形库的情况下,做出了十分简洁优美的界面,并提供了切换动画效果、自动调整日夜间模式等小功能,便于用户使用。

该程序有极强的可扩展性,仅需进行一些微小的修改,便可以将该程序用于微人大等。

待实现功能&未解决问题

对于自动提交作业的功能,原本计划实现一个简单的、类Git的实现,帮助同学们对提交作业的版本进行管理,但由于当前本组工作量已经非常大(代码240KB,行数6000+),可能没有足够的时间在DDL之前完成这个功能。