From 616aed6a5c445ac03c5556c778d54fd5f38b05b6 Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Mon, 17 Aug 2015 20:56:42 +0800 Subject: [PATCH 01/22] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E9=A2=98=E7=9B=AE?= =?UTF-8?q?=E6=8F=90=E4=BA=A4=E6=80=BB=E6=95=B0=E5=92=8C=E9=80=9A=E8=BF=87?= =?UTF-8?q?=E7=8E=87=E7=BB=9F=E8=AE=A1=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- oj/db_router.py | 5 ++--- .../migrations/0002_submission_is_counted.py | 19 +++++++++++++++++++ submission/models.py | 1 + submission/views.py | 15 +++++++++++++++ template/oj/problem/problem_list.html | 2 +- 5 files changed, 38 insertions(+), 4 deletions(-) create mode 100644 submission/migrations/0002_submission_is_counted.py diff --git a/oj/db_router.py b/oj/db_router.py index d8c1659b..3a20427c 100644 --- a/oj/db_router.py +++ b/oj/db_router.py @@ -17,7 +17,6 @@ class DBRouter(object): def allow_migrate(self, db, app_label, model=None, **hints): if app_label == "submission": - if db == "submission": - return db == app_label + return db == app_label else: - return db == "default" \ No newline at end of file + return db == "default" diff --git a/submission/migrations/0002_submission_is_counted.py b/submission/migrations/0002_submission_is_counted.py new file mode 100644 index 00000000..169a9a36 --- /dev/null +++ b/submission/migrations/0002_submission_is_counted.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('submission', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='submission', + name='is_counted', + field=models.BooleanField(default=False), + ), + ] diff --git a/submission/models.py b/submission/models.py index a2fcfde8..3442183d 100644 --- a/submission/models.py +++ b/submission/models.py @@ -18,6 +18,7 @@ class Submission(models.Model): accepted_answer_time = models.IntegerField(blank=True, null=True) # 这个字段只有在题目是accepted 的时候才会用到,比赛题目的提交可能还会有得分等信息,存储在这里面 accepted_answer_info = models.TextField(blank=True, null=True) + is_counted = models.BooleanField(default=False) class Meta: db_table = "submission" diff --git a/submission/views.py b/submission/views.py index 10c77867..f8c631bf 100644 --- a/submission/views.py +++ b/submission/views.py @@ -28,6 +28,9 @@ class SubmissionAPIView(APIView): data = serializer.data try: problem = Problem.objects.get(id=data["problem_id"]) + # 更新问题的总提交计数 + problem.total_submit_number += 1 + problem.save() except Problem.DoesNotExist: return error_response(u"题目不存在") submission = Submission.objects.create(user_id=request.user.id, language=int(data["language"]), @@ -51,6 +54,18 @@ class SubmissionAPIView(APIView): submission = Submission.objects.get(id=submission_id, user_id=request.user.id) except Submission.DoesNotExist: return error_response(u"提交不存在") + # 标记这个submission 已经被统计 + if not submission.is_counted: + submission.is_counted = True + submission.save() + if submission.result == result["accepted"]: + # 更新题目的 ac 计数器 + try: + problem = Problem.objects.get(id=submission.problem_id) + problem.total_accepted_number += 1 + problem.save() + except Problem.DoesNotExist: + pass response_data = {"result": submission.result} if submission.result == 0: response_data["accepted_answer_time"] = submission.accepted_answer_time diff --git a/template/oj/problem/problem_list.html b/template/oj/problem/problem_list.html index 53844de3..012f5d27 100644 --- a/template/oj/problem/problem_list.html +++ b/template/oj/problem/problem_list.html @@ -30,7 +30,7 @@ {{ item.id }} {{ item.title }} {{ item.difficulty }} - {{ item|accepted_radio }} + {{ item|accepted_radio }}% {% endfor %} From 016a49a53b766e5c903f11cf48ca32635b018cf5 Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Tue, 18 Aug 2015 16:03:25 +0800 Subject: [PATCH 02/22] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=99=BB=E9=99=86?= =?UTF-8?q?=E5=90=8E=E8=B7=B3=E8=BD=AC=E5=9B=9E=E6=9D=A5=E6=BA=90=E9=A1=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- static/src/js/app/oj/account/login.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/static/src/js/app/oj/account/login.js b/static/src/js/app/oj/account/login.js index 5ef83b98..bc95cf5b 100644 --- a/static/src/js/app/oj/account/login.js +++ b/static/src/js/app/oj/account/login.js @@ -11,7 +11,14 @@ require(["jquery", "bsAlert", "csrfToken", "validator"], function ($, bsAlert, c method: "post", success: function (data) { if (!data.code) { - window.location.href = "/"; + //成功登陆 + var ref = document.referrer; + if(ref){ + if(ref.split("/")[2] == location.hostname){ + location.href = ref; + } + } + location.href = "/"; } else { bsAlert(data.data); From 97ffd604cf670c5c3a60d1ef12f9cd95eda36896 Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Tue, 18 Aug 2015 16:03:49 +0800 Subject: [PATCH 03/22] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=86=E7=BB=84?= =?UTF-8?q?=E5=86=85=E5=8F=AF=E8=A7=81=E7=9A=84=E5=85=AC=E5=91=8A=EF=BC=8C?= =?UTF-8?q?=E7=BC=96=E8=BE=91=E4=BA=86=E5=AF=B9=E5=BA=94=E7=9A=84=20models?= =?UTF-8?q?=20=E5=92=8C=20js?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../migrations/0002_auto_20150818_1445.py | 26 +++ announcement/models.py | 4 + announcement/serializers.py | 4 + announcement/views.py | 52 +++++- oj/urls.py | 3 +- .../js/app/admin/announcement/announcement.js | 150 ++++++++++++++---- template/admin/announcement/announcement.html | 42 ++++- 7 files changed, 235 insertions(+), 46 deletions(-) create mode 100644 announcement/migrations/0002_auto_20150818_1445.py diff --git a/announcement/migrations/0002_auto_20150818_1445.py b/announcement/migrations/0002_auto_20150818_1445.py new file mode 100644 index 00000000..771b466a --- /dev/null +++ b/announcement/migrations/0002_auto_20150818_1445.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('group', '0004_merge'), + ('announcement', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='announcement', + name='groups', + field=models.ManyToManyField(to='group.Group'), + ), + migrations.AddField( + model_name='announcement', + name='is_global', + field=models.BooleanField(default=True), + preserve_default=False, + ), + ] diff --git a/announcement/models.py b/announcement/models.py index 491c2192..1dfa6060 100644 --- a/announcement/models.py +++ b/announcement/models.py @@ -2,6 +2,7 @@ from django.db import models from account.models import User +from group.models import Group class Announcement(models.Model): @@ -17,6 +18,9 @@ class Announcement(models.Model): last_update_time = models.DateTimeField(auto_now=True) # 是否可见 false的话相当于删除 visible = models.BooleanField(default=True) + # 公告可见范围 0是全局可见 1是部分小组可见,需要在下面的字段中存储可见的小组 + is_global = models.BooleanField() + groups = models.ManyToManyField(Group) class Meta: db_table = "announcement" diff --git a/announcement/serializers.py b/announcement/serializers.py index d6380b06..d896564a 100644 --- a/announcement/serializers.py +++ b/announcement/serializers.py @@ -8,6 +8,8 @@ from .models import Announcement class CreateAnnouncementSerializer(serializers.Serializer): title = serializers.CharField(max_length=50) content = serializers.CharField(max_length=10000) + is_global = serializers.BooleanField() + groups = serializers.ListField(child=serializers.IntegerField(), allow_empty=True) class AnnouncementSerializer(serializers.ModelSerializer): @@ -28,3 +30,5 @@ class EditAnnouncementSerializer(serializers.Serializer): title = serializers.CharField(max_length=50) content = serializers.CharField(max_length=10000) visible = serializers.BooleanField() + is_global = serializers.BooleanField() + groups = serializers.ListField(child=serializers.IntegerField()) diff --git a/announcement/views.py b/announcement/views.py index 07d1e642..8059b908 100644 --- a/announcement/views.py +++ b/announcement/views.py @@ -5,6 +5,8 @@ from django.shortcuts import render from utils.shortcuts import serializer_invalid_response, error_response, success_response from utils.shortcuts import paginate, error_page +from account.models import SUPER_ADMIN, ADMIN +from group.models import Group from .models import Announcement from .serializers import (CreateAnnouncementSerializer, AnnouncementSerializer, EditAnnouncementSerializer) @@ -28,9 +30,26 @@ class AnnouncementAdminAPIView(APIView): serializer = CreateAnnouncementSerializer(data=request.data) if serializer.is_valid(): data = serializer.data - Announcement.objects.create(title=data["title"], - content=data["content"], - created_by=request.user) + groups = [] + # 如果不是全局公告,就去查询一下小组的id 列表中的内容,注意用户身份 + if not data["is_global"]: + if request.user.admin_type == SUPER_ADMIN: + groups = Group.objects.filter(id__in=data["groups"]) + else: + groups = Group.objects.filter(id__in=data["groups"], admin=request.user) + if not groups.count(): + return error_response(u"至少选择一个小组") + else: + if request.user.admin_type != SUPER_ADMIN: + return error_response(u"只有超级管理员可以创建全局公告") + + announcement = Announcement.objects.create(title=data["title"], + content=data["content"], + created_by=request.user, + is_global=data["is_global"]) + + announcement.groups.add(*groups) + return success_response(u"公告发布成功!") else: return serializer_invalid_response(serializer) @@ -46,26 +65,43 @@ class AnnouncementAdminAPIView(APIView): if serializer.is_valid(): data = serializer.data try: - announcement = Announcement.objects.get(id=data["id"]) + if request.user.admin_type == SUPER_ADMIN: + announcement = Announcement.objects.get(id=data["id"]) + else: + announcement = Announcement.objects.get(id=data["id"], admin=request.user) except Announcement.DoesNotExist: - return error_response(u"该公告不存在!") + return error_response(u"公告不存在") + groups = [] + if not data["is_global"]: + if request.user.admin_type == SUPER_ADMIN: + groups = Group.objects.filter(id__in=data["groups"]) + else: + groups = Group.objects.filter(id__in=data["groups"], admin=request.user) + if not groups.count(): + return error_response(u"至少选择一个小组") announcement.title = data["title"] announcement.content = data["content"] announcement.visible = data["visible"] + announcement.is_global = data["is_global"] announcement.save() + + # 重建小组和公告的对应关系 + announcement.groups.clear() + announcement.groups.add(*groups) return success_response(AnnouncementSerializer(announcement).data) else: return serializer_invalid_response(serializer) - -class AnnouncementAPIView(APIView): def get(self, request): """ 公告分页json api接口 --- response_serializer: AnnouncementSerializer """ - announcement = Announcement.objects.all().order_by("-last_update_time") + if request.user.admin_type == SUPER_ADMIN: + announcement = Announcement.objects.all().order_by("-last_update_time") + else: + announcement = Announcement.objects.filter(admin=request.user) visible = request.GET.get("visible", None) if visible: announcement = announcement.filter(visible=(visible == "true")) diff --git a/oj/urls.py b/oj/urls.py index ba7c9977..ef9e5032 100644 --- a/oj/urls.py +++ b/oj/urls.py @@ -6,7 +6,7 @@ from django.views.generic import TemplateView from account.views import (UserLoginAPIView, UsernameCheckAPIView, UserRegisterAPIView, UserChangePasswordAPIView, EmailCheckAPIView, UserAdminAPIView, UserInfoAPIView) -from announcement.views import AnnouncementAPIView, AnnouncementAdminAPIView +from announcement.views import AnnouncementAdminAPIView from group.views import (GroupAdminAPIView, GroupMemberAdminAPIView, JoinGroupAPIView, JoinGroupRequestAdminAPIView) @@ -38,7 +38,6 @@ urlpatterns = [ url(r'^problem/(?P\d+)/$', "problem.views.problem_page", name="problem_page"), url(r'^announcement/(?P\d+)/$', "announcement.views.announcement_page", name="announcement_page"), - url(r'^api/announcements/$', AnnouncementAPIView.as_view(), name="announcement_list_api"), url(r'^admin/contest/$', TemplateView.as_view(template_name="admin/contest/add_contest.html"), name="add_contest_page"), url(r'^problems/$', "problem.views.problem_list_page", name="problem_list_page"), diff --git a/static/src/js/app/admin/announcement/announcement.js b/static/src/js/app/admin/announcement/announcement.js index c4eebf65..7dd2051b 100644 --- a/static/src/js/app/admin/announcement/announcement.js +++ b/static/src/js/app/admin/announcement/announcement.js @@ -1,8 +1,5 @@ require(["jquery", "avalon", "csrfToken", "bsAlert", "editor", "validator"], function ($, avalon, csrfTokenHeader, bsAlert, editor) { - - - avalon.ready(function () { avalon.vmodels.announcement = null; @@ -20,7 +17,11 @@ require(["jquery", "avalon", "csrfToken", "bsAlert", "editor", "validator"], totalPage: 1, // 总页数 showVisibleOnly: false, //仅显示可见公告 // 编辑 + newTitle: "", announcementVisible: 0, + showGlobalViewRadio: true, + isGlobal: true, + allGroups: [], getState: function (el) { //获取公告当前状态,显示 if (el.visible) return "可见"; @@ -47,49 +48,75 @@ require(["jquery", "avalon", "csrfToken", "bsAlert", "editor", "validator"], }, editAnnouncement: function (announcement) { - $("#newTitle").val(announcement.title); + vm.newTitle = announcement.title; editAnnouncementEditor.setValue(announcement.content); vm.announcementVisible = announcement.visible; if (vm.editingAnnouncementId == announcement.id) vm.editingAnnouncementId = 0; else vm.editingAnnouncementId = announcement.id; + vm.isGlobal = announcement.is_global; + for (var i = 0; i < announcement.groups.length; i++) { + for (var j = 0; j < vm.allGroups.length; j++) { + if (announcement.groups[i] == vm.allGroups[j].id) { + vm.allGroups[j].isSelected = true; + } + } + } editAnnouncementEditor.focus(); }, cancelEdit: function () { vm.editingAnnouncementId = 0; }, submitChange: function () { - var title = $("#newTitle").val(); + var title = vm.newTitle; var content = editAnnouncementEditor.getValue(); - if (content && title) { - $.ajax({ - beforeSend: csrfTokenHeader, - url: "/api/admin/announcement/", - dataType: "json", - method: "put", - data: { - id: vm.editingAnnouncementId, - title: title, - content: content, - visible: vm.announcementVisible - }, - success: function (data) { - if (!data.code) { - bsAlert("修改成功"); - vm.editingAnnouncementId = 0; - getPageData(1); - } - else { - bsAlert(data.data); - } + if (content == "" || title == "") { + bsAlert("标题和内容都不能为空"); + return false; + } + + var selectedGroups = []; + if (!vm.isGlobal) { + for (var i = 0; i < vm.allGroups.length; i++) { + if (vm.allGroups[i].isSelected) { + selectedGroups.push(vm.allGroups[i].id); } - }); + } } - else { - bsAlert("标题和公告内容不得为空"); + + if (!vm.isGlobal && !selectedGroups.length) { + bsAlert("请至少选择一个小组"); + return false; } + + $.ajax({ + beforeSend: csrfTokenHeader, + url: "/api/admin/announcement/", + contentType: "application/json", + dataType: "json", + method: "put", + data: JSON.stringify({ + id: vm.editingAnnouncementId, + title: title, + content: content, + visible: vm.announcementVisible, + is_global: vm.isGlobal, + groups: selectedGroups + }), + success: function (data) { + if (!data.code) { + bsAlert("修改成功"); + vm.editingAnnouncementId = 0; + getPageData(1); + } + else { + bsAlert(data.data); + } + } + }); + } }); vm.$watch("showVisibleOnly", function () { @@ -98,8 +125,44 @@ require(["jquery", "avalon", "csrfToken", "bsAlert", "editor", "validator"], getPageData(1); + $.ajax({ + url: "/api/admin/group/", + method: "get", + dataType: "json", + success: function (data) { + if (!data.code) { + if (!data.data.length) { + bsAlert("您的用户权限只能创建组内公告,但是您还没有创建过小组"); + return; + } + for (var i = 0; i < data.data.length; i++) { + var item = data.data[i]; + item["isSelected"] = false; + vm.allGroups.push(item); + } + } + else { + bsAlert(data.data); + } + } + }); + + $.ajax({ + url: "/api/user/", + method: "get", + dataType: "json", + success: function (data) { + if (!data.code) { + if (data.data.admin_type == 1) { + vm.isGlobal = false; + vm.showGlobalViewRadio = false; + } + } + } + }); + function getPageData(page) { - var url = "/api/announcements/?paging=true&page=" + page + "&page_size=10"; + var url = "/api/admin/announcement/?paging=true&page=" + page + "&page_size=10"; if (vm.showVisibleOnly) url += "&visible=true"; $.ajax({ @@ -122,9 +185,7 @@ require(["jquery", "avalon", "csrfToken", "bsAlert", "editor", "validator"], } //新建公告表单验证与数据提交 - - - $('form').validator().on('submit', function (e) { + $("#announcement-form").validator().on('submit', function (e) { if (!e.isDefaultPrevented()) { var title = $("#title").val(); var content = createAnnouncementEditor.getValue(); @@ -132,10 +193,29 @@ require(["jquery", "avalon", "csrfToken", "bsAlert", "editor", "validator"], bsAlert("请填写公告内容"); return false; } + var selectedGroups = []; + if (!vm.isGlobal) { + for (var i = 0; i < vm.allGroups.length; i++) { + if (vm.allGroups[i].isSelected) { + selectedGroups.push(vm.allGroups[i].id); + } + } + } + + if (!vm.isGlobal && !selectedGroups.length) { + bsAlert("请至少选择一个小组"); + return false; + } $.ajax({ beforeSend: csrfTokenHeader, url: "/api/admin/announcement/", - data: {title: title, content: content}, + contentType: "application/json", + data: JSON.stringify({ + title: title, + content: content, + is_global: vm.isGlobal, + groups: selectedGroups + }), dataType: "json", method: "post", success: function (data) { @@ -148,7 +228,7 @@ require(["jquery", "avalon", "csrfToken", "bsAlert", "editor", "validator"], bsAlert(data.data); } } - }) + }); return false; } }) diff --git a/template/admin/announcement/announcement.html b/template/admin/announcement/announcement.html index 5c0d4d9a..3bfd605d 100644 --- a/template/admin/announcement/announcement.html +++ b/template/admin/announcement/announcement.html @@ -7,6 +7,7 @@ 创建时间 更新时间 创建者 + 可见范围 状态 @@ -16,6 +17,7 @@ {{ el.create_time|date("yyyy-MM-dd HH:mm:ss")}} {{ el.last_update_time|date("yyyy-MM-dd HH:mm:ss")}} {{ el.created_by.username }} + {{ getState(el)}} @@ -36,7 +38,7 @@
-
+
@@ -44,6 +46,25 @@
+
+ + +
+ + 全局可见 + + + 小组内可见 + +
+ +
+
+ +
+   {{ el.name }} +
+
   @@ -65,6 +86,25 @@
