GOIMV - 针对 golang 的开源 OJ 平台

本贴最后更新于 1806 天前,其中的信息可能已经东海扬尘

goimv 在线使用地址

下面是 goimv 的截图捕获.PNG
github 工程地址

为什么我要做这个项目

工作的这一段时间,我对 vim golang 和 docker 产生了极大的兴趣。我一直在思考着,这三个技术结合在一起能有什么好玩的东西产生呢。思前想后,我发现校招时候常用的 oj 平台恰好能结合着 3 个技术栈的使用。通过开发一个 oj 平台,能锻炼我对这三个技术的使用。如果能开发给大家,并能对大家的工作学习产生一点帮助,这会给我极大的满足感。

项目总体架构图

c0e73ba31b960ab9098d07b1dac0f47.png
项目主要分为三部分
前端 采用 jquery layui 来实现
后端 采用 golang server 作为服务支持
编辑器相关部分采用 gopls 和 gofmt 作为支持,运行环境采用 docker 做为隔离,有效的保障了宿主机的安全和资源的限制。

web code 编辑器

从事后端开发对同学应该都听说过 vim 吧。我是个不折不扣的 vim 爱好者,平时也有给 vim 开发插件的习惯。也许有不少同学不理解。IDE 不香吗,特别是 vscode 的出现,vim 的云端开发优势荡然无存(目前 vscoderemote 和 vscode-web 两个项目云端开发能力非常强悍)。但是,习惯了 vim 的操作方式,也享受编辑器里面每一个快捷键,每一个扩展能力都心中有数的感觉。
伴随着 vscode 而来的是 LSP 扩展,不少编辑器都通过开始支持 LSP 协议。vim 也是其中一员,通过了解,学习 LSP 和 vim 的原理,加之对 wide 的学习调研,相信 web code 编辑器的开发对我难度不大。我采用 codeMirror 和 golang 的 lsp 插件 gopls 进行搭建,并采用 gofmt 作为格式化功能插件。目前,goimv 项目中的编辑器 支持 代码补全 、 语法高亮 、代码格式化等能力。已经具备了 webide 的部分功能,如果大家有开发 webide 的需求,可以借鉴下我的开发思路。

后端设计思路

goimv 项目设计采用了前后端分离的思想,既渲染逻辑全部由 js 进行。后端负责构建 json 数据提供给前端进行渲染。为了方便题库的添加,在项目初期,我采用文件的方式来管理题目,只要按照规则配置相应的文件夹 题目说明 题目模板、测试用例,就能快速添加题目。当项目小时,这样确实给我带来不少方便。但是,随着随着题目的增多,数据库管理才是一个好的选择。

代码运行环境

在第一版代码设计之初,我是采用宿主机器直接运行代码,少了 docker 的依赖,项目搭建确实快了许多。但是,随着开发的深入,我发现资源的现在,宿主机器的安全性我很难保证。在代码离线做大量的 chroot cgroup 和 namespace 操作已经脱离了我的掌控程度,痛定思痛,我觉得用 docker 来实现运行环境的搭建。
通过提交代码给 docker 容器中,并在 docker 容器做单测试的运行,检验。并配置超时熔断机制。更加有效、安全的实现了我的功能。

后言

goimv 项目是一个比较初期的项目。本人工作日比较忙,出于对技术的热爱,牺牲了自己一个月的周末时间来进行开发,可能某些效果差强人意,如果大家感兴趣,可以参与我的开发,或者给我留言。我会找合适的时间来完善 goimv 项目。

特别感谢 jquery layuid docker LSP 等技术。感谢 b3log 的 wide 项目给我设计上带来的启发,特别借鉴了代码补全这块,让我少了很多探索。
请我喝杯咖啡,微信
15788440521.png

  • golang

    Go 语言是 Google 推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去 10 多年间软件开发的难度令人沮丧。Go 是谷歌 2009 发布的第二款编程语言。

    497 引用 • 1388 回帖 • 278 关注
  • 创造

    你创造的作品可能会帮助到很多人,如果是开源项目的话就更赞了!

    178 引用 • 997 回帖
  • oj
    2 引用 • 1 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...