QDOJ 增加判题机,修改前端,开放权限

本文详细介绍如何利用开源QDOJ进行二次开发,包括增加判题机、配置Docker环境、修改前端显示及开放特定权限的过程。适合对在线评测系统感兴趣的开发者阅读。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

利用开源QDOJ进行二次操作。
https://github.com/QingdaoU/OnlineJudg

增加判题机

  • 在新机子上部署QDOJ,修改docker-compose.yml
version: "3"
services:
  judge-server:
    image: registry.cn-hangzhou.aliyuncs.com/onlinejudge/judge_server
    container_name: judge-server
    restart: always
    read_only: true
    cap_drop:
      - SETPCAP
      - MKNOD
      - NET_BIND_SERVICE
      - SYS_CHROOT
      - SETFCAP
      - FSETID
    tmpfs:
      - /tmp
    volumes:
      - ./data/backend/test_case:/test_case:ro
      - ./data/judge_server/log:/log
      - ./data/judge_server/run:/judger
    environment:
      # 本机的ip和判题机端口
      - SERVICE_URL=http://xx.xx.xx.xx:8081
      # 域名和主机的judge_server的端口号
      - BACKEND_URL=http://xx.xx.xxx.xx:10000/api/judge_server_heartbeat/
      - TOKEN=ctguqmx
      # - judger_debug=1
    ports:
      # 端口自己修改
      - "0.0.0.0:8081:8080"
  oj-rsync-slave:
    image: registry.cn-hangzhou.aliyuncs.com/onlinejudge/oj_rsync
    container_name: oj-rsync-slave
    volumes:
      - ./data/backend/test_case:/test_case
      - ./data/rsync_slave:/log
    environment:
      - RSYNC_MODE=slave 
      - RSYNC_USER=ojrsync 
      # 密码和主判题机设置一样
      - RSYNC_PASSWORD=xxx 
      # 域名
      - RSYNC_MASTER_ADDR=xx.xx.xx
  • 记得重新运行docker-compose up -d
  • 主机的yml配置如下:
version: "2"
services:

  oj-redis:
    image: redis:4.0-alpine
    container_name: oj-redis
    restart: always
    volumes:
      - ./data/redis:/data

  oj-postgres:
    image: postgres:10-alpine
    container_name: oj-postgres
    restart: always
    volumes:
      - ./data/postgres:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=onlinejudge
      - POSTGRES_USER=onlinejudge
      - POSTGRES_PASSWORD=onlinejudge

  judge-server:
    image: registry.cn-hangzhou.aliyuncs.com/onlinejudge/judge_server
    container_name: judge-server
    restart: always
    read_only: true
    cap_drop:
      - SETPCAP
      - MKNOD
      - NET_BIND_SERVICE
      - SYS_CHROOT
      - SETFCAP
      - FSETID
    tmpfs:
      - /tmp
    volumes:
      - ./data/backend/test_case:/test_case:ro
      - ./data/judge_server/log:/log
      - ./data/judge_server/run:/judger
    environment:
      - SERVICE_URL=http://judge-server:8080 
      - BACKEND_URL=http://oj-backend:8000/api/judge_server_heartbeat/
      - TOKEN=ctguqmx
      # - judger_debug=1   
        
  oj-backend: 
    image: registry.cn-hangzhou.aliyuncs.com/onlinejudge/oj_backend
    container_name: oj-backend
    restart: always 
    depends_on:
      - oj-redis
      - oj-postgres 
      - judge-server
    volumes:
      - ./data/backend:/data
      - ./data/backend/dist:/app/dist
    environment:
      - POSTGRES_DB=onlinejudge
      - POSTGRES_USER=onlinejudge
      - POSTGRES_PASSWORD=onlinejudge
      - JUDGE_SERVER_TOKEN=ctguqmx
      # - FORCE_HTTPS=1
      # - STATIC_CDN_HOST=cdn.oj.com
    ports:
      - "0.0.0.0:10000:8000"
      - "0.0.0.0:444:1443"
  oj-rsync-master:
    image: registry.cn-hangzhou.aliyuncs.com/onlinejudge/oj_rsync
    container_name: oj-rsync-master
    volumes:
      - ./data/backend/test_case:/test_case:ro
      - ./data/rsync_master:/log
    environment:
      - RSYNC_MODE=master
      - RSYNC_USER=ojrsync
      - RSYNC_PASSWORD=xxx
    ports:
      - "0.0.0.0:873:873"
  • 判题机就配置完成了,可以在主机子后台进入查看判题机的状态