+
+ + +
+ + 全局可见 + + + 小组内可见 + +
+ +
+
+ +
+   {{ el.name }} +
+
From 46321e424982fdcfd97b4a13fd5cf27af825776e Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Tue, 18 Aug 2015 16:52:44 +0800 Subject: [PATCH 04/22] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E3=80=81404=E9=A1=B5=E9=9D=A2=E3=80=81500?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E7=9A=84=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- template/404.html | 151 +++++++++++++++++++++++++++++++++++ template/500.html | 151 +++++++++++++++++++++++++++++++++++ template/utils/error.html | 161 +++++++++++++++++++++++++++++++++++--- template/utils/info.html | 10 --- 4 files changed, 453 insertions(+), 20 deletions(-) create mode 100644 template/404.html create mode 100644 template/500.html delete mode 100644 template/utils/info.html diff --git a/template/404.html b/template/404.html new file mode 100644 index 00000000..3d1a5051 --- /dev/null +++ b/template/404.html @@ -0,0 +1,151 @@ +{% extends "oj_base.html" %} +{% block css_block %} + +{% endblock %} +{% block body %} +
+

404 - Page Not Found

+
+
+ +
// C
+#include <stdio.h>
+int main()
+{
+    printf("404 - Page Not Found");
+    return 0;
+}
+
// C++
+#include <iostream>
+int main()
+{
+    std::cout << "404 - Page Not Found" << std::endl;
+    return 0;
+}
+
// Java
+public class Main
+{
+    public static void main(String[] args)
+    {
+        System.out.println("404 - Page Not Found");
+    }
+}
+
// JavaScript
+console.log("404 - Page Not Found")
+
// Python
+print "404 - Page Not Found"
+ +
+
+{% endblock %} \ No newline at end of file diff --git a/template/500.html b/template/500.html new file mode 100644 index 00000000..28349ba1 --- /dev/null +++ b/template/500.html @@ -0,0 +1,151 @@ +{% extends "oj_base.html" %} +{% block css_block %} + +{% endblock %} +{% block body %} +
+

500 - Server Error

+
+
+ +
// C
+#include <stdio.h>
+int main()
+{
+    printf("500 - Server Error");
+    return 0;
+}
+
// C++
+#include <iostream>
+int main()
+{
+    std::cout << "500 - Server Error" << std::endl;
+    return 0;
+}
+
// Java
+public class Main
+{
+    public static void main(String[] args)
+    {
+        System.out.println("500 - Server Error");
+    }
+}
+
// JavaScript
+console.log("500 - Server Error")
+
// Python
+print "500 - Server Error"
+ +
+
+{% endblock %} \ No newline at end of file diff --git a/template/utils/error.html b/template/utils/error.html index 307b5b01..98fbeefc 100644 --- a/template/utils/error.html +++ b/template/utils/error.html @@ -1,10 +1,151 @@ - - - - - - - -{{ error }} - - \ No newline at end of file +{% extends "oj_base.html" %} +{% block css_block %} + +{% endblock %} +{% block body %} +
+

出错了~~ {{ error }}

