OIerDb NG —— 新一代的 OIerDb

OIerDb NG —— 新一代的 OIerDb

分享境约 1.2 千字

笔者有幸能与 OI 巨神虞浩翔等人合作来共同参与 OIerDb NG 的开发,经过数个月的不断改进,目前项目已经初具雏形,特此写下本篇文章对其进行简要介绍。

笔者主要参与了前端用户界面的开发工作,而数据处理部分则主要由虞浩翔完成。

OIerDb NG 的新特性

纯前端处理 —— 效率更高、可离线使用

相比于老版 OIerDb,OIerDb NG 摈弃了传统的「客户端发送查询请求 -> 服务器响应查询请求」的模式,而是采用了纯前端的处理方式 —— 将数据库存储在浏览器的 indexedDB 中,这样在用户查询时无需向服务器发送请求,直接在浏览器端即可处理。这样带来的好处是显而易见的 —— 我们拥有了更快的查询响应速度,同时也减轻了对服务器的压力。至于缺点嘛… 在首次访问网页的时候会下载几 MB 的数据,从统计数据来看,这个过程在大部分情况下最多需要消耗 5 秒左右的时间。

在下载好所有页面的代码、数据加载完成后,即使断开网络连接也能正常使用 OIerDb NG 的基础功能 ,可以在断网打模拟赛 AK 之后找点东西看

查询更灵活 —— 满足用户的不同需求

老版的 OIerDb 只能应对两种类型的查询 —— 以选手或者学校为中心的查询。而新版的 OIerDb 在设计之初就希望具备应对更灵活的查询请求的能力,比如「查询『NOIP 2021』中『河北省』的获奖情况」(如上图所示),更进一步的话还可以「查询『NOIP 2021』中位于『河北省』的『石家庄市第二中学』的获奖情况」(不过这种查询目前还没有在用户界面中实现)。

开发回忆录

在 2021 年 12 月初的一天中午,笔者在 OIerDb 的页面底部发现了 nocriz 的《呼吁广大选手积极参与开发下一代 OIerDb》文章,恰巧笔者在课余时间学习了一些在现在看来非常浅薄的前端技术,于是跃跃欲试地在 12 月 12 号的那天创建了一个新的 GitHub 仓库,并使用模板来提交了 第一个 commit

接下来的几天,笔者利用自己的空余时间来编写代码,终于在 12 月 19 日完成了第一版的 OIerDb NG,并部署到了 Netlify 上。

▲ OIerDb NG 的第一版界面。

当时笔者初学 React,许多知识仍有待学习,再加之笔者忙于完成学业,因此开发进度异常缓慢,网站的功能也有很多欠缺。

第一版完成后没多久,笔者找到了精通 React 的好友 Menci 来帮忙 review 代码。在这个过程中,Menci 提出了许多富有建设性的意见,同时对项目整体进行了一番调整,使其更加现代化、工程化。笔者也从中学到了很多知识。

之后笔者边实践边学习,还从 LibreOJ 的前端中抄来了一些代码,比如手机端的导航栏。

慢慢地,OIerDb NG 上线了 nocriz 的文章中提到的大部分功能(点击图片可以前往对应页面):

▲ 基础 / 高级搜索

▲ 搜索页选手信息卡片

▲ 地区信息学奥林匹克竞赛选手 / 学校排名

▲ 学校 / 比赛详情页面

OIerDb NG 的不足之处

尽管 OIerDb NG 有了一个还算可以的开始,但仍然存在诸多不足之处。

例如,对于网络速度较慢的用户,加载数 MB 的数据可能仍需要十几秒甚至数十秒。并且,即使是一些小更新也需要重新从服务器拉取全量数据,对用户与服务器的流量都是一种浪费。

再比如一些用户可能需要指向性更强的查询条件,目前还没有找到一个比较好的办法来添加到用户界面中。

除了这些之外,还有一些其他的问题存在。这些问题由于团队内的各位开发者都在现实生活中有着自己的工作、学习任务,无法去逐一解决。笔者希望广大对信息学竞赛感兴趣的朋友们能或多或少地参与进 OIerDb NG 的开发,共同为信息学竞赛社区做出贡献。

后记

感谢 nocriz 建立的 OIerDb 网站,为国内的信息学竞赛社区做出了巨大贡献。

也感谢 yhx-12243Menci 参与 OIerDb NG 的开发,完成了许多工作。

最后的最后,给 OIerDb-ng/OIerDb 求一波 Star~

OIerDb NG —— 新一代的 OIerDb
本文作者
发布于
更新于
版权协议
转载或引用本文时请遵守许可协议,注明出处、不得用于商业用途!
喜欢这篇文章?为什么不考虑打赏一下作者呢?
爱发电