修改前端

  • 将这个 https://github.com/QingdaoU/OnlineJudgeFE ,克隆或者fork到本地。
  • 在git中操作,第一次修改前端需要执行下面的命令,以后不需要
npm install
NODE_ENV=development npm run build:dll
  • 然后执行
# 自己的oj域名
target=http://xx.xxx.com npm run dev
  • 等待即可
  • 本地会拉取线上api进行测试,本地修改不影响线上
  • 修改完毕以后可以运行 npm run build,会生成一个dist文件夹
  • 放在oj的OnlineJudgeDeploy/data/backend/ 下
  • 相对应的docker-compose已经配置好 ,看上面的配置, 不做说明

开放权限

  • 开放的是普通人员可以看到自己错误了多少案例的权限,之前管理员才可以看到
  • docker ps 查看有哪些容器
  • 进入oj-backend容器中
  • docker exec -it 48b sh
  • -it后面是容器id
  • 在 app/submission/views/oj.py中修改get函数 注释掉过滤判断和查询
  • 在 /app/deploy/nginx/nginx.conf 中修改
  • upstream backend的端口由8080改为8081
    注意:由于本人无法杀掉8080对应进程 所以只能采取这种方法。
  • exit退出容器
  • OnlineJudgeDeploy 目录下重启容器
  • docker stop 48b
  • docker start 48b
  • 48b也为id 到时候docker ps 自行查看
  • 重新进入docker
  • 在app目录下运行
  • nohup python manage.py runserver 0.0.0.0:8081 &
  • 代表后台在8081端口运行
  • netstat -nptl查看发现已经成功
    注意:由于没有设置定时任务,一旦发现oj503或者后台有问题
    请进入 oj-backend的容器中查看manage.py文件是否运行,直接用运行的命令即可,要是更改了nginx文件端口得用stop和start操作容器,现在修改后端直接修改文件即可,保存以后 manage.py文件会自动运行
BNUEP Offline Judge 北京师范大学珠海分校离线评测系统是在具备目测试数据的情况下,能无联网自动评测ACM/ICPC模式的源代码评测系统(即本地测试工具、评测)。它主要有以下功能(所有的功能都无需联网,在本即可实现): *评测核心功能: 基本具备Online Judge的核心功能,如编译代码、内存限定,时间限定,获取代码长度等; *支持多种语言: 1.0 Beta2版本支持C/C++、Pascal、C#、JAVA; *出模式 可以在有标准输入数据和标准程序的情况下,由系统产生标准输出数据,并可批量保存,同时自动命名标准输出数据的后缀; *文本高亮对比 在后,可以直接在本系统中将自己的程序输出和标准输出进行高亮的文本差异对比,操作类似于一些文本对比软件,在一定程度上可以较方便地发现WA代码的出错细节; *支持不限时执行代码 这个功能可以在一定程度上检测TLE代码的算法是否正确的,当然,不能是跑一天都没跑出来的程序; *打包与加密测试数据 使用加密后的数据可以正常,但不显示标准输出。这个功能是为了弥补放出去给别人评测的测试数据是明文的缺陷。加密之后评测方就看不到测试数据。这样就既可以实现离线评测,又可以实现Online Judge上的对测试数据屏蔽; ACM-ICPC简介: ACM国际大学生程序设计竞赛(简称ACM-ICPC)是由国际计算界具有悠久历史的权威性组织ACM学会(Association for Computing Machinery)主办,是世界上公认的规模最大、水平最高、参与人数最多的大学生程序设计竞赛,其宗旨是使大学生能通过计算充分展示自己分析问和解决问的能力。 ACM-ICPC的每一道,都具备目、需求描述、输入格式描述、输出格式描述、样例输入和样例输出共六大信息,有些目还有一定的提示。此外,裁还额外存储了关于该的一组或多组对选手屏蔽的标准输入和标准输出数据,这些测试数据已经经过验证符合意要求。当用户提交一道目的源码之后,裁会将该源码放入评测系统中编译运行,并使用标准输入作为用户程序的输入,然后获取用户程序的输出,接着,将用户程序输出和标准输出比较,最后返回给用户一个评结果。评结果包括:Accepted(测试通过)、Compile Error(编译失败)、Memory Limit Exceed(内存超出限制)、Presentation Error(格式错误)、Runtime Error(运行时错误,可能是数组越界,改写只读的内存,除零,栈或堆溢出等错误)、Time Limit Exceed(时间超出限制)、Wrong Answer(答案错误)等。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值