+
+
+ +
// C
+#include <stdio.h>
+int main()
+{
+    printf("An error occurred\n");
+    return 0;
+}
+
// C++
+#include <iostream>
+int main()
+{
+    std::cout << "An error occurred" << std::endl;
+    return 0;
+}
+
// Java
+public class Main
+{
+    public static void main(String[] args)
+    {
+        System.out.println("An error occurred");
+    }
+}
+
// JavaScript
+console.log("An error occurred\n")
+
// Python
+print "An error occurred"
+ +
+
+{% endblock %} \ No newline at end of file diff --git a/template/utils/info.html b/template/utils/info.html deleted file mode 100644 index bf083727..00000000 --- a/template/utils/info.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - -{{ info }} - - \ No newline at end of file From c98abddfeed3088626813acf6fbf3c83feca7e0c Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Wed, 19 Aug 2015 08:21:25 +0800 Subject: [PATCH 05/22] fix typo --- announcement/views.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/announcement/views.py b/announcement/views.py index 8059b908..767b2065 100644 --- a/announcement/views.py +++ b/announcement/views.py @@ -36,7 +36,7 @@ class AnnouncementAdminAPIView(APIView): if request.user.admin_type == SUPER_ADMIN: groups = Group.objects.filter(id__in=data["groups"]) else: - groups = Group.objects.filter(id__in=data["groups"], admin=request.user) + groups = Group.objects.filter(id__in=data["groups"], created_by=request.user) if not groups.count(): return error_response(u"至少选择一个小组") else: @@ -68,7 +68,7 @@ class AnnouncementAdminAPIView(APIView): if request.user.admin_type == SUPER_ADMIN: announcement = Announcement.objects.get(id=data["id"]) else: - announcement = Announcement.objects.get(id=data["id"], admin=request.user) + announcement = Announcement.objects.get(id=data["id"], created_by=request.user) except Announcement.DoesNotExist: return error_response(u"公告不存在") groups = [] @@ -76,7 +76,7 @@ class AnnouncementAdminAPIView(APIView): if request.user.admin_type == SUPER_ADMIN: groups = Group.objects.filter(id__in=data["groups"]) else: - groups = Group.objects.filter(id__in=data["groups"], admin=request.user) + groups = Group.objects.filter(id__in=data["groups"], created_by=request.user) if not groups.count(): return error_response(u"至少选择一个小组") announcement.title = data["title"] @@ -101,7 +101,7 @@ class AnnouncementAdminAPIView(APIView): if request.user.admin_type == SUPER_ADMIN: announcement = Announcement.objects.all().order_by("-last_update_time") else: - announcement = Announcement.objects.filter(admin=request.user) + announcement = Announcement.objects.filter(created_by=request.user) visible = request.GET.get("visible", None) if visible: announcement = announcement.filter(visible=(visible == "true")) From 096873c02812f2319c6768ee3c08ad1ffea5428c Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Wed, 19 Aug 2015 16:39:04 +0800 Subject: [PATCH 06/22] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E9=98=9F=E5=88=97?= =?UTF-8?q?=E9=95=BF=E5=BA=A6=E7=BB=9F=E8=AE=A1=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- judge/judger_controller/tasks.py | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/judge/judger_controller/tasks.py b/judge/judger_controller/tasks.py index e8066892..e61da72b 100644 --- a/judge/judger_controller/tasks.py +++ b/judge/judger_controller/tasks.py @@ -1,14 +1,21 @@ # coding=utf-8 -# from __future__ import absolute_import +import datetime +import redis import MySQLdb import subprocess from ..judger.result import result from ..judger_controller.celery import app -from settings import docker_config, source_code_dir, test_case_dir, submission_db +from settings import docker_config, source_code_dir, test_case_dir, submission_db, redis_config @app.task def judge(submission_id, time_limit, memory_limit, test_case_id): + # 先更新判题队列长度 + r = redis.StrictRedis(host=redis_config["host"], port=redis_config["port"], db=redis_config["db"]) + length = r.incr("queue_length") + now = datetime.datetime.now() + # 使用hash key是今天的日期 value 的 key 是当前时分秒 12:02:03 value 是队列长度 + r.hset(str(datetime.date.today()), ":".join([str(now.hour), str(now.minute), str(now.second)]), length) try: command = "%s run -t -i --privileged --rm=true " \ "-v %s:/var/judger/test_case/ " \ @@ -36,3 +43,7 @@ def judge(submission_id, time_limit, memory_limit, test_case_id): (result["system_error"], str(e), submission_id)) conn.commit() conn.close() + r.decr("queue_length") + now = datetime.datetime.now() + # 使用hash key是今天的日期 value 的 key 是当前时分秒 12:02:03 value 是队列长度 + r.hset(str(datetime.date.today()), ":".join([str(now.hour), str(now.minute), str(now.second)]), length) From 016dc1b79f760dbf72510179fb0426e933c4c174 Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Wed, 19 Aug 2015 20:16:30 +0800 Subject: [PATCH 07/22] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=96=B0=E7=9A=84?= =?UTF-8?q?=E9=A6=96=E9=A1=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- static/src/css/animate/animate.css | 3272 +++++++++++++++++++ static/src/css/fullpage/jquery.fullPage.css | 208 ++ static/src/img/index/a.png | Bin 0 -> 18850 bytes static/src/img/index/c.png | Bin 0 -> 18168 bytes static/src/img/index/m.png | Bin 0 -> 23119 bytes template/oj/index.html | 158 +- 6 files changed, 3609 insertions(+), 29 deletions(-) create mode 100755 static/src/css/animate/animate.css create mode 100755 static/src/css/fullpage/jquery.fullPage.css create mode 100755 static/src/img/index/a.png create mode 100755 static/src/img/index/c.png create mode 100755 static/src/img/index/m.png diff --git a/static/src/css/animate/animate.css b/static/src/css/animate/animate.css new file mode 100755 index 00000000..54fa40e1 --- /dev/null +++ b/static/src/css/animate/animate.css @@ -0,0 +1,3272 @@ +@charset "UTF-8"; + +/*! +Animate.css - http://daneden.me/animate +Licensed under the MIT license - http://opensource.org/licenses/MIT + +Copyright (c) 2015 Daniel Eden +*/ + +.animated { + -webkit-animation-duration: 1s; + animation-duration: 1s; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; +} + +.animated.infinite { + -webkit-animation-iteration-count: infinite; + animation-iteration-count: infinite; +} + +.animated.hinge { + -webkit-animation-duration: 2s; + animation-duration: 2s; +} + +.animated.bounceIn, +.animated.bounceOut { + -webkit-animation-duration: .75s; + animation-duration: .75s; +} + +.animated.flipOutX, +.animated.flipOutY { + -webkit-animation-duration: .75s; + animation-duration: .75s; +} + +@-webkit-keyframes bounce { + from, 20%, 53%, 80%, 100% { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + -webkit-transform: translate3d(0,0,0); + transform: translate3d(0,0,0); + } + + 40%, 43% { + -webkit-animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060); + animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060); + -webkit-transform: translate3d(0, -30px, 0); + transform: translate3d(0, -30px, 0); + } + + 70% { + -webkit-animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060); + animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060); + -webkit-transform: translate3d(0, -15px, 0); + transform: translate3d(0, -15px, 0); + } + + 90% { + -webkit-transform: translate3d(0,-4px,0); + transform: translate3d(0,-4px,0); + } +} + +@keyframes bounce { + from, 20%, 53%, 80%, 100% { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + -webkit-transform: translate3d(0,0,0); + transform: translate3d(0,0,0); + } + + 40%, 43% { + -webkit-animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060); + animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060); + -webkit-transform: translate3d(0, -30px, 0); + transform: translate3d(0, -30px, 0); + } + + 70% { + -webkit-animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060); + animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060); + -webkit-transform: translate3d(0, -15px, 0); + transform: translate3d(0, -15px, 0); + } + + 90% { + -webkit-transform: translate3d(0,-4px,0); + transform: translate3d(0,-4px,0); + } +} + +.bounce { + -webkit-animation-name: bounce; + animation-name: bounce; + -webkit-transform-origin: center bottom; + transform-origin: center bottom; +} + +@-webkit-keyframes flash { + from, 50%, 100% { + opacity: 1; + } + + 25%, 75% { + opacity: 0; + } +} + +@keyframes flash { + from, 50%, 100% { + opacity: 1; + } + + 25%, 75% { + opacity: 0; + } +} + +.flash { + -webkit-animation-name: flash; + animation-name: flash; +} + +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ + +@-webkit-keyframes pulse { + from { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } + + 50% { + -webkit-transform: scale3d(1.05, 1.05, 1.05); + transform: scale3d(1.05, 1.05, 1.05); + } + + 100% { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} + +@keyframes pulse { + from { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } + + 50% { + -webkit-transform: scale3d(1.05, 1.05, 1.05); + transform: scale3d(1.05, 1.05, 1.05); + } + + 100% { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} + +.pulse { + -webkit-animation-name: pulse; + animation-name: pulse; +} + +@-webkit-keyframes rubberBand { + from { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } + + 30% { + -webkit-transform: scale3d(1.25, 0.75, 1); + transform: scale3d(1.25, 0.75, 1); + } + + 40% { + -webkit-transform: scale3d(0.75, 1.25, 1); + transform: scale3d(0.75, 1.25, 1); + } + + 50% { + -webkit-transform: scale3d(1.15, 0.85, 1); + transform: scale3d(1.15, 0.85, 1); + } + + 65% { + -webkit-transform: scale3d(.95, 1.05, 1); + transform: scale3d(.95, 1.05, 1); + } + + 75% { + -webkit-transform: scale3d(1.05, .95, 1); + transform: scale3d(1.05, .95, 1); + } + + 100% { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} + +@keyframes rubberBand { + from { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } + + 30% { + -webkit-transform: scale3d(1.25, 0.75, 1); + transform: scale3d(1.25, 0.75, 1); + } + + 40% { + -webkit-transform: scale3d(0.75, 1.25, 1); + transform: scale3d(0.75, 1.25, 1); + } + + 50% { + -webkit-transform: scale3d(1.15, 0.85, 1); + transform: scale3d(1.15, 0.85, 1); + } + + 65% { + -webkit-transform: scale3d(.95, 1.05, 1); + transform: scale3d(.95, 1.05, 1); + } + + 75% { + -webkit-transform: scale3d(1.05, .95, 1); + transform: scale3d(1.05, .95, 1); + } + + 100% { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} + +.rubberBand { + -webkit-animation-name: rubberBand; + animation-name: rubberBand; +} + +@-webkit-keyframes shake { + from, 100% { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + 10%, 30%, 50%, 70%, 90% { + -webkit-transform: translate3d(-10px, 0, 0); + transform: translate3d(-10px, 0, 0); + } + + 20%, 40%, 60%, 80% { + -webkit-transform: translate3d(10px, 0, 0); + transform: translate3d(10px, 0, 0); + } +} + +@keyframes shake { + from, 100% { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + 10%, 30%, 50%, 70%, 90% { + -webkit-transform: translate3d(-10px, 0, 0); + transform: translate3d(-10px, 0, 0); + } + + 20%, 40%, 60%, 80% { + -webkit-transform: translate3d(10px, 0, 0); + transform: translate3d(10px, 0, 0); + } +} + +.shake { + -webkit-animation-name: shake; + animation-name: shake; +} + +@-webkit-keyframes swing { + 20% { + -webkit-transform: rotate3d(0, 0, 1, 15deg); + transform: rotate3d(0, 0, 1, 15deg); + } + + 40% { + -webkit-transform: rotate3d(0, 0, 1, -10deg); + transform: rotate3d(0, 0, 1, -10deg); + } + + 60% { + -webkit-transform: rotate3d(0, 0, 1, 5deg); + transform: rotate3d(0, 0, 1, 5deg); + } + + 80% { + -webkit-transform: rotate3d(0, 0, 1, -5deg); + transform: rotate3d(0, 0, 1, -5deg); + } + + 100% { + -webkit-transform: rotate3d(0, 0, 1, 0deg); + transform: rotate3d(0, 0, 1, 0deg); + } +} + +@keyframes swing { + 20% { + -webkit-transform: rotate3d(0, 0, 1, 15deg); + transform: rotate3d(0, 0, 1, 15deg); + } + + 40% { + -webkit-transform: rotate3d(0, 0, 1, -10deg); + transform: rotate3d(0, 0, 1, -10deg); + } + + 60% { + -webkit-transform: rotate3d(0, 0, 1, 5deg); + transform: rotate3d(0, 0, 1, 5deg); + } + + 80% { + -webkit-transform: rotate3d(0, 0, 1, -5deg); + transform: rotate3d(0, 0, 1, -5deg); + } + + 100% { + -webkit-transform: rotate3d(0, 0, 1, 0deg); + transform: rotate3d(0, 0, 1, 0deg); + } +} + +.swing { + -webkit-transform-origin: top center; + transform-origin: top center; + -webkit-animation-name: swing; + animation-name: swing; +} + +@-webkit-keyframes tada { + from { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } + + 10%, 20% { + -webkit-transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg); + transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg); + } + + 30%, 50%, 70%, 90% { + -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); + transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); + } + + 40%, 60%, 80% { + -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); + transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); + } + + 100% { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} + +@keyframes tada { + from { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } + + 10%, 20% { + -webkit-transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg); + transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg); + } + + 30%, 50%, 70%, 90% { + -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); + transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); + } + + 40%, 60%, 80% { + -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); + transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); + } + + 100% { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} + +.tada { + -webkit-animation-name: tada; + animation-name: tada; +} + +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ + +@-webkit-keyframes wobble { + from { + -webkit-transform: none; + transform: none; + } + + 15% { + -webkit-transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg); + transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg); + } + + 30% { + -webkit-transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg); + transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg); + } + + 45% { + -webkit-transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg); + transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg); + } + + 60% { + -webkit-transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg); + transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg); + } + + 75% { + -webkit-transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg); + transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg); + } + + 100% { + -webkit-transform: none; + transform: none; + } +} + +@keyframes wobble { + from { + -webkit-transform: none; + transform: none; + } + + 15% { + -webkit-transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg); + transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg); + } + + 30% { + -webkit-transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg); + transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg); + } + + 45% { + -webkit-transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg); + transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg); + } + + 60% { + -webkit-transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg); + transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg); + } + + 75% { + -webkit-transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg); + transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg); + } + + 100% { + -webkit-transform: none; + transform: none; + } +} + +.wobble { + -webkit-animation-name: wobble; + animation-name: wobble; +} + +@-webkit-keyframes jello { + from, 11.1%, 100% { + -webkit-transform: none; + transform: none; + } + + 22.2% { + -webkit-transform: skewX(-12.5deg) skewY(-12.5deg); + transform: skewX(-12.5deg) skewY(-12.5deg); + } + + 33.3% { + -webkit-transform: skewX(6.25deg) skewY(6.25deg); + transform: skewX(6.25deg) skewY(6.25deg); + } + + 44.4% { + -webkit-transform: skewX(-3.125deg) skewY(-3.125deg); + transform: skewX(-3.125deg) skewY(-3.125deg); + } + + 55.5% { + -webkit-transform: skewX(1.5625deg) skewY(1.5625deg); + transform: skewX(1.5625deg) skewY(1.5625deg); + } + + 66.6% { + -webkit-transform: skewX(-0.78125deg) skewY(-0.78125deg); + transform: skewX(-0.78125deg) skewY(-0.78125deg); + } + + 77.7% { + -webkit-transform: skewX(0.390625deg) skewY(0.390625deg); + transform: skewX(0.390625deg) skewY(0.390625deg); + } + + 88.8% { + -webkit-transform: skewX(-0.1953125deg) skewY(-0.1953125deg); + transform: skewX(-0.1953125deg) skewY(-0.1953125deg); + } +} + +@keyframes jello { + from, 11.1%, 100% { + -webkit-transform: none; + transform: none; + } + + 22.2% { + -webkit-transform: skewX(-12.5deg) skewY(-12.5deg); + transform: skewX(-12.5deg) skewY(-12.5deg); + } + + 33.3% { + -webkit-transform: skewX(6.25deg) skewY(6.25deg); + transform: skewX(6.25deg) skewY(6.25deg); + } + + 44.4% { + -webkit-transform: skewX(-3.125deg) skewY(-3.125deg); + transform: skewX(-3.125deg) skewY(-3.125deg); + } + + 55.5% { + -webkit-transform: skewX(1.5625deg) skewY(1.5625deg); + transform: skewX(1.5625deg) skewY(1.5625deg); + } + + 66.6% { + -webkit-transform: skewX(-0.78125deg) skewY(-0.78125deg); + transform: skewX(-0.78125deg) skewY(-0.78125deg); + } + + 77.7% { + -webkit-transform: skewX(0.390625deg) skewY(0.390625deg); + transform: skewX(0.390625deg) skewY(0.390625deg); + } + + 88.8% { + -webkit-transform: skewX(-0.1953125deg) skewY(-0.1953125deg); + transform: skewX(-0.1953125deg) skewY(-0.1953125deg); + } +} + +.jello { + -webkit-animation-name: jello; + animation-name: jello; + -webkit-transform-origin: center; + transform-origin: center; +} + +@-webkit-keyframes bounceIn { + from, 20%, 40%, 60%, 80%, 100% { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + } + + 0% { + opacity: 0; + -webkit-transform: scale3d(.3, .3, .3); + transform: scale3d(.3, .3, .3); + } + + 20% { + -webkit-transform: scale3d(1.1, 1.1, 1.1); + transform: scale3d(1.1, 1.1, 1.1); + } + + 40% { + -webkit-transform: scale3d(.9, .9, .9); + transform: scale3d(.9, .9, .9); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(1.03, 1.03, 1.03); + transform: scale3d(1.03, 1.03, 1.03); + } + + 80% { + -webkit-transform: scale3d(.97, .97, .97); + transform: scale3d(.97, .97, .97); + } + + 100% { + opacity: 1; + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} + +@keyframes bounceIn { + from, 20%, 40%, 60%, 80%, 100% { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + } + + 0% { + opacity: 0; + -webkit-transform: scale3d(.3, .3, .3); + transform: scale3d(.3, .3, .3); + } + + 20% { + -webkit-transform: scale3d(1.1, 1.1, 1.1); + transform: scale3d(1.1, 1.1, 1.1); + } + + 40% { + -webkit-transform: scale3d(.9, .9, .9); + transform: scale3d(.9, .9, .9); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(1.03, 1.03, 1.03); + transform: scale3d(1.03, 1.03, 1.03); + } + + 80% { + -webkit-transform: scale3d(.97, .97, .97); + transform: scale3d(.97, .97, .97); + } + + 100% { + opacity: 1; + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} + +.bounceIn { + -webkit-animation-name: bounceIn; + animation-name: bounceIn; +} + +@-webkit-keyframes bounceInDown { + from, 60%, 75%, 90%, 100% { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + } + + 0% { + opacity: 0; + -webkit-transform: translate3d(0, -3000px, 0); + transform: translate3d(0, -3000px, 0); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(0, 25px, 0); + transform: translate3d(0, 25px, 0); + } + + 75% { + -webkit-transform: translate3d(0, -10px, 0); + transform: translate3d(0, -10px, 0); + } + + 90% { + -webkit-transform: translate3d(0, 5px, 0); + transform: translate3d(0, 5px, 0); + } + + 100% { + -webkit-transform: none; + transform: none; + } +} + +@keyframes bounceInDown { + from, 60%, 75%, 90%, 100% { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + } + + 0% { + opacity: 0; + -webkit-transform: translate3d(0, -3000px, 0); + transform: translate3d(0, -3000px, 0); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(0, 25px, 0); + transform: translate3d(0, 25px, 0); + } + + 75% { + -webkit-transform: translate3d(0, -10px, 0); + transform: translate3d(0, -10px, 0); + } + + 90% { + -webkit-transform: translate3d(0, 5px, 0); + transform: translate3d(0, 5px, 0); + } + + 100% { + -webkit-transform: none; + transform: none; + } +} + +.bounceInDown { + -webkit-animation-name: bounceInDown; + animation-name: bounceInDown; +} + +@-webkit-keyframes bounceInLeft { + from, 60%, 75%, 90%, 100% { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + } + + 0% { + opacity: 0; + -webkit-transform: translate3d(-3000px, 0, 0); + transform: translate3d(-3000px, 0, 0); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(25px, 0, 0); + transform: translate3d(25px, 0, 0); + } + + 75% { + -webkit-transform: translate3d(-10px, 0, 0); + transform: translate3d(-10px, 0, 0); + } + + 90% { + -webkit-transform: translate3d(5px, 0, 0); + transform: translate3d(5px, 0, 0); + } + + 100% { + -webkit-transform: none; + transform: none; + } +} + +@keyframes bounceInLeft { + from, 60%, 75%, 90%, 100% { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + } + + 0% { + opacity: 0; + -webkit-transform: translate3d(-3000px, 0, 0); + transform: translate3d(-3000px, 0, 0); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(25px, 0, 0); + transform: translate3d(25px, 0, 0); + } + + 75% { + -webkit-transform: translate3d(-10px, 0, 0); + transform: translate3d(-10px, 0, 0); + } + + 90% { + -webkit-transform: translate3d(5px, 0, 0); + transform: translate3d(5px, 0, 0); + } + + 100% { + -webkit-transform: none; + transform: none; + } +} + +.bounceInLeft { + -webkit-animation-name: bounceInLeft; + animation-name: bounceInLeft; +} + +@-webkit-keyframes bounceInRight { + from, 60%, 75%, 90%, 100% { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + } + + from { + opacity: 0; + -webkit-transform: translate3d(3000px, 0, 0); + transform: translate3d(3000px, 0, 0); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(-25px, 0, 0); + transform: translate3d(-25px, 0, 0); + } + + 75% { + -webkit-transform: translate3d(10px, 0, 0); + transform: translate3d(10px, 0, 0); + } + + 90% { + -webkit-transform: translate3d(-5px, 0, 0); + transform: translate3d(-5px, 0, 0); + } + + 100% { + -webkit-transform: none; + transform: none; + } +} + +@keyframes bounceInRight { + from, 60%, 75%, 90%, 100% { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + } + + from { + opacity: 0; + -webkit-transform: translate3d(3000px, 0, 0); + transform: translate3d(3000px, 0, 0); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(-25px, 0, 0); + transform: translate3d(-25px, 0, 0); + } + + 75% { + -webkit-transform: translate3d(10px, 0, 0); + transform: translate3d(10px, 0, 0); + } + + 90% { + -webkit-transform: translate3d(-5px, 0, 0); + transform: translate3d(-5px, 0, 0); + } + + 100% { + -webkit-transform: none; + transform: none; + } +} + +.bounceInRight { + -webkit-animation-name: bounceInRight; + animation-name: bounceInRight; +} + +@-webkit-keyframes bounceInUp { + from, 60%, 75%, 90%, 100% { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + } + + from { + opacity: 0; + -webkit-transform: translate3d(0, 3000px, 0); + transform: translate3d(0, 3000px, 0); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(0, -20px, 0); + transform: translate3d(0, -20px, 0); + } + + 75% { + -webkit-transform: translate3d(0, 10px, 0); + transform: translate3d(0, 10px, 0); + } + + 90% { + -webkit-transform: translate3d(0, -5px, 0); + transform: translate3d(0, -5px, 0); + } + + 100% { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +@keyframes bounceInUp { + from, 60%, 75%, 90%, 100% { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + } + + from { + opacity: 0; + -webkit-transform: translate3d(0, 3000px, 0); + transform: translate3d(0, 3000px, 0); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(0, -20px, 0); + transform: translate3d(0, -20px, 0); + } + + 75% { + -webkit-transform: translate3d(0, 10px, 0); + transform: translate3d(0, 10px, 0); + } + + 90% { + -webkit-transform: translate3d(0, -5px, 0); + transform: translate3d(0, -5px, 0); + } + + 100% { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +.bounceInUp { + -webkit-animation-name: bounceInUp; + animation-name: bounceInUp; +} + +@-webkit-keyframes bounceOut { + 20% { + -webkit-transform: scale3d(.9, .9, .9); + transform: scale3d(.9, .9, .9); + } + + 50%, 55% { + opacity: 1; + -webkit-transform: scale3d(1.1, 1.1, 1.1); + transform: scale3d(1.1, 1.1, 1.1); + } + + 100% { + opacity: 0; + -webkit-transform: scale3d(.3, .3, .3); + transform: scale3d(.3, .3, .3); + } +} + +@keyframes bounceOut { + 20% { + -webkit-transform: scale3d(.9, .9, .9); + transform: scale3d(.9, .9, .9); + } + + 50%, 55% { + opacity: 1; + -webkit-transform: scale3d(1.1, 1.1, 1.1); + transform: scale3d(1.1, 1.1, 1.1); + } + + 100% { + opacity: 0; + -webkit-transform: scale3d(.3, .3, .3); + transform: scale3d(.3, .3, .3); + } +} + +.bounceOut { + -webkit-animation-name: bounceOut; + animation-name: bounceOut; +} + +@-webkit-keyframes bounceOutDown { + 20% { + -webkit-transform: translate3d(0, 10px, 0); + transform: translate3d(0, 10px, 0); + } + + 40%, 45% { + opacity: 1; + -webkit-transform: translate3d(0, -20px, 0); + transform: translate3d(0, -20px, 0); + } + + 100% { + opacity: 0; + -webkit-transform: translate3d(0, 2000px, 0); + transform: translate3d(0, 2000px, 0); + } +} + +@keyframes bounceOutDown { + 20% { + -webkit-transform: translate3d(0, 10px, 0); + transform: translate3d(0, 10px, 0); + } + + 40%, 45% { + opacity: 1; + -webkit-transform: translate3d(0, -20px, 0); + transform: translate3d(0, -20px, 0); + } + + 100% { + opacity: 0; + -webkit-transform: translate3d(0, 2000px, 0); + transform: translate3d(0, 2000px, 0); + } +} + +.bounceOutDown { + -webkit-animation-name: bounceOutDown; + animation-name: bounceOutDown; +} + +@-webkit-keyframes bounceOutLeft { + 20% { + opacity: 1; + -webkit-transform: translate3d(20px, 0, 0); + transform: translate3d(20px, 0, 0); + } + + 100% { + opacity: 0; + -webkit-transform: translate3d(-2000px, 0, 0); + transform: translate3d(-2000px, 0, 0); + } +} + +@keyframes bounceOutLeft { + 20% { + opacity: 1; + -webkit-transform: translate3d(20px, 0, 0); + transform: translate3d(20px, 0, 0); + } + + 100% { + opacity: 0; + -webkit-transform: translate3d(-2000px, 0, 0); + transform: translate3d(-2000px, 0, 0); + } +} + +.bounceOutLeft { + -webkit-animation-name: bounceOutLeft; + animation-name: bounceOutLeft; +} + +@-webkit-keyframes bounceOutRight { + 20% { + opacity: 1; + -webkit-transform: translate3d(-20px, 0, 0); + transform: translate3d(-20px, 0, 0); + } + + 100% { + opacity: 0; + -webkit-transform: translate3d(2000px, 0, 0); + transform: translate3d(2000px, 0, 0); + } +} + +@keyframes bounceOutRight { + 20% { + opacity: 1; + -webkit-transform: translate3d(-20px, 0, 0); + transform: translate3d(-20px, 0, 0); + } + + 100% { + opacity: 0; + -webkit-transform: translate3d(2000px, 0, 0); + transform: translate3d(2000px, 0, 0); + } +} + +.bounceOutRight { + -webkit-animation-name: bounceOutRight; + animation-name: bounceOutRight; +} + +@-webkit-keyframes bounceOutUp { + 20% { + -webkit-transform: translate3d(0, -10px, 0); + transform: translate3d(0, -10px, 0); + } + + 40%, 45% { + opacity: 1; + -webkit-transform: translate3d(0, 20px, 0); + transform: translate3d(0, 20px, 0); + } + + 100% { + opacity: 0; + -webkit-transform: translate3d(0, -2000px, 0); + transform: translate3d(0, -2000px, 0); + } +} + +@keyframes bounceOutUp { + 20% { + -webkit-transform: translate3d(0, -10px, 0); + transform: translate3d(0, -10px, 0); + } + + 40%, 45% { + opacity: 1; + -webkit-transform: translate3d(0, 20px, 0); + transform: translate3d(0, 20px, 0); + } + + 100% { + opacity: 0; + -webkit-transform: translate3d(0, -2000px, 0); + transform: translate3d(0, -2000px, 0); + } +} + +.bounceOutUp { + -webkit-animation-name: bounceOutUp; + animation-name: bounceOutUp; +} + +@-webkit-keyframes fadeIn { + from { + opacity: 0; + } + + 100% { + opacity: 1; + } +} + +@keyframes fadeIn { + from { + opacity: 0; + } + + 100% { + opacity: 1; + } +} + +.fadeIn { + -webkit-animation-name: fadeIn; + animation-name: fadeIn; +} + +@-webkit-keyframes fadeInDown { + from { + opacity: 0; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } + + 100% { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@keyframes fadeInDown { + from { + opacity: 0; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } + + 100% { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +.fadeInDown { + -webkit-animation-name: fadeInDown; + animation-name: fadeInDown; +} + +@-webkit-keyframes fadeInDownBig { + from { + opacity: 0; + -webkit-transform: translate3d(0, -2000px, 0); + transform: translate3d(0, -2000px, 0); + } + + 100% { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@keyframes fadeInDownBig { + from { + opacity: 0; + -webkit-transform: translate3d(0, -2000px, 0); + transform: translate3d(0, -2000px, 0); + } + + 100% { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +.fadeInDownBig { + -webkit-animation-name: fadeInDownBig; + animation-name: fadeInDownBig; +} + +@-webkit-keyframes fadeInLeft { + from { + opacity: 0; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } + + 100% { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@keyframes fadeInLeft { + from { + opacity: 0; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } + + 100% { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +.fadeInLeft { + -webkit-animation-name: fadeInLeft; + animation-name: fadeInLeft; +} + +@-webkit-keyframes fadeInLeftBig { + from { + opacity: 0; + -webkit-transform: translate3d(-2000px, 0, 0); + transform: translate3d(-2000px, 0, 0); + } + + 100% { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@keyframes fadeInLeftBig { + from { + opacity: 0; + -webkit-transform: translate3d(-2000px, 0, 0); + transform: translate3d(-2000px, 0, 0); + } + + 100% { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +.fadeInLeftBig { + -webkit-animation-name: fadeInLeftBig; + animation-name: fadeInLeftBig; +} + +@-webkit-keyframes fadeInRight { + from { + opacity: 0; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } + + 100% { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@keyframes fadeInRight { + from { + opacity: 0; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } + + 100% { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +.fadeInRight { + -webkit-animation-name: fadeInRight; + animation-name: fadeInRight; +} + +@-webkit-keyframes fadeInRightBig { + from { + opacity: 0; + -webkit-transform: translate3d(2000px, 0, 0); + transform: translate3d(2000px, 0, 0); + } + + 100% { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@keyframes fadeInRightBig { + from { + opacity: 0; + -webkit-transform: translate3d(2000px, 0, 0); + transform: translate3d(2000px, 0, 0); + } + + 100% { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +.fadeInRightBig { + -webkit-animation-name: fadeInRightBig; + animation-name: fadeInRightBig; +} + +@-webkit-keyframes fadeInUp { + from { + opacity: 0; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } + + 100% { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@keyframes fadeInUp { + from { + opacity: 0; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } + + 100% { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +.fadeInUp { + -webkit-animation-name: fadeInUp; + animation-name: fadeInUp; +} + +@-webkit-keyframes fadeInUpBig { + from { + opacity: 0; + -webkit-transform: translate3d(0, 2000px, 0); + transform: translate3d(0, 2000px, 0); + } + + 100% { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@keyframes fadeInUpBig { + from { + opacity: 0; + -webkit-transform: translate3d(0, 2000px, 0); + transform: translate3d(0, 2000px, 0); + } + + 100% { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +.fadeInUpBig { + -webkit-animation-name: fadeInUpBig; + animation-name: fadeInUpBig; +} + +@-webkit-keyframes fadeOut { + from { + opacity: 1; + } + + 100% { + opacity: 0; + } +} + +@keyframes fadeOut { + from { + opacity: 1; + } + + 100% { + opacity: 0; + } +} + +.fadeOut { + -webkit-animation-name: fadeOut; + animation-name: fadeOut; +} + +@-webkit-keyframes fadeOutDown { + from { + opacity: 1; + } + + 100% { + opacity: 0; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } +} + +@keyframes fadeOutDown { + from { + opacity: 1; + } + + 100% { + opacity: 0; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } +} + +.fadeOutDown { + -webkit-animation-name: fadeOutDown; + animation-name: fadeOutDown; +} + +@-webkit-keyframes fadeOutDownBig { + from { + opacity: 1; + } + + 100% { + opacity: 0; + -webkit-transform: translate3d(0, 2000px, 0); + transform: translate3d(0, 2000px, 0); + } +} + +@keyframes fadeOutDownBig { + from { + opacity: 1; + } + + 100% { + opacity: 0; + -webkit-transform: translate3d(0, 2000px, 0); + transform: translate3d(0, 2000px, 0); + } +} + +.fadeOutDownBig { + -webkit-animation-name: fadeOutDownBig; + animation-name: fadeOutDownBig; +} + +@-webkit-keyframes fadeOutLeft { + from { + opacity: 1; + } + + 100% { + opacity: 0; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } +} + +@keyframes fadeOutLeft { + from { + opacity: 1; + } + + 100% { + opacity: 0; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } +} + +.fadeOutLeft { + -webkit-animation-name: fadeOutLeft; + animation-name: fadeOutLeft; +} + +@-webkit-keyframes fadeOutLeftBig { + from { + opacity: 1; + } + + 100% { + opacity: 0; + -webkit-transform: translate3d(-2000px, 0, 0); + transform: translate3d(-2000px, 0, 0); + } +} + +@keyframes fadeOutLeftBig { + from { + opacity: 1; + } + + 100% { + opacity: 0; + -webkit-transform: translate3d(-2000px, 0, 0); + transform: translate3d(-2000px, 0, 0); + } +} + +.fadeOutLeftBig { + -webkit-animation-name: fadeOutLeftBig; + animation-name: fadeOutLeftBig; +} + +@-webkit-keyframes fadeOutRight { + from { + opacity: 1; + } + + 100% { + opacity: 0; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } +} + +@keyframes fadeOutRight { + from { + opacity: 1; + } + + 100% { + opacity: 0; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } +} + +.fadeOutRight { + -webkit-animation-name: fadeOutRight; + animation-name: fadeOutRight; +} + +@-webkit-keyframes fadeOutRightBig { + from { + opacity: 1; + } + + 100% { + opacity: 0; + -webkit-transform: translate3d(2000px, 0, 0); + transform: translate3d(2000px, 0, 0); + } +} + +@keyframes fadeOutRightBig { + from { + opacity: 1; + } + + 100% { + opacity: 0; + -webkit-transform: translate3d(2000px, 0, 0); + transform: translate3d(2000px, 0, 0); + } +} + +.fadeOutRightBig { + -webkit-animation-name: fadeOutRightBig; + animation-name: fadeOutRightBig; +} + +@-webkit-keyframes fadeOutUp { + from { + opacity: 1; + } + + 100% { + opacity: 0; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } +} + +@keyframes fadeOutUp { + from { + opacity: 1; + } + + 100% { + opacity: 0; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } +} + +.fadeOutUp { + -webkit-animation-name: fadeOutUp; + animation-name: fadeOutUp; +} + +@-webkit-keyframes fadeOutUpBig { + from { + opacity: 1; + } + + 100% { + opacity: 0; + -webkit-transform: translate3d(0, -2000px, 0); + transform: translate3d(0, -2000px, 0); + } +} + +@keyframes fadeOutUpBig { + from { + opacity: 1; + } + + 100% { + opacity: 0; + -webkit-transform: translate3d(0, -2000px, 0); + transform: translate3d(0, -2000px, 0); + } +} + +.fadeOutUpBig { + -webkit-animation-name: fadeOutUpBig; + animation-name: fadeOutUpBig; +} + +@-webkit-keyframes flip { + from { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -360deg); + transform: perspective(400px) rotate3d(0, 1, 0, -360deg); + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; + } + + 40% { + -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg); + transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg); + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; + } + + 50% { + -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg); + transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + 80% { + -webkit-transform: perspective(400px) scale3d(.95, .95, .95); + transform: perspective(400px) scale3d(.95, .95, .95); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + 100% { + -webkit-transform: perspective(400px); + transform: perspective(400px); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } +} + +@keyframes flip { + from { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -360deg); + transform: perspective(400px) rotate3d(0, 1, 0, -360deg); + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; + } + + 40% { + -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg); + transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg); + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; + } + + 50% { + -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg); + transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + 80% { + -webkit-transform: perspective(400px) scale3d(.95, .95, .95); + transform: perspective(400px) scale3d(.95, .95, .95); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + 100% { + -webkit-transform: perspective(400px); + transform: perspective(400px); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } +} + +.animated.flip { + -webkit-backface-visibility: visible; + backface-visibility: visible; + -webkit-animation-name: flip; + animation-name: flip; +} + +@-webkit-keyframes flipInX { + from { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + opacity: 0; + } + + 40% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + 60% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg); + transform: perspective(400px) rotate3d(1, 0, 0, 10deg); + opacity: 1; + } + + 80% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg); + transform: perspective(400px) rotate3d(1, 0, 0, -5deg); + } + + 100% { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } +} + +@keyframes flipInX { + from { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + opacity: 0; + } + + 40% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + 60% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg); + transform: perspective(400px) rotate3d(1, 0, 0, 10deg); + opacity: 1; + } + + 80% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg); + transform: perspective(400px) rotate3d(1, 0, 0, -5deg); + } + + 100% { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } +} + +.flipInX { + -webkit-backface-visibility: visible !important; + backface-visibility: visible !important; + -webkit-animation-name: flipInX; + animation-name: flipInX; +} + +@-webkit-keyframes flipInY { + from { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + opacity: 0; + } + + 40% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -20deg); + transform: perspective(400px) rotate3d(0, 1, 0, -20deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + 60% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 10deg); + transform: perspective(400px) rotate3d(0, 1, 0, 10deg); + opacity: 1; + } + + 80% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -5deg); + transform: perspective(400px) rotate3d(0, 1, 0, -5deg); + } + + 100% { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } +} + +@keyframes flipInY { + from { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + opacity: 0; + } + + 40% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -20deg); + transform: perspective(400px) rotate3d(0, 1, 0, -20deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + 60% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 10deg); + transform: perspective(400px) rotate3d(0, 1, 0, 10deg); + opacity: 1; + } + + 80% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -5deg); + transform: perspective(400px) rotate3d(0, 1, 0, -5deg); + } + + 100% { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } +} + +.flipInY { + -webkit-backface-visibility: visible !important; + backface-visibility: visible !important; + -webkit-animation-name: flipInY; + animation-name: flipInY; +} + +@-webkit-keyframes flipOutX { + from { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } + + 30% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + opacity: 1; + } + + 100% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + opacity: 0; + } +} + +@keyframes flipOutX { + from { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } + + 30% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + opacity: 1; + } + + 100% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + opacity: 0; + } +} + +.flipOutX { + -webkit-animation-name: flipOutX; + animation-name: flipOutX; + -webkit-backface-visibility: visible !important; + backface-visibility: visible !important; +} + +@-webkit-keyframes flipOutY { + from { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } + + 30% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -15deg); + transform: perspective(400px) rotate3d(0, 1, 0, -15deg); + opacity: 1; + } + + 100% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + opacity: 0; + } +} + +@keyframes flipOutY { + from { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } + + 30% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -15deg); + transform: perspective(400px) rotate3d(0, 1, 0, -15deg); + opacity: 1; + } + + 100% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + opacity: 0; + } +} + +.flipOutY { + -webkit-backface-visibility: visible !important; + backface-visibility: visible !important; + -webkit-animation-name: flipOutY; + animation-name: flipOutY; +} + +@-webkit-keyframes lightSpeedIn { + from { + -webkit-transform: translate3d(100%, 0, 0) skewX(-30deg); + transform: translate3d(100%, 0, 0) skewX(-30deg); + opacity: 0; + } + + 60% { + -webkit-transform: skewX(20deg); + transform: skewX(20deg); + opacity: 1; + } + + 80% { + -webkit-transform: skewX(-5deg); + transform: skewX(-5deg); + opacity: 1; + } + + 100% { + -webkit-transform: none; + transform: none; + opacity: 1; + } +} + +@keyframes lightSpeedIn { + from { + -webkit-transform: translate3d(100%, 0, 0) skewX(-30deg); + transform: translate3d(100%, 0, 0) skewX(-30deg); + opacity: 0; + } + + 60% { + -webkit-transform: skewX(20deg); + transform: skewX(20deg); + opacity: 1; + } + + 80% { + -webkit-transform: skewX(-5deg); + transform: skewX(-5deg); + opacity: 1; + } + + 100% { + -webkit-transform: none; + transform: none; + opacity: 1; + } +} + +.lightSpeedIn { + -webkit-animation-name: lightSpeedIn; + animation-name: lightSpeedIn; + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; +} + +@-webkit-keyframes lightSpeedOut { + from { + opacity: 1; + } + + 100% { + -webkit-transform: translate3d(100%, 0, 0) skewX(30deg); + transform: translate3d(100%, 0, 0) skewX(30deg); + opacity: 0; + } +} + +@keyframes lightSpeedOut { + from { + opacity: 1; + } + + 100% { + -webkit-transform: translate3d(100%, 0, 0) skewX(30deg); + transform: translate3d(100%, 0, 0) skewX(30deg); + opacity: 0; + } +} + +.lightSpeedOut { + -webkit-animation-name: lightSpeedOut; + animation-name: lightSpeedOut; + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; +} + +@-webkit-keyframes rotateIn { + from { + -webkit-transform-origin: center; + transform-origin: center; + -webkit-transform: rotate3d(0, 0, 1, -200deg); + transform: rotate3d(0, 0, 1, -200deg); + opacity: 0; + } + + 100% { + -webkit-transform-origin: center; + transform-origin: center; + -webkit-transform: none; + transform: none; + opacity: 1; + } +} + +@keyframes rotateIn { + from { + -webkit-transform-origin: center; + transform-origin: center; + -webkit-transform: rotate3d(0, 0, 1, -200deg); + transform: rotate3d(0, 0, 1, -200deg); + opacity: 0; + } + + 100% { + -webkit-transform-origin: center; + transform-origin: center; + -webkit-transform: none; + transform: none; + opacity: 1; + } +} + +.rotateIn { + -webkit-animation-name: rotateIn; + animation-name: rotateIn; +} + +@-webkit-keyframes rotateInDownLeft { + from { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate3d(0, 0, 1, -45deg); + transform: rotate3d(0, 0, 1, -45deg); + opacity: 0; + } + + 100% { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: none; + transform: none; + opacity: 1; + } +} + +@keyframes rotateInDownLeft { + from { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate3d(0, 0, 1, -45deg); + transform: rotate3d(0, 0, 1, -45deg); + opacity: 0; + } + + 100% { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: none; + transform: none; + opacity: 1; + } +} + +.rotateInDownLeft { + -webkit-animation-name: rotateInDownLeft; + animation-name: rotateInDownLeft; +} + +@-webkit-keyframes rotateInDownRight { + from { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate3d(0, 0, 1, 45deg); + transform: rotate3d(0, 0, 1, 45deg); + opacity: 0; + } + + 100% { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: none; + transform: none; + opacity: 1; + } +} + +@keyframes rotateInDownRight { + from { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate3d(0, 0, 1, 45deg); + transform: rotate3d(0, 0, 1, 45deg); + opacity: 0; + } + + 100% { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: none; + transform: none; + opacity: 1; + } +} + +.rotateInDownRight { + -webkit-animation-name: rotateInDownRight; + animation-name: rotateInDownRight; +} + +@-webkit-keyframes rotateInUpLeft { + from { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate3d(0, 0, 1, 45deg); + transform: rotate3d(0, 0, 1, 45deg); + opacity: 0; + } + + 100% { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: none; + transform: none; + opacity: 1; + } +} + +@keyframes rotateInUpLeft { + from { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate3d(0, 0, 1, 45deg); + transform: rotate3d(0, 0, 1, 45deg); + opacity: 0; + } + + 100% { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: none; + transform: none; + opacity: 1; + } +} + +.rotateInUpLeft { + -webkit-animation-name: rotateInUpLeft; + animation-name: rotateInUpLeft; +} + +@-webkit-keyframes rotateInUpRight { + from { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate3d(0, 0, 1, -90deg); + transform: rotate3d(0, 0, 1, -90deg); + opacity: 0; + } + + 100% { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: none; + transform: none; + opacity: 1; + } +} + +@keyframes rotateInUpRight { + from { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate3d(0, 0, 1, -90deg); + transform: rotate3d(0, 0, 1, -90deg); + opacity: 0; + } + + 100% { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: none; + transform: none; + opacity: 1; + } +} + +.rotateInUpRight { + -webkit-animation-name: rotateInUpRight; + animation-name: rotateInUpRight; +} + +@-webkit-keyframes rotateOut { + from { + -webkit-transform-origin: center; + transform-origin: center; + opacity: 1; + } + + 100% { + -webkit-transform-origin: center; + transform-origin: center; + -webkit-transform: rotate3d(0, 0, 1, 200deg); + transform: rotate3d(0, 0, 1, 200deg); + opacity: 0; + } +} + +@keyframes rotateOut { + from { + -webkit-transform-origin: center; + transform-origin: center; + opacity: 1; + } + + 100% { + -webkit-transform-origin: center; + transform-origin: center; + -webkit-transform: rotate3d(0, 0, 1, 200deg); + transform: rotate3d(0, 0, 1, 200deg); + opacity: 0; + } +} + +.rotateOut { + -webkit-animation-name: rotateOut; + animation-name: rotateOut; +} + +@-webkit-keyframes rotateOutDownLeft { + from { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + opacity: 1; + } + + 100% { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate3d(0, 0, 1, 45deg); + transform: rotate3d(0, 0, 1, 45deg); + opacity: 0; + } +} + +@keyframes rotateOutDownLeft { + from { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + opacity: 1; + } + + 100% { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate3d(0, 0, 1, 45deg); + transform: rotate3d(0, 0, 1, 45deg); + opacity: 0; + } +} + +.rotateOutDownLeft { + -webkit-animation-name: rotateOutDownLeft; + animation-name: rotateOutDownLeft; +} + +@-webkit-keyframes rotateOutDownRight { + from { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + opacity: 1; + } + + 100% { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate3d(0, 0, 1, -45deg); + transform: rotate3d(0, 0, 1, -45deg); + opacity: 0; + } +} + +@keyframes rotateOutDownRight { + from { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + opacity: 1; + } + + 100% { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate3d(0, 0, 1, -45deg); + transform: rotate3d(0, 0, 1, -45deg); + opacity: 0; + } +} + +.rotateOutDownRight { + -webkit-animation-name: rotateOutDownRight; + animation-name: rotateOutDownRight; +} + +@-webkit-keyframes rotateOutUpLeft { + from { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + opacity: 1; + } + + 100% { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate3d(0, 0, 1, -45deg); + transform: rotate3d(0, 0, 1, -45deg); + opacity: 0; + } +} + +@keyframes rotateOutUpLeft { + from { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + opacity: 1; + } + + 100% { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate3d(0, 0, 1, -45deg); + transform: rotate3d(0, 0, 1, -45deg); + opacity: 0; + } +} + +.rotateOutUpLeft { + -webkit-animation-name: rotateOutUpLeft; + animation-name: rotateOutUpLeft; +} + +@-webkit-keyframes rotateOutUpRight { + from { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + opacity: 1; + } + + 100% { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate3d(0, 0, 1, 90deg); + transform: rotate3d(0, 0, 1, 90deg); + opacity: 0; + } +} + +@keyframes rotateOutUpRight { + from { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + opacity: 1; + } + + 100% { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate3d(0, 0, 1, 90deg); + transform: rotate3d(0, 0, 1, 90deg); + opacity: 0; + } +} + +.rotateOutUpRight { + -webkit-animation-name: rotateOutUpRight; + animation-name: rotateOutUpRight; +} + +@-webkit-keyframes hinge { + 0% { + -webkit-transform-origin: top left; + transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + } + + 20%, 60% { + -webkit-transform: rotate3d(0, 0, 1, 80deg); + transform: rotate3d(0, 0, 1, 80deg); + -webkit-transform-origin: top left; + transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + } + + 40%, 80% { + -webkit-transform: rotate3d(0, 0, 1, 60deg); + transform: rotate3d(0, 0, 1, 60deg); + -webkit-transform-origin: top left; + transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + opacity: 1; + } + + 100% { + -webkit-transform: translate3d(0, 700px, 0); + transform: translate3d(0, 700px, 0); + opacity: 0; + } +} + +@keyframes hinge { + 0% { + -webkit-transform-origin: top left; + transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + } + + 20%, 60% { + -webkit-transform: rotate3d(0, 0, 1, 80deg); + transform: rotate3d(0, 0, 1, 80deg); + -webkit-transform-origin: top left; + transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + } + + 40%, 80% { + -webkit-transform: rotate3d(0, 0, 1, 60deg); + transform: rotate3d(0, 0, 1, 60deg); + -webkit-transform-origin: top left; + transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + opacity: 1; + } + + 100% { + -webkit-transform: translate3d(0, 700px, 0); + transform: translate3d(0, 700px, 0); + opacity: 0; + } +} + +.hinge { + -webkit-animation-name: hinge; + animation-name: hinge; +} + +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ + +@-webkit-keyframes rollIn { + from { + opacity: 0; + -webkit-transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg); + transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg); + } + + 100% { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@keyframes rollIn { + from { + opacity: 0; + -webkit-transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg); + transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg); + } + + 100% { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +.rollIn { + -webkit-animation-name: rollIn; + animation-name: rollIn; +} + +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ + +@-webkit-keyframes rollOut { + from { + opacity: 1; + } + + 100% { + opacity: 0; + -webkit-transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg); + transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg); + } +} + +@keyframes rollOut { + from { + opacity: 1; + } + + 100% { + opacity: 0; + -webkit-transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg); + transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg); + } +} + +.rollOut { + -webkit-animation-name: rollOut; + animation-name: rollOut; +} + +@-webkit-keyframes zoomIn { + from { + opacity: 0; + -webkit-transform: scale3d(.3, .3, .3); + transform: scale3d(.3, .3, .3); + } + + 50% { + opacity: 1; + } +} + +@keyframes zoomIn { + from { + opacity: 0; + -webkit-transform: scale3d(.3, .3, .3); + transform: scale3d(.3, .3, .3); + } + + 50% { + opacity: 1; + } +} + +.zoomIn { + -webkit-animation-name: zoomIn; + animation-name: zoomIn; +} + +@-webkit-keyframes zoomInDown { + from { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(0, -1000px, 0); + transform: scale3d(.1, .1, .1) translate3d(0, -1000px, 0); + -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0); + transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +@keyframes zoomInDown { + from { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(0, -1000px, 0); + transform: scale3d(.1, .1, .1) translate3d(0, -1000px, 0); + -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0); + transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +.zoomInDown { + -webkit-animation-name: zoomInDown; + animation-name: zoomInDown; +} + +@-webkit-keyframes zoomInLeft { + from { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(-1000px, 0, 0); + transform: scale3d(.1, .1, .1) translate3d(-1000px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(10px, 0, 0); + transform: scale3d(.475, .475, .475) translate3d(10px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +@keyframes zoomInLeft { + from { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(-1000px, 0, 0); + transform: scale3d(.1, .1, .1) translate3d(-1000px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(10px, 0, 0); + transform: scale3d(.475, .475, .475) translate3d(10px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +.zoomInLeft { + -webkit-animation-name: zoomInLeft; + animation-name: zoomInLeft; +} + +@-webkit-keyframes zoomInRight { + from { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(1000px, 0, 0); + transform: scale3d(.1, .1, .1) translate3d(1000px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(-10px, 0, 0); + transform: scale3d(.475, .475, .475) translate3d(-10px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +@keyframes zoomInRight { + from { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(1000px, 0, 0); + transform: scale3d(.1, .1, .1) translate3d(1000px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(-10px, 0, 0); + transform: scale3d(.475, .475, .475) translate3d(-10px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +.zoomInRight { + -webkit-animation-name: zoomInRight; + animation-name: zoomInRight; +} + +@-webkit-keyframes zoomInUp { + from { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(0, 1000px, 0); + transform: scale3d(.1, .1, .1) translate3d(0, 1000px, 0); + -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0); + transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +@keyframes zoomInUp { + from { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(0, 1000px, 0); + transform: scale3d(.1, .1, .1) translate3d(0, 1000px, 0); + -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0); + transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +.zoomInUp { + -webkit-animation-name: zoomInUp; + animation-name: zoomInUp; +} + +@-webkit-keyframes zoomOut { + from { + opacity: 1; + } + + 50% { + opacity: 0; + -webkit-transform: scale3d(.3, .3, .3); + transform: scale3d(.3, .3, .3); + } + + 100% { + opacity: 0; + } +} + +@keyframes zoomOut { + from { + opacity: 1; + } + + 50% { + opacity: 0; + -webkit-transform: scale3d(.3, .3, .3); + transform: scale3d(.3, .3, .3); + } + + 100% { + opacity: 0; + } +} + +.zoomOut { + -webkit-animation-name: zoomOut; + animation-name: zoomOut; +} + +@-webkit-keyframes zoomOutDown { + 40% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0); + transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + 100% { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(0, 2000px, 0); + transform: scale3d(.1, .1, .1) translate3d(0, 2000px, 0); + -webkit-transform-origin: center bottom; + transform-origin: center bottom; + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +@keyframes zoomOutDown { + 40% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0); + transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + 100% { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(0, 2000px, 0); + transform: scale3d(.1, .1, .1) translate3d(0, 2000px, 0); + -webkit-transform-origin: center bottom; + transform-origin: center bottom; + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +.zoomOutDown { + -webkit-animation-name: zoomOutDown; + animation-name: zoomOutDown; +} + +@-webkit-keyframes zoomOutLeft { + 40% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(42px, 0, 0); + transform: scale3d(.475, .475, .475) translate3d(42px, 0, 0); + } + + 100% { + opacity: 0; + -webkit-transform: scale(.1) translate3d(-2000px, 0, 0); + transform: scale(.1) translate3d(-2000px, 0, 0); + -webkit-transform-origin: left center; + transform-origin: left center; + } +} + +@keyframes zoomOutLeft { + 40% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(42px, 0, 0); + transform: scale3d(.475, .475, .475) translate3d(42px, 0, 0); + } + + 100% { + opacity: 0; + -webkit-transform: scale(.1) translate3d(-2000px, 0, 0); + transform: scale(.1) translate3d(-2000px, 0, 0); + -webkit-transform-origin: left center; + transform-origin: left center; + } +} + +.zoomOutLeft { + -webkit-animation-name: zoomOutLeft; + animation-name: zoomOutLeft; +} + +@-webkit-keyframes zoomOutRight { + 40% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(-42px, 0, 0); + transform: scale3d(.475, .475, .475) translate3d(-42px, 0, 0); + } + + 100% { + opacity: 0; + -webkit-transform: scale(.1) translate3d(2000px, 0, 0); + transform: scale(.1) translate3d(2000px, 0, 0); + -webkit-transform-origin: right center; + transform-origin: right center; + } +} + +@keyframes zoomOutRight { + 40% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(-42px, 0, 0); + transform: scale3d(.475, .475, .475) translate3d(-42px, 0, 0); + } + + 100% { + opacity: 0; + -webkit-transform: scale(.1) translate3d(2000px, 0, 0); + transform: scale(.1) translate3d(2000px, 0, 0); + -webkit-transform-origin: right center; + transform-origin: right center; + } +} + +.zoomOutRight { + -webkit-animation-name: zoomOutRight; + animation-name: zoomOutRight; +} + +@-webkit-keyframes zoomOutUp { + 40% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0); + transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + 100% { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(0, -2000px, 0); + transform: scale3d(.1, .1, .1) translate3d(0, -2000px, 0); + -webkit-transform-origin: center bottom; + transform-origin: center bottom; + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +@keyframes zoomOutUp { + 40% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0); + transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + 100% { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(0, -2000px, 0); + transform: scale3d(.1, .1, .1) translate3d(0, -2000px, 0); + -webkit-transform-origin: center bottom; + transform-origin: center bottom; + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +.zoomOutUp { + -webkit-animation-name: zoomOutUp; + animation-name: zoomOutUp; +} + +@-webkit-keyframes slideInDown { + from { + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + visibility: visible; + } + + 100% { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +@keyframes slideInDown { + from { + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + visibility: visible; + } + + 100% { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +.slideInDown { + -webkit-animation-name: slideInDown; + animation-name: slideInDown; +} + +@-webkit-keyframes slideInLeft { + from { + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + visibility: visible; + } + + 100% { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +@keyframes slideInLeft { + from { + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + visibility: visible; + } + + 100% { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +.slideInLeft { + -webkit-animation-name: slideInLeft; + animation-name: slideInLeft; +} + +@-webkit-keyframes slideInRight { + from { + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + visibility: visible; + } + + 100% { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +@keyframes slideInRight { + from { + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + visibility: visible; + } + + 100% { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +.slideInRight { + -webkit-animation-name: slideInRight; + animation-name: slideInRight; +} + +@-webkit-keyframes slideInUp { + from { + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + visibility: visible; + } + + 100% { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +@keyframes slideInUp { + from { + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + visibility: visible; + } + + 100% { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +.slideInUp { + -webkit-animation-name: slideInUp; + animation-name: slideInUp; +} + +@-webkit-keyframes slideOutDown { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + 100% { + visibility: hidden; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } +} + +@keyframes slideOutDown { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + 100% { + visibility: hidden; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } +} + +.slideOutDown { + -webkit-animation-name: slideOutDown; + animation-name: slideOutDown; +} + +@-webkit-keyframes slideOutLeft { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + 100% { + visibility: hidden; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } +} + +@keyframes slideOutLeft { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + 100% { + visibility: hidden; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } +} + +.slideOutLeft { + -webkit-animation-name: slideOutLeft; + animation-name: slideOutLeft; +} + +@-webkit-keyframes slideOutRight { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + 100% { + visibility: hidden; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } +} + +@keyframes slideOutRight { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + 100% { + visibility: hidden; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } +} + +.slideOutRight { + -webkit-animation-name: slideOutRight; + animation-name: slideOutRight; +} + +@-webkit-keyframes slideOutUp { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + 100% { + visibility: hidden; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } +} + +@keyframes slideOutUp { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + 100% { + visibility: hidden; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } +} + +.slideOutUp { + -webkit-animation-name: slideOutUp; + animation-name: slideOutUp; +} \ No newline at end of file diff --git a/static/src/css/fullpage/jquery.fullPage.css b/static/src/css/fullpage/jquery.fullPage.css new file mode 100755 index 00000000..c43e2616 --- /dev/null +++ b/static/src/css/fullpage/jquery.fullPage.css @@ -0,0 +1,208 @@ +/** + * fullPage 2.6.6 + * https://github.com/alvarotrigo/fullPage.js + * MIT licensed + * + * Copyright (C) 2013 alvarotrigo.com - A project by Alvaro Trigo + */ +html.fp-enabled, +.fp-enabled body { + margin: 0; + padding: 0; + overflow:hidden; + + /*Avoid flicker on slides transitions for mobile phones #336 */ + -webkit-tap-highlight-color: rgba(0,0,0,0); +} +#superContainer { + height: 100%; + position: relative; + + /* Touch detection for Windows 8 */ + -ms-touch-action: none; + + /* IE 11 on Windows Phone 8.1*/ + touch-action: none; +} +.fp-section { + position: relative; + -webkit-box-sizing: border-box; /* Safari<=5 Android<=3 */ + -moz-box-sizing: border-box; /* <=28 */ + box-sizing: border-box; +} +.fp-slide { + float: left; +} +.fp-slide, .fp-slidesContainer { + height: 100%; + display: block; +} +.fp-slides { + z-index:1; + height: 100%; + overflow: hidden; + position: relative; + -webkit-transition: all 0.3s ease-out; /* Safari<=6 Android<=4.3 */ + transition: all 0.3s ease-out; +} +.fp-section.fp-table, .fp-slide.fp-table { + display: table; + table-layout:fixed; + width: 100%; +} +.fp-tableCell { + display: table-cell; + vertical-align: middle; + width: 100%; + height: 100%; +} +.fp-slidesContainer { + float: left; + position: relative; +} +.fp-controlArrow { + position: absolute; + z-index: 4; + top: 50%; + cursor: pointer; + width: 0; + height: 0; + border-style: solid; + margin-top: -38px; + -webkit-transform: translate3d(0,0,0); + -ms-transform: translate3d(0,0,0); + transform: translate3d(0,0,0); +} +.fp-controlArrow.fp-prev { + left: 15px; + width: 0; + border-width: 38.5px 34px 38.5px 0; + border-color: transparent #fff transparent transparent; +} +.fp-controlArrow.fp-next { + right: 15px; + border-width: 38.5px 0 38.5px 34px; + border-color: transparent transparent transparent #fff; +} +.fp-scrollable { + overflow: scroll; +} +.fp-notransition { + -webkit-transition: none !important; + transition: none !important; +} +#fp-nav { + position: fixed; + z-index: 100; + margin-top: -32px; + top: 50%; + opacity: 1; + -webkit-transform: translate3d(0,0,0); +} +#fp-nav.right { + right: 17px; +} +#fp-nav.left { + left: 17px; +} +.fp-slidesNav{ + position: absolute; + z-index: 4; + left: 50%; + opacity: 1; +} +.fp-slidesNav.bottom { + bottom: 17px; +} +.fp-slidesNav.top { + top: 17px; +} +#fp-nav ul, +.fp-slidesNav ul { + margin: 0; + padding: 0; +} +#fp-nav ul li, +.fp-slidesNav ul li { + display: block; + width: 14px; + height: 13px; + margin: 7px; + position:relative; +} +.fp-slidesNav ul li { + display: inline-block; +} +#fp-nav ul li a, +.fp-slidesNav ul li a { + display: block; + position: relative; + z-index: 1; + width: 100%; + height: 100%; + cursor: pointer; + text-decoration: none; +} +#fp-nav ul li a.active span, +.fp-slidesNav ul li a.active span, +#fp-nav ul li:hover a.active span, +.fp-slidesNav ul li:hover a.active span{ + height: 12px; + width: 12px; + margin: -6px 0 0 -6px; + border-radius: 100%; + } +#fp-nav ul li a span, +.fp-slidesNav ul li a span { + border-radius: 50%; + position: absolute; + z-index: 1; + height: 4px; + width: 4px; + border: 0; + background: #333; + left: 50%; + top: 50%; + margin: -2px 0 0 -2px; + -webkit-transition: all 0.1s ease-in-out; + -moz-transition: all 0.1s ease-in-out; + -o-transition: all 0.1s ease-in-out; + transition: all 0.1s ease-in-out; +} +#fp-nav ul li:hover a span, +.fp-slidesNav ul li:hover a span{ + width: 10px; + height: 10px; + margin: -5px 0px 0px -5px; +} +#fp-nav ul li .fp-tooltip { + position: absolute; + top: -2px; + color: #fff; + font-size: 14px; + font-family: arial, helvetica, sans-serif; + white-space: nowrap; + max-width: 220px; + overflow: hidden; + display: block; + opacity: 0; + width: 0; +} +#fp-nav ul li:hover .fp-tooltip, +#fp-nav.fp-show-active a.active + .fp-tooltip { + -webkit-transition: opacity 0.2s ease-in; + transition: opacity 0.2s ease-in; + width: auto; + opacity: 1; +} +#fp-nav ul li .fp-tooltip.right { + right: 20px; +} +#fp-nav ul li .fp-tooltip.left { + left: 20px; +} +.fp-auto-height.fp-section, +.fp-auto-height .fp-slide, +.fp-auto-height .fp-tableCell{ + height: auto !important; +} \ No newline at end of file diff --git a/static/src/img/index/a.png b/static/src/img/index/a.png new file mode 100755 index 0000000000000000000000000000000000000000..40d0d2d079c15c952e35e1e486698b413c80cf8a GIT binary patch literal 18850 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 Z;Ufk$_fB_%d- -
+ + -
-

