From 88be032a384b3d9b4d095d5802a11fbf29bd1b12 Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Wed, 12 Aug 2015 14:01:34 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=88=A4=E9=A2=98=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=EF=BC=9B=E5=A2=9E=E5=8A=A0web=20=E5=92=8C=20mongodb?= =?UTF-8?q?=20=E6=95=B0=E6=8D=AE=E5=BA=93=E7=9A=84=E6=93=8D=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- solution/models.py => config/__init__.py | 0 config/config.py | 2 + judge/README.md | 3 ++ judge/judger/language.py | 6 +-- judge/judger/run.py | 43 ++++++++------- oj/local_settings.py | 23 +++++--- oj/urls.py | 2 + problem/views.py | 13 ++--- requirements.txt | 3 +- solution/views.py | 3 -- static/src/js/app/oj/problem/problem.js | 6 ++- {solution => submission}/__init__.py | 0 {solution => submission}/admin.py | 0 .../migrations/__init__.py | 0 submission/models.py | 1 + submission/serializers.py | 10 ++++ {solution => submission}/tests.py | 0 submission/views.py | 52 +++++++++++++++++++ template/oj/problem/problem.html | 6 +-- 19 files changed, 127 insertions(+), 46 deletions(-) rename solution/models.py => config/__init__.py (100%) create mode 100644 config/config.py create mode 100644 judge/README.md delete mode 100644 solution/views.py rename {solution => submission}/__init__.py (100%) rename {solution => submission}/admin.py (100%) rename {solution => submission}/migrations/__init__.py (100%) create mode 100644 submission/models.py create mode 100644 submission/serializers.py rename {solution => submission}/tests.py (100%) create mode 100644 submission/views.py diff --git a/solution/models.py b/config/__init__.py similarity index 100% rename from solution/models.py rename to config/__init__.py diff --git a/config/config.py b/config/config.py new file mode 100644 index 00000000..89d316b8 --- /dev/null +++ b/config/config.py @@ -0,0 +1,2 @@ +# coding=utf-8 +DB_NAME = "db.sqlite3" diff --git a/judge/README.md b/judge/README.md new file mode 100644 index 00000000..c40444b1 --- /dev/null +++ b/judge/README.md @@ -0,0 +1,3 @@ +/usr/bin/docker run -t -i --privileged -v /var/test_case/:/var/judger/test_case/ -v /var/code/:/var/judger/code/ judger /bin/bash + +python judge/judger/run.py -solution_id 1 -max_cpu_time 1 -max_memory 1 -test_case_id 1 diff --git a/judge/judger/language.py b/judge/judger/language.py index 3cbf0025..c79b2967 100644 --- a/judge/judger/language.py +++ b/judge/judger/language.py @@ -2,21 +2,21 @@ languages = { - "1": { + 1: { "name": "c", "src_name": "main.c", "code": 1, "compile_command": "gcc -DONLINE_JUDGE -O2 -w -std=c99 -pipe {src_path} -lm -o {exe_path}main", "execute_command": "{exe_path}main" }, - "2": { + 2: { "name": "cpp", "src_name": "main.cpp", "code": 2, "compile_command": "g++ -DONLINE_JUDGE -O2 -w -std=c++11 -pipe {src_path} -lm -o {exe_path}main", "execute_command": "{exe_path}main" }, - "3": { + 3: { "name": "java", "src_name": "Main.java", "code": 3, diff --git a/judge/judger/run.py b/judge/judger/run.py index 03474cfb..f75e81d8 100644 --- a/judge/judger/run.py +++ b/judge/judger/run.py @@ -1,12 +1,17 @@ # coding=utf-8 import sys +import pymongo + +from bson.objectid import ObjectId + from client import JudgeClient from language import languages from compiler import compile_ from result import result +from settings import judger_workspace +from oj import settings -judger_workspace = "/var/judger/run/" # 简单的解析命令行参数 # 参数有 -solution_id -max_cpu_time -max_memory -test_case_id # 获取到的值是['xxx.py', '-solution_id', '1111', '-max_cpu_time', '1000', '-max_memory', '100', '-test_case_id', 'aaaa'] @@ -16,37 +21,37 @@ max_cpu_time = args[4] max_memory = args[6] test_case_id = args[8] -# todo 去数据库查一下 -language_code = 1 -source_string = """ -#include -int main() -{ - int a, b; - scanf("%d %d", &a, &b); - printf("%d", a + b); - return 0; -} -""" -language = languages[str(language_code)] -src_path = judger_workspace + language["src_name"] + +mongodb_setting = settings.DATABASES["mongodb"] +connection = pymongo.MongoClient(host=mongodb_setting["HOST"], port=mongodb_setting["PORT"]) +collection = connection["oj"]["oj_submission"] + +submission = collection.find_one({"_id": ObjectId(solution_id)}) +if not submission: + exit() + + +# 将代码写入文件 +language = languages[submission["language"]] +src_path = judger_workspace + "run/" + language["src_name"] f = open(src_path, "w") -f.write(source_string) +f.write(submission["code"]) f.close() +# 编译 try: - exe_path = compile_(languages[str(language_code)], src_path, judger_workspace) + exe_path = compile_(language, src_path, judger_workspace + "run/") except Exception as e: print e print [{"result": result["compile_error"]}] exit() -client = JudgeClient(language_code=language_code, +client = JudgeClient(language_code=language, exe_path=exe_path, max_cpu_time=1000000, max_real_time=200000, max_memory=1000, - test_case_dir="/var/test_cases/1/") + test_case_dir="/var/judger/test_case/" + str(test_case_id) + "/") print client.run() diff --git a/oj/local_settings.py b/oj/local_settings.py index a99e0097..2f384965 100644 --- a/oj/local_settings.py +++ b/oj/local_settings.py @@ -1,19 +1,28 @@ # coding=utf-8 import os -LOG_PATH = "LOG/" - -# Database -# https://docs.djangoproject.com/en/1.8/ref/settings/#databases BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + +# 下面是需要自己修改的 +LOG_PATH = "LOG/" + DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), - 'CONN_MAX_AGE': 1, + 'CONN_MAX_AGE': 0.3, + }, + 'mongodb': { + 'HOST': '127.0.0.1', + 'USERNAME': 'root', + 'PASSWORD': 'root', + 'PORT': 27017 } } -# SECURITY WARNING: don't run with debug turned on in production! -DEBUG = True \ No newline at end of file + +DEBUG = True + +TEST_CASE_DIR = "/var/test_case/" + diff --git a/oj/urls.py b/oj/urls.py index e3fbcdaf..5c7171f4 100644 --- a/oj/urls.py +++ b/oj/urls.py @@ -14,6 +14,7 @@ from admin.views import AdminTemplateView from problem.views import ProblemAdminAPIView from problem.views import TestCaseUploadAPIView, ProblemTagAdminAPIView +from submission.views import SubmissionnAPIView urlpatterns = [ @@ -50,5 +51,6 @@ urlpatterns = [ url(r'^my_solution/(?P\d+)/$', "problem.views.my_solution", name="my_solution_page"), url(r'^api/admin/join_group_request/$', JoinGroupRequestAdminAPIView.as_view(), name="join_group_request_admin_api"), + url(r'^api/submission/$', SubmissionnAPIView.as_view(), name="submission_api"), ] diff --git a/problem/views.py b/problem/views.py index f9677b1c..e8f3e9a7 100644 --- a/problem/views.py +++ b/problem/views.py @@ -10,6 +10,8 @@ from django.db.models import Q from rest_framework.views import APIView +from django.conf import settings + from utils.shortcuts import serializer_invalid_response, error_response, success_response, paginate, rand_str from .serizalizers import (CreateProblemSerializer, EditProblemSerializer, ProblemSerializer, ProblemTagSerializer, CreateProblemTagSerializer) @@ -35,13 +37,6 @@ class ProblemTagAdminAPIView(APIView): def get(self, request): return success_response(ProblemTagSerializer(ProblemTag.objects.all(), many=True).data) - keyword = request.GET.get("keyword", None) - if not keyword: - return error_response(u"参数错误") - tags = ProblemTag.objects.filter(name__contains=keyword) - return success_response(ProblemTagSerializer(tags, many=True).data) - - def problem_page(request, problem_id): @@ -159,7 +154,7 @@ class TestCaseUploadAPIView(APIView): f = request.FILES["file"] - tmp_zip = "tmp/" + rand_str() + ".zip" + tmp_zip = "/tmp/" + rand_str() + ".zip" with open(tmp_zip, "wb") as test_case_zip: for chunk in f: test_case_zip.write(chunk) @@ -192,7 +187,7 @@ class TestCaseUploadAPIView(APIView): return error_response(u"测试用例文件不完整,缺少" + name[0] + ".in") problem_test_dir = rand_str() - test_case_dir = "test_case/" + problem_test_dir + "/" + test_case_dir = settings.TEST_CASE_DIR + "test_case/" + problem_test_dir + "/" # 得到了合法的测试用例文件列表 然后去解压缩 os.mkdir(test_case_dir) diff --git a/requirements.txt b/requirements.txt index 9835709e..324d7b0d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -7,4 +7,5 @@ django-rest-swagger celery gunicorn coverage -subprocess32 \ No newline at end of file +subprocess32 +pymongo \ No newline at end of file diff --git a/solution/views.py b/solution/views.py deleted file mode 100644 index 91ea44a2..00000000 --- a/solution/views.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.shortcuts import render - -# Create your views here. diff --git a/static/src/js/app/oj/problem/problem.js b/static/src/js/app/oj/problem/problem.js index a713c07f..5b10211d 100644 --- a/static/src/js/app/oj/problem/problem.js +++ b/static/src/js/app/oj/problem/problem.js @@ -1,8 +1,9 @@ require(["jquery", "code_mirror"], function ($, code_mirror) { var code_editor = code_mirror($("#code-editor")[0], "text/x-csrc"); + var language = "1"; $("#language-selector").change(function () { - var language = $("#language-selector").val(); + language = $("#language-selector").val(); var language_types = {c: "text/x-csrc", cpp: "text/x-c++src", java: "text/x-java"}; code_editor.setOption("mode", language_types[language]); }); @@ -19,6 +20,9 @@ require(["jquery", "code_mirror"], function ($, code_mirror) { $("#submit-code-button").click(function () { show_loading(); + $.ajax({ + + }); setTimeout( function () { $("#a").animate({opacity: '1'}) diff --git a/solution/__init__.py b/submission/__init__.py similarity index 100% rename from solution/__init__.py rename to submission/__init__.py diff --git a/solution/admin.py b/submission/admin.py similarity index 100% rename from solution/admin.py rename to submission/admin.py diff --git a/solution/migrations/__init__.py b/submission/migrations/__init__.py similarity index 100% rename from solution/migrations/__init__.py rename to submission/migrations/__init__.py diff --git a/submission/models.py b/submission/models.py new file mode 100644 index 00000000..9bad5790 --- /dev/null +++ b/submission/models.py @@ -0,0 +1 @@ +# coding=utf-8 diff --git a/submission/serializers.py b/submission/serializers.py new file mode 100644 index 00000000..c64ada6c --- /dev/null +++ b/submission/serializers.py @@ -0,0 +1,10 @@ +# coding=utf-8 +from rest_framework import serializers + + + +class CreateSubmissionSerializer(serializers.Serializer): + problem_id = serializers.IntegerField() + language = serializers.IntegerField() + code = serializers.CharField(max_length=3000) + diff --git a/solution/tests.py b/submission/tests.py similarity index 100% rename from solution/tests.py rename to submission/tests.py diff --git a/submission/views.py b/submission/views.py new file mode 100644 index 00000000..8af26f1f --- /dev/null +++ b/submission/views.py @@ -0,0 +1,52 @@ +# coding=utf-8 +import pymongo +from bson.objectid import ObjectId + +from django.shortcuts import render + +from rest_framework.views import APIView + +from django.conf import settings + +from judge.judger.result import result +from account.decorators import login_required +from utils.shortcuts import serializer_invalid_response, error_response, success_response +from .serializers import CreateSubmissionSerializer + + +class SubmissionnAPIView(APIView): + def _create_mondodb_connection(self): + mongodb_setting = settings.DATABASES["mongodb"] + connection = pymongo.MongoClient(host=mongodb_setting["HOST"], port=mongodb_setting["PORT"]) + return connection["oj"]["oj_submission"] + + # @login_required + def post(self, request): + """ + 提交代码 + --- + request_serializer: CreateSubmissionSerializer + """ + serializer = CreateSubmissionSerializer(data=request.data) + if serializer.is_valid(): + data = serializer.data + data["user_id"] = request.user.id + data["result"] = result["waiting"] + mongodb_setting = settings.DATABASES["mongodb"] + connection = pymongo.MongoClient(host=mongodb_setting["HOST"], port=mongodb_setting["PORT"]) + collection = connection["oj"]["oj_submission"] + submission_id = str(collection.insert_one(data).inserted_id) + return success_response({"submission_id": submission_id}) + else: + return serializer_invalid_response(serializer) + + # @login_required + def get(self, request): + submission_id = request.GET.get("submission_id", None) + if not submission_id: + return error_response(u"参数错误") + submission = self._create_mondodb_connection().find_one({"_id": ObjectId(submission_id), "user_id": result.user.id}) + if submission: + return success_response({"result": submission["result"]}) + else: + return error_response(u"提交不存在") diff --git a/template/oj/problem/problem.html b/template/oj/problem/problem.html index 5a7a3b65..b3f1623e 100644 --- a/template/oj/problem/problem.html +++ b/template/oj/problem/problem.html @@ -66,13 +66,13 @@