青岛大学在线评测平台

+ + + 青岛大学在线评测平台 - 首页 -

走心的在线评测平台和算法交流社区,全新登场~

+ + + + + + + + + + + + + + +
+
+
+

青岛大学在线评测平台

+ +

全新面貌,新的开始~

+
+
↓继续滚动~
+
+
+ +
+ + +

青岛大学在线评测平台

+ +

全新面貌,新的开始~

+
+ +
+
+ +
+ + +

青岛大学在线评测平台

+ +

全新面貌,新的开始~

-{% endblock %} \ No newline at end of file +
+ +
+ + +

青岛大学在线评测平台

+ +

全新面貌,新的开始~

+
+
+
+ + + From 624f71d5aff40a1d891a3f75cd70d1662450f592 Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Wed, 19 Aug 2015 20:16:46 +0800 Subject: [PATCH 08/22] =?UTF-8?q?=E6=96=B0=E9=A6=96=E9=A1=B5=E7=9A=84=20js?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../js/lib/fullpage/jquery.fullPage.min.js | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100755 static/src/js/lib/fullpage/jquery.fullPage.min.js diff --git a/static/src/js/lib/fullpage/jquery.fullPage.min.js b/static/src/js/lib/fullpage/jquery.fullPage.min.js new file mode 100755 index 00000000..9107b4e7 --- /dev/null +++ b/static/src/js/lib/fullpage/jquery.fullPage.min.js @@ -0,0 +1,56 @@ +/*! + * fullPage 2.6.9 + * https://github.com/alvarotrigo/fullPage.js + * @license MIT licensed + * + * Copyright (C) 2015 alvarotrigo.com - A project by Alvaro Trigo + */ +(function(c,m){"function"===typeof define&&define.amd?define(["jquery"],function(l){return m(l,c,c.document,c.Math)}):"undefined"!==typeof exports?module.exports=m(require("jquery"),c,c.document,c.Math):m(jQuery,c,c.document,c.Math)})("undefined"!==typeof window?window:this,function(c,m,l,p,H){var n=c(m),w=c(l);c.fn.fullpage=function(d){function Ka(){h.css({height:"100%",position:"relative"});h.addClass("fullpage-wrapper");c("html").addClass("fp-enabled");d.css3&&(d.css3=La());d.anchors.length||(d.anchors= +c("[data-anchor]").map(function(){return c(this).data("anchor").toString()}).get());e.setAllowScrolling(!0);h.removeClass("fp-destroyed");Ma();c(".fp-section").each(function(a){var b=c(this),e=b.find(".fp-slide"),h=e.length;a||0!==c(".fp-section.active").length||b.addClass("active");b.css("height",r+"px");d.paddingTop&&b.css("padding-top",d.paddingTop);d.paddingBottom&&b.css("padding-bottom",d.paddingBottom);"undefined"!==typeof d.sectionsColor[a]&&b.css("background-color",d.sectionsColor[a]);"undefined"!== +typeof d.anchors[a]&&(b.attr("data-anchor",d.anchors[a]),b.hasClass("active")&&I(d.anchors[a],a));d.menu&&d.css3&&c(d.menu).closest(".fullpage-wrapper").length&&c(d.menu).appendTo(q);0');b.parent().wrap('
');a.find(".fp-slidesContainer").css("width",f+"%");1
');"#fff"!=d.controlArrowColor&&(a.find(".fp-controlArrow.fp-next").css("border-color","transparent transparent transparent "+d.controlArrowColor),a.find(".fp-controlArrow.fp-prev").css("border-color","transparent "+d.controlArrowColor+" transparent transparent"));d.loopHorizontal||a.find(".fp-controlArrow.fp-prev").hide()}function Oa(){q.append('
    '); +var a=c("#fp-nav");a.addClass(function(){return d.showActiveTooltip?"fp-show-active "+d.navigationPosition:d.navigationPosition});for(var b=0;b',f=d.navigationTooltips[b];"undefined"!==typeof f&&""!==f&&(g+='
    '+f+"
    ");g+="";a.find("ul").append(g)}c("#fp-nav").css("margin-top","-"+c("#fp-nav").height()/2+"px");c("#fp-nav").find("li").eq(c(".fp-section.active").index(".fp-section")).find("a").addClass("active")} +function ja(){c(".fp-section").each(function(){var a=c(this).find(".fp-slide");a.length?a.each(function(){J(c(this))}):J(c(this))});ka()}function ka(){var a=c(".fp-section.active"),b=a.find("SLIDES_WRAPPER"),g=a.find(".fp-scrollable");b.length&&(g=b.find(".fp-slide.active"));g.mouseover();K(a);na(a);c.isFunction(d.afterLoad)&&d.afterLoad.call(a,a.data("anchor"),a.index(".fp-section")+1);c.isFunction(d.afterRender)&&d.afterRender.call(h)}function oa(){var a;if(!d.autoScrolling||d.scrollBar){for(var b= +n.scrollTop(),g=0,f=p.abs(b-l.querySelectorAll(".fp-section")[0].offsetTop),e=l.querySelectorAll(".fp-section"),h=0;h=b[0].scrollHeight:void 0,d)c();else return!0;else c()}}function Ra(a){var b=a.originalEvent;if(!qa(a.target)&&ba(b)){d.autoScrolling&&a.preventDefault();a=c(".fp-section.active");var g=pa(a);y&&!z&&(b=ra(b),D=b.y,M=b.x,a.find(".fp-slides").length&&p.abs(N-M)>p.abs(E-D)?p.abs(N-M)>n.width()/100*d.touchSensitivity&&(N>M?k.m.right&&e.moveSlideRight():k.m.left&&e.moveSlideLeft()):d.autoScrolling&& +p.abs(E-D)>n.height()/100*d.touchSensitivity&&(E>D?L("down",g):D>E&&L("up",g)))}}function qa(a,b){b=b||0;var g=c(a).parent();return b=g&&(0>f?L("down",a):L("up",a)));return!1}d.fitToSection&&t.stop()}function ua(a){var b=c(".fp-section.active").find(".fp-slides"),g=b.find(".fp-slide").length; +if(!(!b.length||z||2>g)){var g=b.find(".fp-slide.active"),f=null,f="prev"===a?g.prev(".fp-slide"):g.next(".fp-slide");if(!f.length){if(!d.loopHorizontal)return;f="prev"===a?g.siblings(":last"):g.siblings(":first")}z=!0;F(b,f)}}function va(){c(".fp-slide.active").each(function(){U(c(this),"internal")})}function B(a,b,g){requestAnimFrame(function(){var f=a.position();if("undefined"!==typeof f){var e=a.hasClass("fp-auto-height")?f.top-r+a.height():f.top,f={element:a,callback:b,isMovementUp:g,dest:f, +dtop:e,yMovement:X(a),anchorLink:a.data("anchor"),sectionIndex:a.index(".fp-section"),activeSlide:a.find(".fp-slide.active"),activeSection:c(".fp-section.active"),leavingSection:c(".fp-section.active").index(".fp-section")+1,localIsResizing:v};if(!(f.activeSection.is(a)&&!v||d.scrollBar&&n.scrollTop()===f.dtop)){if(f.activeSlide.length)var h=f.activeSlide.data("anchor"),k=f.activeSlide.index();d.autoScrolling&&d.continuousVertical&&"undefined"!==typeof f.isMovementUp&&(!f.isMovementUp&&"up"==f.yMovement|| +f.isMovementUp&&"down"==f.yMovement)&&(f.isMovementUp?c(".fp-section.active").before(f.activeSection.nextAll(".fp-section")):c(".fp-section.active").after(f.activeSection.prevAll(".fp-section").get().reverse()),x(c(".fp-section.active").position().top),va(),f.wrapAroundElements=f.activeSection,f.dest=f.element.position(),f.dtop=f.dest.top,f.yMovement=X(f.element));if(c.isFunction(d.onLeave)&&!f.localIsResizing){if(!1===d.onLeave.call(f.activeSection,f.leavingSection,f.sectionIndex+1,f.yMovement))return; +Ta(f.activeSection)}a.addClass("active").siblings().removeClass("active");y=!1;Y(k,h,f.anchorLink,f.sectionIndex);Ua(f);A=f.anchorLink;I(f.anchorLink,f.sectionIndex)}}})}function Ua(a){if(d.css3&&d.autoScrolling&&!d.scrollBar)wa("translate3d(0px, -"+a.dtop+"px, 0px)",!0),d.scrollingSpeed?ca=setTimeout(function(){da(a)},d.scrollingSpeed):da(a);else{var b=Va(a);c(b.element).animate(b.options,d.scrollingSpeed,d.easing).promise().done(function(){da(a)})}}function Va(a){var b={};d.autoScrolling&&!d.scrollBar? +(b.options={top:-a.dtop},b.element=".fullpage-wrapper"):(b.options={scrollTop:a.dtop},b.element="html, body");return b}function da(a){a.wrapAroundElements&&a.wrapAroundElements.length&&(a.isMovementUp?c(".fp-section:first").before(a.wrapAroundElements):c(".fp-section:last").after(a.wrapAroundElements),x(c(".fp-section.active").position().top),va());a.element.find(".fp-scrollable").mouseover();c.isFunction(d.afterLoad)&&!a.localIsResizing&&d.afterLoad.call(a.element,a.anchorLink,a.sectionIndex+1); +K(a.element);na(a.element);y=!0;c.isFunction(a.callback)&&a.callback.call(this)}function K(a){var b=a.find(".fp-slide.active");b.length&&(a=c(b));a.find("img[data-src], source[data-src], audio[data-src]").each(function(){c(this).attr("src",c(this).data("src"));c(this).removeAttr("data-src");c(this).is("source")&&c(this).closest("video").get(0).load()})}function na(a){a.find("video, audio").each(function(){var a=c(this).get(0);a.hasAttribute("autoplay")&&"function"===typeof a.play&&a.play()})}function Ta(a){a.find("video, audio").each(function(){var a= +c(this).get(0);a.hasAttribute("data-ignore")||"function"!==typeof a.pause||a.pause()})}function xa(){if(!W&&!d.lockAnchors){var a=m.location.hash.replace("#","").split("/"),b=a[0],a=a[1];if(b.length){var c="undefined"===typeof A,f="undefined"===typeof A&&"undefined"===typeof a&&!z;(b&&b!==A&&!c||f||!z&&ea!=a)&&V(b,a)}}}function Wa(a){y&&(a.pageYP&&e.moveSectionDown());P=a.pageY}function F(a,b){var g=b.position(),f=b.index(),e=a.closest(".fp-section"),h=e.index(".fp-section"), +k=e.data("anchor"),l=e.find(".fp-slidesNav"),m=ya(b),n=v;if(d.onSlideLeave){var q=e.find(".fp-slide.active"),r=q.index(),t;t=r==f?"none":r>f?"left":"right";if(!n&&"none"!==t&&c.isFunction(d.onSlideLeave)&&!1===d.onSlideLeave.call(q,k,h+1,r,t,f)){z=!1;return}}b.addClass("active").siblings().removeClass("active");K(b);!d.loopHorizontal&&d.controlArrows&&(e.find(".fp-controlArrow.fp-prev").toggle(0!==f),e.find(".fp-controlArrow.fp-next").toggle(!b.is(":last-child")));e.hasClass("active")&&Y(f,m,k,h); +var u=function(){n||c.isFunction(d.afterSlideLoad)&&d.afterSlideLoad.call(b,k,h+1,m,f);z=!1};d.css3?(g="translate3d(-"+p.round(g.left)+"px, 0px, 0px)",za(a.find(".fp-slidesContainer"),020*p.max(ga,a)/100&&(e.reBuild(!0),ga=a))}else clearTimeout(ha),ha=setTimeout(function(){e.reBuild(!0)},350)}function la(){var a=d.responsive||d.responsiveWidth,b=d.responsiveHeight;a&&e.setResponsive(n.width() +a||900>b){var d=p.min(100*a/825,100*b/900).toFixed(2);q.css("font-size",d+"%")}else q.css("font-size","100%")}function I(a,b){d.menu&&(c(d.menu).find(".active").removeClass("active"),c(d.menu).find('[data-menuanchor="'+a+'"]').addClass("active"));d.navigation&&(c("#fp-nav").find(".active").removeClass("active"),a?c("#fp-nav").find('a[href="#'+a+'"]').addClass("active"):c("#fp-nav").find("li").eq(b).find("a").addClass("active"))}function X(a){var b=c(".fp-section.active").index(".fp-section");a=a.index(".fp-section"); +return b==a?"none":b>a?"up":"down"}function J(a){a.css("overflow","hidden");var b=a.closest(".fp-section"),c=a.find(".fp-scrollable"),f;c.length?f=c.get(0).scrollHeight:(f=a.get(0).scrollHeight,d.verticalCentered&&(f=a.find(".fp-tableCell").get(0).scrollHeight));b=r-parseInt(b.css("padding-bottom"))-parseInt(b.css("padding-top"));f>b?c.length?c.css("height",b+"px").parent().css("height",b+"px"):(d.verticalCentered?a.find(".fp-tableCell").wrapInner('
    '):a.wrapInner('
    '), +a.find(".fp-scrollable").slimScroll({allowPageScroll:!0,height:b+"px",size:"10px",alwaysVisible:!0})):Ca(a);a.css("overflow","")}function Ca(a){a.find(".fp-scrollable").children().first().unwrap().unwrap();a.find(".slimScrollBar").remove();a.find(".slimScrollRail").remove()}function ia(a){a.addClass("fp-table").wrapInner('
    ')}function Da(a){var b=r;if(d.paddingTop||d.paddingBottom)b=a,b.hasClass("fp-section")||(b=a.closest(".fp-section")),a=parseInt(b.css("padding-top"))+ +parseInt(b.css("padding-bottom")),b=r-a;return b}function wa(a,b){b?za(h):h.addClass("fp-notransition");h.css(Aa(a));setTimeout(function(){h.removeClass("fp-notransition")},10)}function Ea(a){var b=c('.fp-section[data-anchor="'+a+'"]');b.length||(b=c(".fp-section").eq(a-1));return b}function V(a,b){var d=Ea(a);"undefined"===typeof b&&(b=0);a===A||d.hasClass("active")?Fa(d,b):B(d,function(){Fa(d,b)})}function Fa(a,b){if("undefined"!==typeof b){var d=a.find(".fp-slides"),c;c=a.find(".fp-slides");var e= +c.find('.fp-slide[data-anchor="'+b+'"]');e.length||(e=c.find(".fp-slide").eq(b));c=e;c.length&&F(d,c)}}function Qa(a,b){a.append('
      ');var c=a.find(".fp-slidesNav");c.addClass(d.slidesNavPosition);for(var f=0;f');c.css("margin-left","-"+c.width()/2+"px");c.find("li").first().find("a").addClass("active")}function Y(a,b,c,f){f="";d.anchors.length&&!d.lockAnchors&&(a?("undefined"!==typeof c&&(f=c), +"undefined"===typeof b&&(b=a),ea=b,Ga(f+"/"+b)):("undefined"!==typeof a&&(ea=b),Ga(c)));ma()}function Ga(a){if(d.recordHistory)location.hash=a;else if(Q||R)history.replaceState(H,H,"#"+a);else{var b=m.location.href.split("#")[0];m.location.replace(b+"#"+a)}}function ya(a){var b=a.data("anchor");a=a.index();"undefined"===typeof b&&(b=a);return b}function ma(){var a=c(".fp-section.active"),b=a.find(".fp-slide.active"),e=a.data("anchor"),f=ya(b),a=a.index(".fp-section"),a=String(a);d.anchors.length&& +(a=e);b.length&&(a=a+"-"+f);a=a.replace("/","-").replace("#","");q[0].className=q[0].className.replace(RegExp("\\b\\s?fp-viewing-[^\\s]+\\b","g"),"");q.addClass("fp-viewing-"+a)}function La(){var a=l.createElement("p"),b,d={webkitTransform:"-webkit-transform",OTransform:"-o-transform",msTransform:"-ms-transform",MozTransform:"-moz-transform",transform:"transform"};l.body.insertBefore(a,null);for(var c in d)a.style[c]!==H&&(a.style[c]="translate3d(1px,1px,1px)",b=m.getComputedStyle(a).getPropertyValue(d[c])); +l.body.removeChild(a);return b!==H&&0(b/=e/2)?d/2*b*b*b+c:d/2*((b-=2)*b*b+2)+c}});c.extend(c.easing,{easeInQuart:function(a,b,c,d,e){return d*(b/=e)*b*b*b+c}});e.setAutoScrolling=function(a,b){S("autoScrolling",a,b);var g=c(".fp-section.active");d.autoScrolling&&!d.scrollBar? +(t.css({overflow:"hidden",height:"100%"}),e.setRecordHistory(d.recordHistory,"internal"),h.css({"-ms-touch-action":"none","touch-action":"none"}),g.length&&x(g.position().top)):(t.css({overflow:"visible",height:"initial"}),e.setRecordHistory(!1,"internal"),h.css({"-ms-touch-action":"","touch-action":""}),x(0),g.length&&t.scrollTop(g.position().top))};e.setRecordHistory=function(a,b){S("recordHistory",a,b)};e.setScrollingSpeed=function(a,b){S("scrollingSpeed",a,b)};e.setFitToSection=function(a,b){S("fitToSection", +a,b)};e.setLockAnchors=function(a){d.lockAnchors=a};e.setMouseWheelScrolling=function(a){a?l.addEventListener?(l.addEventListener("mousewheel",u,!1),l.addEventListener("wheel",u,!1),l.addEventListener("DOMMouseScroll",u,!1)):l.attachEvent("onmousewheel",u):l.addEventListener?(l.removeEventListener("mousewheel",u,!1),l.removeEventListener("wheel",u,!1),l.removeEventListener("DOMMouseScroll",u,!1)):l.detachEvent("onmousewheel",u)};e.setAllowScrolling=function(a,b){"undefined"!==typeof b?(b=b.replace(/ /g, +"").split(","),c.each(b,function(b,c){Ia(a,c,"m")})):a?(e.setMouseWheelScrolling(!0),Ya()):(e.setMouseWheelScrolling(!1),Za())};e.setKeyboardScrolling=function(a,b){"undefined"!==typeof b?(b=b.replace(/ /g,"").split(","),c.each(b,function(b,c){Ia(a,c,"k")})):d.keyboardScrolling=a};e.moveSectionUp=function(){var a=c(".fp-section.active").prev(".fp-section");a.length||!d.loopTop&&!d.continuousVertical||(a=c(".fp-section").last());a.length&&B(a,null,!0)};e.moveSectionDown=function(){var a=c(".fp-section.active").next(".fp-section"); +a.length||!d.loopBottom&&!d.continuousVertical||(a=c(".fp-section").first());!a.length||d.onBeforeMoveSection&&c.isFunction(d.onBeforeMoveSection)&&!1===d.onBeforeMoveSection.call(this,direction,currentSlide,destiny,slides,activeSection)||B(a,null,!1)};e.silentMoveTo=function(a,b){e.setScrollingSpeed(0,"internal");e.moveTo(a,b);e.setScrollingSpeed(G.scrollingSpeed,"internal")};e.moveTo=function(a,b){var c=Ea(a);"undefined"!==typeof b?V(a,b):0 Date: Wed, 19 Aug 2015 20:32:11 +0800 Subject: [PATCH 09/22] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E9=A6=96=E9=A1=B5?= =?UTF-8?q?=E6=96=87=E5=AD=97=E6=8F=8F=E8=BF=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- template/oj/index.html | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/template/oj/index.html b/template/oj/index.html index fc25a87b..df4299cd 100644 --- a/template/oj/index.html +++ b/template/oj/index.html @@ -107,9 +107,9 @@
      -

      青岛大学在线评测平台

      +

      分布式评测

      -

      全新面貌,新的开始~

      +

      再也不怕一直是 waiting 了~~

      @@ -118,9 +118,9 @@
      -

      青岛大学在线评测平台

      +

      多种比赛模式

      -

      全新面貌,新的开始~

      +

      ACM 模式,AC 数量模式,单题得分模式等

      @@ -128,9 +128,9 @@
      -

      青岛大学在线评测平台

      +

      自由举办小组赛

      -

      全新面貌,新的开始~

      +

      内部比赛,日常作业,期末考试,通通搞定

      From d8dd9cd72cd49b632784f3ce6d7cc327e4916429 Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Thu, 20 Aug 2015 13:47:57 +0800 Subject: [PATCH 10/22] =?UTF-8?q?=E5=AE=8C=E6=88=90=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?=E5=99=A8=E5=88=A4=E9=A2=98=E9=98=9F=E5=88=97=E9=95=BF=E5=BA=A6?= =?UTF-8?q?=E7=9B=91=E6=8E=A7=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- judge/judger_controller/tasks.py | 12 +----------- monitor/__init__.py | 0 monitor/views.py | 15 +++++++++++++++ oj/urls.py | 2 ++ 4 files changed, 18 insertions(+), 11 deletions(-) create mode 100644 monitor/__init__.py create mode 100644 monitor/views.py diff --git a/judge/judger_controller/tasks.py b/judge/judger_controller/tasks.py index e61da72b..a25972e8 100644 --- a/judge/judger_controller/tasks.py +++ b/judge/judger_controller/tasks.py @@ -10,12 +10,6 @@ from settings import docker_config, source_code_dir, test_case_dir, submission_d @app.task def judge(submission_id, time_limit, memory_limit, test_case_id): - # 先更新判题队列长度 - r = redis.StrictRedis(host=redis_config["host"], port=redis_config["port"], db=redis_config["db"]) - length = r.incr("queue_length") - now = datetime.datetime.now() - # 使用hash key是今天的日期 value 的 key 是当前时分秒 12:02:03 value 是队列长度 - r.hset(str(datetime.date.today()), ":".join([str(now.hour), str(now.minute), str(now.second)]), length) try: command = "%s run -t -i --privileged --rm=true " \ "-v %s:/var/judger/test_case/ " \ @@ -42,8 +36,4 @@ def judge(submission_id, time_limit, memory_limit, test_case_id): cur.execute("update submission set result=%s, info=%s where id=%s", (result["system_error"], str(e), submission_id)) conn.commit() - conn.close() - r.decr("queue_length") - now = datetime.datetime.now() - # 使用hash key是今天的日期 value 的 key 是当前时分秒 12:02:03 value 是队列长度 - r.hset(str(datetime.date.today()), ":".join([str(now.hour), str(now.minute), str(now.second)]), length) + conn.close() \ No newline at end of file diff --git a/monitor/__init__.py b/monitor/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/monitor/views.py b/monitor/views.py new file mode 100644 index 00000000..21561bf0 --- /dev/null +++ b/monitor/views.py @@ -0,0 +1,15 @@ +# coding=utf-8 +import redis +import datetime +from rest_framework.views import APIView +from judge.judger.result import result +from utils.shortcuts import success_response +from submission.models import Submission + + +class QueueLengthMonitorAPIView(APIView): + def get(self, request): + waiting_number = Submission.objects.filter(result=result["waiting"]).count() + now = datetime.datetime.now() + return success_response({"time": ":".join([str(now.hour), str(now.minute), str(now.second)]), + "count": waiting_number}) \ No newline at end of file diff --git a/oj/urls.py b/oj/urls.py index ef9e5032..60186149 100644 --- a/oj/urls.py +++ b/oj/urls.py @@ -15,6 +15,7 @@ from admin.views import AdminTemplateView from problem.views import TestCaseUploadAPIView, ProblemTagAdminAPIView, ProblemAdminAPIView from submission.views import SubmissionAPIView, SubmissionAdminAPIView +from monitor.views import QueueLengthMonitorAPIView urlpatterns = [ @@ -58,5 +59,6 @@ urlpatterns = [ name="join_group_request_admin_api"), url(r'^api/submission/$', SubmissionAPIView.as_view(), name="submission_api"), url(r'^api/admin/submission/$', SubmissionAdminAPIView.as_view(), name="submission_admin_api_view"), + url(r'^api/admin/monitor/$', QueueLengthMonitorAPIView.as_view(), name="queue_length_monitor_api"), ] From 55e4bcb2966a326f015c043b262d5468af784b21 Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Thu, 20 Aug 2015 13:48:19 +0800 Subject: [PATCH 11/22] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E9=94=99=E8=AF=AF=E7=9A=84=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- template/oj/problem/problem_list.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/template/oj/problem/problem_list.html b/template/oj/problem/problem_list.html index 012f5d27..2909e204 100644 --- a/template/oj/problem/problem_list.html +++ b/template/oj/problem/problem_list.html @@ -1,7 +1,7 @@ {% extends "oj_base.html" %} {% block body %} {% load problem %} -
      +
      From 4146719673c491ef2ee4da525542c28a7af276cf Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Thu, 20 Aug 2015 13:48:43 +0800 Subject: [PATCH 12/22] =?UTF-8?q?=E5=AE=8C=E6=88=90=E7=9B=91=E6=8E=A7?= =?UTF-8?q?=E5=88=A4=E9=A2=98=E9=98=9F=E5=88=97=E9=95=BF=E5=BA=A6=E7=9A=84?= =?UTF-8?q?=E5=89=8D=E7=AB=AF=E9=A1=B5=E9=9D=A2=E5=92=8C=20js?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- static/src/js/app/admin/monitor/monitor.js | 82 ++++++---------------- template/admin/monitor/monitor.html | 16 +---- 2 files changed, 21 insertions(+), 77 deletions(-) diff --git a/static/src/js/app/admin/monitor/monitor.js b/static/src/js/app/admin/monitor/monitor.js index 19e637d6..7c76422d 100644 --- a/static/src/js/app/admin/monitor/monitor.js +++ b/static/src/js/app/admin/monitor/monitor.js @@ -1,54 +1,6 @@ require(["jquery", "chart"], function ($, Chart) { - var data2 = { - labels: ["January", "February", "March", "April", "May", "June", "July", - "January", "February", "March", "April", "January", "February", "March", "April"], - datasets: [ - { - label: "2222222", - fillColor: "rgba(255,255,255,0.2)", - strokeColor: "rgba(151,187,205,1)", - pointColor: "rgba(151,187,205,1)", - pointStrokeColor: "#fff", - pointHighlightFill: "#fff", - pointHighlightStroke: "rgba(151,187,205,1)", - data: [3, 7, 8, 9, 1, 4, 10, 10, 9, 8, 7, 10, 10, 10, 10] - } - ] - }; - new Chart($("#waiting-queue-chart").get(0).getContext("2d")).Line(data2); - var data = { - labels: ["January", "February", "March", "April", "May", "June", "July", - "January", "February", "March", "April", "January", "February", "March", "April"], - datasets: [ - { - label: "11111111", - fillColor: "rgba(255,255,255,0.2)", - strokeColor: "rgba(250,68,68,1)", - pointColor: "rgba(220,220,220,1)", - pointStrokeColor: "#fff", - pointHighlightFill: "#fff", - pointHighlightStroke: "rgba(220,220,220,1)", - data: [10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10] - }, - { - label: "2222222", - fillColor: "rgba(255,255,255,0.2)", - strokeColor: "rgba(151,187,205,1)", - pointColor: "rgba(151,187,205,1)", - pointStrokeColor: "#fff", - pointHighlightFill: "#fff", - pointHighlightStroke: "rgba(151,187,205,1)", - data: [3, 7, 8, 9, 1, 4, 10, 10, 9, 8, 7, 10, 10, 10, 10] - } - ] - }; - Chart.defaults.global.responsive = true; - new Chart($("#judge-instance-chart").get(0).getContext("2d")).Line(data); - - var data1 = { - labels: ["January", "February", "March", "April", "May", "June", "July", - "January", "February", "March", "April", "January", "February", "March", "April"], + labels: ["初始化"], datasets: [ { label: "2222222", @@ -58,23 +10,29 @@ require(["jquery", "chart"], function ($, Chart) { pointStrokeColor: "#fff", pointHighlightFill: "#fff", pointHighlightStroke: "rgba(151,187,205,1)", - data: [3, 7, 8, 9, 1, 4, 10, 10, 9, 8, 7, 10, 10, 10, 10] - }, - { - label: "2222222", - fillColor: "rgba(255,255,255,0.2)", - strokeColor: "rgba(252,214,48,1)", - pointColor: "rgba(252,214,48,1)", - pointStrokeColor: "#fff", - pointHighlightFill: "#fff", - pointHighlightStroke: "rgba(151,187,205,1)", - data: [30, 70, 58, 49, 19, 44, 100, 100, 89, 88, 77, 50, 80, 66, 100] + data: [0] } ] }; - Chart.defaults.global.responsive = true; - new Chart($("#c1").get(0).getContext("2d")).Line(data1); + var chart = new Chart($("#waiting-queue-chart").get(0).getContext("2d")).Line(data); + function getMonitorData(){ + $.ajax({ + url: "/api/admin/monitor/", + method: "get", + dataType: "json", + success: function(data){ + if(!data.code){ + chart.addData([data.data["count"]], data.data["time"]) + } + } + }) + } + $("#clear-chart-data").click(function(){ + chart.removeData(); + }); + + setInterval(getMonitorData, 3000); }); \ No newline at end of file diff --git a/template/admin/monitor/monitor.html b/template/admin/monitor/monitor.html index 657586c4..0ccf6df8 100644 --- a/template/admin/monitor/monitor.html +++ b/template/admin/monitor/monitor.html @@ -9,21 +9,7 @@
      -
      - -

      【10.1.24.23 - judge1 】

      - -
      - -
      判题实例数量变化
      -
      - -
      - -
      cpu 和 内存
      -
      -
      - +
      \ No newline at end of file From d0211c3d1b2c5bb00c4716f563d7a6b1f6796228 Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Thu, 20 Aug 2015 20:51:06 +0800 Subject: [PATCH 13/22] =?UTF-8?q?admin=20=E5=8F=B3=E4=BE=A7=E5=AF=BC?= =?UTF-8?q?=E8=88=AA=E6=A0=8F=E4=BF=AE=E6=94=B9=E4=B8=BA=20js=20=E7=94=9F?= =?UTF-8?q?=E6=88=90=EF=BC=8C=E6=A0=B9=E6=8D=AE=E7=94=A8=E6=88=B7=E8=BA=AB?= =?UTF-8?q?=E4=BB=BD=E6=9D=83=E9=99=90=E5=8F=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- static/src/js/app/admin/admin.js | 86 ++++++++++++++++++++++++++++---- template/admin/admin.html | 29 ++++++----- 2 files changed, 94 insertions(+), 21 deletions(-) diff --git a/static/src/js/app/admin/admin.js b/static/src/js/app/admin/admin.js index c1ab3987..989cbf76 100644 --- a/static/src/js/app/admin/admin.js +++ b/static/src/js/app/admin/admin.js @@ -21,43 +21,110 @@ define("admin", ["jquery", "avalon"], function ($, avalon) { hash = "index/index"; } + var superAdminNav = [ + { name: "首页", + children: [{name: "主页", hash: "#index/index"}, + {name: "监控", hash: "#monitor/monitor"}, + {name: "统计", hash: "#statistics/statistics"}] + }, + { + name: "通用", + children: [{name: "公告管理", hash: "#announcement/announcement"}, + {name: "用户管理", hash: "#user/user_list"}] + }, + { + name: "题目管理", + children: [{name: "题目列表", hash: "#problem/problem_list"}, + {name: "创建题目", hash: "#problem/add_problem"}] + }, + { + name: "比赛管理", + children: [{name: "比赛列表", hash: "#contest/contest_list"}, + {name: "创建比赛", hash: "#contest/add_contest"}] + }, + { + name: "小组管理", + children: [{name: "小组列表", hash: "#group/group"}, + {name: "加入小组请求", hash: "#group/join_group_request_list"}] + } + ]; + + var adminNav = [ + { name: "首页", + children: [{name: "主页", hash: "#index/index"}] + }, + { + name: "通用", + children: [{name: "公告管理", hash: "#announcement/announcement"}] + }, + { + name: "比赛管理", + children: [{name: "比赛列表", hash: "#contest/contest_list"}, + {name: "创建比赛", hash: "#contest/add_contest"}] + }, + { + name: "小组管理", + children: [{name: "小组列表", hash: "#group/group"}, + {name: "加入小组请求", hash: "#group/join_group_request_list"}] + } + ]; + var vm = avalon.define({ $id: "admin", template_url: "template/" + hash + ".html", groupId: -1, problemId: -1, + adminNavList: [], hide_loading: function () { $("#loading-gif").hide(); + }, + getLiId: function(hash){ + return hash.replace("#", "li-").replace("/", "-"); } }); - vm.$watch("showGroupDetailPage", function(groupId){ + + $.ajax({ + url: "/api/user/", + method: "get", + dataType: "json", + success: function(data){ + if(!data.code){ + if (data.data.admin_type == 2){ + vm.adminNavList = superAdminNav; + } + else{ + vm.adminNavList = adminNav; + } + } + } + }); + + vm.$watch("showGroupDetailPage", function (groupId) { vm.groupId = groupId; vm.template_url = "template/group/group_detail.html"; }); - vm.$watch("showEditProblemPage", function(problemId){ + vm.$watch("showEditProblemPage", function (problemId) { vm.problemId = problemId; vm.template_url = "template/problem/edit_problem.html"; }); - vm.$watch("showProblemListPage", function(){ - vm.template_url = "template/problem/problem_list.html"; + vm.$watch("showProblemListPage", function () { + vm.template_url = "template/problem/problem_list.html"; }); - vm.$watch("showGroupListPage", function(){ - vm.template_url = "template/group/group.html"; + vm.$watch("showGroupListPage", function () { + vm.template_url = "template/group/group.html"; }); - vm.$watch("showProblemSubmissionPage", function(problemId){ + vm.$watch("showProblemSubmissionPage", function (problemId) { vm.problemId = problemId; vm.template_url = "template/problem/submission_list.html"; }); avalon.scan(); - li_active("#li-" + hash.replace("/", "-")); - window.onhashchange = function () { var hash = window.location.hash.substring(1); if (hash) { @@ -66,6 +133,7 @@ define("admin", ["jquery", "avalon"], function ($, avalon) { show_template("template/" + hash + ".html"); } }; + setTimeout(function(){li_active("#li-" + hash.replace("/", "-"));}, 500) }); diff --git a/template/admin/admin.html b/template/admin/admin.html index b233809a..1179182c 100644 --- a/template/admin/admin.html +++ b/template/admin/admin.html @@ -1,3 +1,4 @@ +{% verbatim %} @@ -8,10 +9,6 @@ 在线评测系统 - 后台管理 - - {% block css_block %}{% endblock %} - - @@ -70,7 +67,13 @@
      @@ -133,4 +137,5 @@
      - \ No newline at end of file + +{% endverbatim %} \ No newline at end of file From a9db5ee5ab750b6d31225f2cc322a4685be553a2 Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Thu, 20 Aug 2015 20:51:38 +0800 Subject: [PATCH 14/22] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=98=9F=E5=88=97?= =?UTF-8?q?=E7=9B=91=E6=8E=A7=E7=9A=84=20js=EF=BC=8C=E5=9C=A8=E7=A6=BB?= =?UTF-8?q?=E5=BC=80=E9=A1=B5=E9=9D=A2=E7=9A=84=E6=97=B6=E5=80=99=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E5=81=9C=E6=AD=A2=E8=8E=B7=E5=8F=96=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- static/src/js/app/admin/monitor/monitor.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/static/src/js/app/admin/monitor/monitor.js b/static/src/js/app/admin/monitor/monitor.js index 7c76422d..915e574b 100644 --- a/static/src/js/app/admin/monitor/monitor.js +++ b/static/src/js/app/admin/monitor/monitor.js @@ -3,7 +3,7 @@ require(["jquery", "chart"], function ($, Chart) { labels: ["初始化"], datasets: [ { - label: "2222222", + label: "队列长度", fillColor: "rgba(255,255,255,0.2)", strokeColor: "rgba(151,187,205,1)", pointColor: "rgba(151,187,205,1)", @@ -17,6 +17,10 @@ require(["jquery", "chart"], function ($, Chart) { var chart = new Chart($("#waiting-queue-chart").get(0).getContext("2d")).Line(data); function getMonitorData(){ + var hash = location.hash; + if (hash != "#monitor/monitor"){ + clearInterval(intervalId); + } $.ajax({ url: "/api/admin/monitor/", method: "get", @@ -33,6 +37,6 @@ require(["jquery", "chart"], function ($, Chart) { chart.removeData(); }); - setInterval(getMonitorData, 3000); + var intervalId = setInterval(getMonitorData, 3000); }); \ No newline at end of file From 771101ab132d6a62bd27f4b8d0aa71ec506ce127 Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Thu, 20 Aug 2015 20:51:53 +0800 Subject: [PATCH 15/22] =?UTF-8?q?=E4=B8=BB=E9=A1=B5=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E9=A2=98=E7=9B=AE=E7=9A=84=E9=93=BE=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- template/oj/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/template/oj/index.html b/template/oj/index.html index df4299cd..67610b9e 100644 --- a/template/oj/index.html +++ b/template/oj/index.html @@ -90,7 +90,7 @@
      From e4ff9e642a8978dc8434acdb44ff9836086cfc5f Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Fri, 21 Aug 2015 13:25:30 +0800 Subject: [PATCH 16/22] =?UTF-8?q?=E5=B0=86=E9=98=9F=E5=88=97=E9=95=BF?= =?UTF-8?q?=E5=BA=A6=E8=AE=A1=E6=95=B0=E5=99=A8=E6=94=B9=E4=B8=BA=20redis?= =?UTF-8?q?=20=E8=AE=A1=E6=95=B0=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- judge/judger_controller/tasks.py | 5 ++++- monitor/views.py | 6 +++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/judge/judger_controller/tasks.py b/judge/judger_controller/tasks.py index a25972e8..40c032b8 100644 --- a/judge/judger_controller/tasks.py +++ b/judge/judger_controller/tasks.py @@ -10,6 +10,8 @@ from settings import docker_config, source_code_dir, test_case_dir, submission_d @app.task def judge(submission_id, time_limit, memory_limit, test_case_id): + r = redis.Redis(host=redis_config["host"], port=redis_config["port"], db=redis_config["db"]) + r.incr("judge_queue_length") try: command = "%s run -t -i --privileged --rm=true " \ "-v %s:/var/judger/test_case/ " \ @@ -36,4 +38,5 @@ def judge(submission_id, time_limit, memory_limit, test_case_id): cur.execute("update submission set result=%s, info=%s where id=%s", (result["system_error"], str(e), submission_id)) conn.commit() - conn.close() \ No newline at end of file + conn.close() + r.decr("judge_queue_length") \ No newline at end of file diff --git a/monitor/views.py b/monitor/views.py index 21561bf0..15c62b4c 100644 --- a/monitor/views.py +++ b/monitor/views.py @@ -3,13 +3,17 @@ import redis import datetime from rest_framework.views import APIView from judge.judger.result import result +from judge.judger_controller.settings import redis_config from utils.shortcuts import success_response from submission.models import Submission class QueueLengthMonitorAPIView(APIView): def get(self, request): - waiting_number = Submission.objects.filter(result=result["waiting"]).count() + r = redis.Redis(host=redis_config["host"], port=redis_config["port"], db=redis_config["db"]) + waiting_number = r.get("judge_queue_length") + if waiting_number is None: + waiting_number = 0 now = datetime.datetime.now() return success_response({"time": ":".join([str(now.hour), str(now.minute), str(now.second)]), "count": waiting_number}) \ No newline at end of file From 4b49fa5050213cfdd1a109eb07842ba4628b9055 Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Fri, 21 Aug 2015 13:32:02 +0800 Subject: [PATCH 17/22] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=AE=A1=E6=95=B0?= =?UTF-8?q?=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- judge/judger_controller/tasks.py | 3 +-- submission/views.py | 6 ++++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/judge/judger_controller/tasks.py b/judge/judger_controller/tasks.py index 40c032b8..ceb3f4eb 100644 --- a/judge/judger_controller/tasks.py +++ b/judge/judger_controller/tasks.py @@ -10,8 +10,6 @@ from settings import docker_config, source_code_dir, test_case_dir, submission_d @app.task def judge(submission_id, time_limit, memory_limit, test_case_id): - r = redis.Redis(host=redis_config["host"], port=redis_config["port"], db=redis_config["db"]) - r.incr("judge_queue_length") try: command = "%s run -t -i --privileged --rm=true " \ "-v %s:/var/judger/test_case/ " \ @@ -39,4 +37,5 @@ def judge(submission_id, time_limit, memory_limit, test_case_id): (result["system_error"], str(e), submission_id)) conn.commit() conn.close() + r = redis.Redis(host=redis_config["host"], port=redis_config["port"], db=redis_config["db"]) r.decr("judge_queue_length") \ No newline at end of file diff --git a/submission/views.py b/submission/views.py index f8c631bf..1524643c 100644 --- a/submission/views.py +++ b/submission/views.py @@ -1,5 +1,6 @@ # coding=utf-8 import json +import redis from django.shortcuts import render @@ -7,6 +8,7 @@ from rest_framework.views import APIView from judge.judger.result import result from judge.judger_controller.tasks import judge +from judge.judger_controller.settings import redis_config from account.decorators import login_required from account.models import SUPER_ADMIN from problem.models import Problem @@ -41,6 +43,10 @@ class SubmissionAPIView(APIView): except Exception: return error_response(u"提交判题任务失败") + # 增加redis 中判题队列长度的计数器 + r = redis.Redis(host=redis_config["host"], port=redis_config["port"], db=redis_config["db"]) + r.incr("judge_queue_length") + return success_response({"submission_id": submission.id}) else: return serializer_invalid_response(serializer) From 40087541f10fbd550f31ba25dc4fa01f7d6b78f1 Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Fri, 21 Aug 2015 13:59:46 +0800 Subject: [PATCH 18/22] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20=E6=97=A0=E6=B3=95?= =?UTF-8?q?=E6=B8=85=E9=99=A4=E5=9B=BE=E8=A1=A8=E6=95=B0=E6=8D=AE=E7=9A=84?= =?UTF-8?q?=20bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- static/src/js/app/admin/monitor/monitor.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/static/src/js/app/admin/monitor/monitor.js b/static/src/js/app/admin/monitor/monitor.js index 915e574b..0747618d 100644 --- a/static/src/js/app/admin/monitor/monitor.js +++ b/static/src/js/app/admin/monitor/monitor.js @@ -16,6 +16,8 @@ require(["jquery", "chart"], function ($, Chart) { }; var chart = new Chart($("#waiting-queue-chart").get(0).getContext("2d")).Line(data); + var dataCounter = 0; + function getMonitorData(){ var hash = location.hash; if (hash != "#monitor/monitor"){ @@ -28,13 +30,17 @@ require(["jquery", "chart"], function ($, Chart) { success: function(data){ if(!data.code){ chart.addData([data.data["count"]], data.data["time"]) + dataCounter ++; } } }) } $("#clear-chart-data").click(function(){ - chart.removeData(); + for(var i = 0;i < dataCounter;i++) { + chart.removeData(); + dataCounter = 0; + } }); var intervalId = setInterval(getMonitorData, 3000); From bcde6979c6c289382ea5984a1c9eb57f93b82095 Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Fri, 21 Aug 2015 15:28:03 +0800 Subject: [PATCH 19/22] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=A6=96=E9=A1=B5?= =?UTF-8?q?=E6=90=9C=E7=B4=A2=E9=97=AE=E9=A2=98=E7=9A=84=20bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- template/oj/problem/problem_list.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/template/oj/problem/problem_list.html b/template/oj/problem/problem_list.html index 2909e204..d8510122 100644 --- a/template/oj/problem/problem_list.html +++ b/template/oj/problem/problem_list.html @@ -6,10 +6,10 @@
      -
      +
      - - + +
      From ae6566b92f93351921124e3d7a3c467070e0e4a2 Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Fri, 21 Aug 2015 17:58:22 +0800 Subject: [PATCH 20/22] =?UTF-8?q?=E5=AE=8C=E6=88=90=E9=A6=96=E9=A1=B5?= =?UTF-8?q?=E7=9A=84=E5=85=AC=E5=91=8A=E5=88=97=E8=A1=A8=EF=BC=8C=E6=A0=87?= =?UTF-8?q?=E7=AD=BE=E5=88=97=E8=A1=A8=E7=AD=89=E5=8A=9F=E8=83=BD=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problem/views.py | 11 ++++++-- static/src/css/oj.css | 4 +++ submission/models.py | 4 +-- template/oj/problem/problem_list.html | 36 +++++++++++---------------- 4 files changed, 29 insertions(+), 26 deletions(-) diff --git a/problem/views.py b/problem/views.py index 4a6e2c62..26a3a5b7 100644 --- a/problem/views.py +++ b/problem/views.py @@ -6,13 +6,14 @@ import hashlib import json from django.shortcuts import render -from django.db.models import Q +from django.db.models import Q, Count from django.core.paginator import Paginator from rest_framework.views import APIView from django.conf import settings +from announcement.models import Announcement from utils.shortcuts import (serializer_invalid_response, error_response, success_response, paginate, rand_str, error_page) from .serizalizers import (CreateProblemSerializer, EditProblemSerializer, ProblemSerializer, @@ -251,7 +252,13 @@ def problem_list_page(request, page=1): except Exception: pass + # 右侧的公告列表 + announcements = Announcement.objects.filter(is_global=True, visible=True).order_by("-create_time") + # 右侧标签列表 按照关联的题目的数量排序 排除题目数量为0的 + tags = ProblemTag.objects.annotate(problem_number=Count("problem")).filter(problem_number__gt=0).order_by("-problem_number") + return render(request, "oj/problem/problem_list.html", {"problems": current_page, "page": int(page), "previous_page": previous_page, "next_page": next_page, - "keyword": keyword, "tag": tag_text}) + "keyword": keyword, "tag": tag_text, + "announcements": announcements, "tags": tags}) diff --git a/static/src/css/oj.css b/static/src/css/oj.css index cc6ac62d..e6bd8355 100644 --- a/static/src/css/oj.css +++ b/static/src/css/oj.css @@ -67,4 +67,8 @@ li.list-group-item { .panel>.list-group{ padding: 0 0; +} + +.ac-flag{ + color: green; } \ No newline at end of file diff --git a/submission/models.py b/submission/models.py index 3442183d..2cde917f 100644 --- a/submission/models.py +++ b/submission/models.py @@ -6,12 +6,12 @@ from judge.judger.result import result class Submission(models.Model): id = models.CharField(max_length=32, default=rand_str, primary_key=True, db_index=True) - user_id = models.IntegerField() + user_id = models.IntegerField(db_index=True) create_time = models.DateTimeField(auto_now_add=True) result = models.IntegerField(default=result["waiting"]) language = models.IntegerField() code = models.TextField() - problem_id = models.IntegerField() + problem_id = models.IntegerField(db_index=True) # 这个字段可能存储很多数据 比如编译错误、系统错误的时候,存储错误原因字符串 # 正常运行的时候存储 lrun 的判题结果,比如cpu时间内存之类的 info = models.TextField(blank=True, null=True) diff --git a/template/oj/problem/problem_list.html b/template/oj/problem/problem_list.html index d8510122..073cfe7b 100644 --- a/template/oj/problem/problem_list.html +++ b/template/oj/problem/problem_list.html @@ -18,15 +18,17 @@ + - - + + {% for item in problems %} + @@ -59,7 +61,11 @@ 公告 -
      Panel content
      +
      + {% for item in announcements %} + {{ forloop.counter }}.  {{ item.title }} + {% endfor %} +
      @@ -69,26 +75,12 @@
        -
      • - 14 - Cras justo odio -
      • -
      • - 14 - Cras justo odio -
      • -
      • - 14 - Cras justo odio -
      • -
      • - 14 - Cras justo odio -
      • -
      • - 14 - Cras justo odio + {% for item in tags %} +
      • + {{ item.problem_number }} + {{ item.name }}
      • + {% endfor %}
      From d36c2b17b7a488796a90c1eb70277a9643e991a3 Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Fri, 21 Aug 2015 17:59:00 +0800 Subject: [PATCH 21/22] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dsubmission=20=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E5=B1=95=E7=A4=BA=E9=9D=9E=E5=B8=B8=E6=85=A2=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98=EF=BC=8C=E4=B8=8D=E8=A6=81=E5=8E=BB=E7=A2=B0?= =?UTF-8?q?=E9=82=A3=E4=BA=9B=E5=A4=A7=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../migrations/0003_auto_20150821_1654.py | 24 +++++++++++++++++++ submission/views.py | 2 +- 2 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 submission/migrations/0003_auto_20150821_1654.py diff --git a/submission/migrations/0003_auto_20150821_1654.py b/submission/migrations/0003_auto_20150821_1654.py new file mode 100644 index 00000000..22ab59dd --- /dev/null +++ b/submission/migrations/0003_auto_20150821_1654.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('submission', '0002_submission_is_counted'), + ] + + operations = [ + migrations.AlterField( + model_name='submission', + name='problem_id', + field=models.IntegerField(db_index=True), + ), + migrations.AlterField( + model_name='submission', + name='user_id', + field=models.IntegerField(db_index=True), + ), + ] diff --git a/submission/views.py b/submission/views.py index 1524643c..f8248413 100644 --- a/submission/views.py +++ b/submission/views.py @@ -84,7 +84,7 @@ def problem_my_submissions_list_page(request, problem_id): problem = Problem.objects.get(id=problem_id, visible=True) except Problem.DoesNotExist: return error_page(request, u"问题不存在") - submissions = Submission.objects.filter(user_id=request.user.id, problem_id=problem.id).order_by("-create_time") + submissions = Submission.objects.filter(user_id=request.user.id, problem_id=problem.id).values("id", "result", "create_time", "accepted_answer_time", "language") return render(request, "oj/problem/my_submissions_list.html", {"submissions": submissions, "problem": problem}) From 2a55da23ecb106f7ae95ce12cda2d22924077cf7 Mon Sep 17 00:00:00 2001 From: virusdefender <1670873886@qq.com> Date: Fri, 21 Aug 2015 18:01:18 +0800 Subject: [PATCH 22/22] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=88=91=E7=9A=84?= =?UTF-8?q?=E6=8F=90=E4=BA=A4=E5=88=97=E8=A1=A8=E6=8E=92=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- submission/views.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/submission/views.py b/submission/views.py index f8248413..26e8d3a4 100644 --- a/submission/views.py +++ b/submission/views.py @@ -84,7 +84,8 @@ def problem_my_submissions_list_page(request, problem_id): problem = Problem.objects.get(id=problem_id, visible=True) except Problem.DoesNotExist: return error_page(request, u"问题不存在") - submissions = Submission.objects.filter(user_id=request.user.id, problem_id=problem.id).values("id", "result", "create_time", "accepted_answer_time", "language") + submissions = Submission.objects.filter(user_id=request.user.id, problem_id=problem.id).order_by("-create_time").\ + values("id", "result", "create_time", "accepted_answer_time", "language") return render(request, "oj/problem/my_submissions_list.html", {"submissions": submissions, "problem": problem})
      # 题目难度通过率难度通过率
      {{ item.id }} {{ item.title }} {{ item.difficulty }}