mirror of
https://github.com/QingdaoU/OnlineJudge.git
synced 2024-09-21 00:13:18 +00:00
[解决冲突]oj/urls.py
This commit is contained in:
commit
78a135d916
26
announcement/migrations/0002_auto_20150818_1445.py
Normal file
26
announcement/migrations/0002_auto_20150818_1445.py
Normal file
@ -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,
|
||||||
|
),
|
||||||
|
]
|
@ -2,6 +2,7 @@
|
|||||||
from django.db import models
|
from django.db import models
|
||||||
|
|
||||||
from account.models import User
|
from account.models import User
|
||||||
|
from group.models import Group
|
||||||
|
|
||||||
|
|
||||||
class Announcement(models.Model):
|
class Announcement(models.Model):
|
||||||
@ -17,6 +18,9 @@ class Announcement(models.Model):
|
|||||||
last_update_time = models.DateTimeField(auto_now=True)
|
last_update_time = models.DateTimeField(auto_now=True)
|
||||||
# 是否可见 false的话相当于删除
|
# 是否可见 false的话相当于删除
|
||||||
visible = models.BooleanField(default=True)
|
visible = models.BooleanField(default=True)
|
||||||
|
# 公告可见范围 0是全局可见 1是部分小组可见,需要在下面的字段中存储可见的小组
|
||||||
|
is_global = models.BooleanField()
|
||||||
|
groups = models.ManyToManyField(Group)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
db_table = "announcement"
|
db_table = "announcement"
|
||||||
|
@ -8,6 +8,8 @@ from .models import Announcement
|
|||||||
class CreateAnnouncementSerializer(serializers.Serializer):
|
class CreateAnnouncementSerializer(serializers.Serializer):
|
||||||
title = serializers.CharField(max_length=50)
|
title = serializers.CharField(max_length=50)
|
||||||
content = serializers.CharField(max_length=10000)
|
content = serializers.CharField(max_length=10000)
|
||||||
|
is_global = serializers.BooleanField()
|
||||||
|
groups = serializers.ListField(child=serializers.IntegerField(), allow_empty=True)
|
||||||
|
|
||||||
|
|
||||||
class AnnouncementSerializer(serializers.ModelSerializer):
|
class AnnouncementSerializer(serializers.ModelSerializer):
|
||||||
@ -28,3 +30,5 @@ class EditAnnouncementSerializer(serializers.Serializer):
|
|||||||
title = serializers.CharField(max_length=50)
|
title = serializers.CharField(max_length=50)
|
||||||
content = serializers.CharField(max_length=10000)
|
content = serializers.CharField(max_length=10000)
|
||||||
visible = serializers.BooleanField()
|
visible = serializers.BooleanField()
|
||||||
|
is_global = serializers.BooleanField()
|
||||||
|
groups = serializers.ListField(child=serializers.IntegerField())
|
||||||
|
@ -5,6 +5,8 @@ from django.shortcuts import render
|
|||||||
from utils.shortcuts import serializer_invalid_response, error_response, success_response
|
from utils.shortcuts import serializer_invalid_response, error_response, success_response
|
||||||
|
|
||||||
from utils.shortcuts import paginate, error_page
|
from utils.shortcuts import paginate, error_page
|
||||||
|
from account.models import SUPER_ADMIN, ADMIN
|
||||||
|
from group.models import Group
|
||||||
from .models import Announcement
|
from .models import Announcement
|
||||||
from .serializers import (CreateAnnouncementSerializer, AnnouncementSerializer,
|
from .serializers import (CreateAnnouncementSerializer, AnnouncementSerializer,
|
||||||
EditAnnouncementSerializer)
|
EditAnnouncementSerializer)
|
||||||
@ -28,9 +30,26 @@ class AnnouncementAdminAPIView(APIView):
|
|||||||
serializer = CreateAnnouncementSerializer(data=request.data)
|
serializer = CreateAnnouncementSerializer(data=request.data)
|
||||||
if serializer.is_valid():
|
if serializer.is_valid():
|
||||||
data = serializer.data
|
data = serializer.data
|
||||||
Announcement.objects.create(title=data["title"],
|
groups = []
|
||||||
content=data["content"],
|
# 如果不是全局公告,就去查询一下小组的id 列表中的内容,注意用户身份
|
||||||
created_by=request.user)
|
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"], created_by=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"公告发布成功!")
|
return success_response(u"公告发布成功!")
|
||||||
else:
|
else:
|
||||||
return serializer_invalid_response(serializer)
|
return serializer_invalid_response(serializer)
|
||||||
@ -46,26 +65,43 @@ class AnnouncementAdminAPIView(APIView):
|
|||||||
if serializer.is_valid():
|
if serializer.is_valid():
|
||||||
data = serializer.data
|
data = serializer.data
|
||||||
try:
|
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"], created_by=request.user)
|
||||||
except Announcement.DoesNotExist:
|
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"], created_by=request.user)
|
||||||
|
if not groups.count():
|
||||||
|
return error_response(u"至少选择一个小组")
|
||||||
announcement.title = data["title"]
|
announcement.title = data["title"]
|
||||||
announcement.content = data["content"]
|
announcement.content = data["content"]
|
||||||
announcement.visible = data["visible"]
|
announcement.visible = data["visible"]
|
||||||
|
announcement.is_global = data["is_global"]
|
||||||
announcement.save()
|
announcement.save()
|
||||||
|
|
||||||
|
# 重建小组和公告的对应关系
|
||||||
|
announcement.groups.clear()
|
||||||
|
announcement.groups.add(*groups)
|
||||||
return success_response(AnnouncementSerializer(announcement).data)
|
return success_response(AnnouncementSerializer(announcement).data)
|
||||||
else:
|
else:
|
||||||
return serializer_invalid_response(serializer)
|
return serializer_invalid_response(serializer)
|
||||||
|
|
||||||
|
|
||||||
class AnnouncementAPIView(APIView):
|
|
||||||
def get(self, request):
|
def get(self, request):
|
||||||
"""
|
"""
|
||||||
公告分页json api接口
|
公告分页json api接口
|
||||||
---
|
---
|
||||||
response_serializer: AnnouncementSerializer
|
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(created_by=request.user)
|
||||||
visible = request.GET.get("visible", None)
|
visible = request.GET.get("visible", None)
|
||||||
if visible:
|
if visible:
|
||||||
announcement = announcement.filter(visible=(visible == "true"))
|
announcement = announcement.filter(visible=(visible == "true"))
|
||||||
|
@ -1,10 +1,11 @@
|
|||||||
# coding=utf-8
|
# coding=utf-8
|
||||||
# from __future__ import absolute_import
|
import datetime
|
||||||
|
import redis
|
||||||
import MySQLdb
|
import MySQLdb
|
||||||
import subprocess
|
import subprocess
|
||||||
from ..judger.result import result
|
from ..judger.result import result
|
||||||
from ..judger_controller.celery import app
|
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
|
@app.task
|
||||||
@ -36,3 +37,5 @@ def judge(submission_id, time_limit, memory_limit, test_case_id):
|
|||||||
(result["system_error"], str(e), submission_id))
|
(result["system_error"], str(e), submission_id))
|
||||||
conn.commit()
|
conn.commit()
|
||||||
conn.close()
|
conn.close()
|
||||||
|
r = redis.Redis(host=redis_config["host"], port=redis_config["port"], db=redis_config["db"])
|
||||||
|
r.decr("judge_queue_length")
|
0
monitor/__init__.py
Normal file
0
monitor/__init__.py
Normal file
19
monitor/views.py
Normal file
19
monitor/views.py
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
# coding=utf-8
|
||||||
|
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):
|
||||||
|
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})
|
@ -17,7 +17,6 @@ class DBRouter(object):
|
|||||||
|
|
||||||
def allow_migrate(self, db, app_label, model=None, **hints):
|
def allow_migrate(self, db, app_label, model=None, **hints):
|
||||||
if app_label == "submission":
|
if app_label == "submission":
|
||||||
if db == "submission":
|
return db == app_label
|
||||||
return db == app_label
|
|
||||||
else:
|
else:
|
||||||
return db == "default"
|
return db == "default"
|
||||||
|
@ -6,7 +6,7 @@ from django.views.generic import TemplateView
|
|||||||
from account.views import (UserLoginAPIView, UsernameCheckAPIView, UserRegisterAPIView,
|
from account.views import (UserLoginAPIView, UsernameCheckAPIView, UserRegisterAPIView,
|
||||||
UserChangePasswordAPIView, EmailCheckAPIView,
|
UserChangePasswordAPIView, EmailCheckAPIView,
|
||||||
UserAdminAPIView, UserInfoAPIView)
|
UserAdminAPIView, UserInfoAPIView)
|
||||||
from announcement.views import AnnouncementAPIView, AnnouncementAdminAPIView
|
from announcement.views import AnnouncementAdminAPIView
|
||||||
|
|
||||||
from group.views import (GroupAdminAPIView, GroupMemberAdminAPIView,
|
from group.views import (GroupAdminAPIView, GroupMemberAdminAPIView,
|
||||||
JoinGroupAPIView, JoinGroupRequestAdminAPIView)
|
JoinGroupAPIView, JoinGroupRequestAdminAPIView)
|
||||||
@ -15,6 +15,7 @@ from admin.views import AdminTemplateView
|
|||||||
|
|
||||||
from problem.views import TestCaseUploadAPIView, ProblemTagAdminAPIView, ProblemAdminAPIView
|
from problem.views import TestCaseUploadAPIView, ProblemTagAdminAPIView, ProblemAdminAPIView
|
||||||
from submission.views import SubmissionAPIView, SubmissionAdminAPIView
|
from submission.views import SubmissionAPIView, SubmissionAdminAPIView
|
||||||
|
from monitor.views import QueueLengthMonitorAPIView
|
||||||
|
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
@ -38,7 +39,6 @@ urlpatterns = [
|
|||||||
url(r'^problem/(?P<problem_id>\d+)/$', "problem.views.problem_page", name="problem_page"),
|
url(r'^problem/(?P<problem_id>\d+)/$', "problem.views.problem_page", name="problem_page"),
|
||||||
url(r'^announcement/(?P<announcement_id>\d+)/$', "announcement.views.announcement_page",
|
url(r'^announcement/(?P<announcement_id>\d+)/$', "announcement.views.announcement_page",
|
||||||
name="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"),
|
url(r'^admin/contest/$', TemplateView.as_view(template_name="admin/contest/add_contest.html"),
|
||||||
name="add_contest_page"),
|
name="add_contest_page"),
|
||||||
url(r'^problems/$', "problem.views.problem_list_page", name="problem_list_page"),
|
url(r'^problems/$', "problem.views.problem_list_page", name="problem_list_page"),
|
||||||
@ -61,5 +61,6 @@ urlpatterns = [
|
|||||||
url(r'^api/admin/submission/$', SubmissionAdminAPIView.as_view(), name="submission_admin_api_view"),
|
url(r'^api/admin/submission/$', SubmissionAdminAPIView.as_view(), name="submission_admin_api_view"),
|
||||||
url(r'^my_submissions/$', "submission.views.my_submission_list_page", name="my_submission_list_page"),
|
url(r'^my_submissions/$', "submission.views.my_submission_list_page", name="my_submission_list_page"),
|
||||||
url(r'^my_submissions/(?P<page>\d+)/$', "submission.views.my_submission_list_page", name="my_submission_list_page"),
|
url(r'^my_submissions/(?P<page>\d+)/$', "submission.views.my_submission_list_page", name="my_submission_list_page"),
|
||||||
|
url(r'^api/admin/monitor/$', QueueLengthMonitorAPIView.as_view(), name="queue_length_monitor_api"),
|
||||||
|
|
||||||
]
|
]
|
||||||
|
@ -6,13 +6,14 @@ import hashlib
|
|||||||
import json
|
import json
|
||||||
|
|
||||||
from django.shortcuts import render
|
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 django.core.paginator import Paginator
|
||||||
|
|
||||||
from rest_framework.views import APIView
|
from rest_framework.views import APIView
|
||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
|
|
||||||
|
from announcement.models import Announcement
|
||||||
from utils.shortcuts import (serializer_invalid_response, error_response,
|
from utils.shortcuts import (serializer_invalid_response, error_response,
|
||||||
success_response, paginate, rand_str, error_page)
|
success_response, paginate, rand_str, error_page)
|
||||||
from .serizalizers import (CreateProblemSerializer, EditProblemSerializer, ProblemSerializer,
|
from .serizalizers import (CreateProblemSerializer, EditProblemSerializer, ProblemSerializer,
|
||||||
@ -251,7 +252,13 @@ def problem_list_page(request, page=1):
|
|||||||
except Exception:
|
except Exception:
|
||||||
pass
|
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",
|
return render(request, "oj/problem/problem_list.html",
|
||||||
{"problems": current_page, "page": int(page),
|
{"problems": current_page, "page": int(page),
|
||||||
"previous_page": previous_page, "next_page": next_page,
|
"previous_page": previous_page, "next_page": next_page,
|
||||||
"keyword": keyword, "tag": tag_text})
|
"keyword": keyword, "tag": tag_text,
|
||||||
|
"announcements": announcements, "tags": tags})
|
||||||
|
3272
static/src/css/animate/animate.css
vendored
Executable file
3272
static/src/css/animate/animate.css
vendored
Executable file
File diff suppressed because it is too large
Load Diff
208
static/src/css/fullpage/jquery.fullPage.css
Executable file
208
static/src/css/fullpage/jquery.fullPage.css
Executable file
@ -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;
|
||||||
|
}
|
@ -67,4 +67,8 @@ li.list-group-item {
|
|||||||
|
|
||||||
.panel>.list-group{
|
.panel>.list-group{
|
||||||
padding: 0 0;
|
padding: 0 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ac-flag{
|
||||||
|
color: green;
|
||||||
}
|
}
|
BIN
static/src/img/index/a.png
Executable file
BIN
static/src/img/index/a.png
Executable file
Binary file not shown.
After Width: | Height: | Size: 18 KiB |
BIN
static/src/img/index/c.png
Executable file
BIN
static/src/img/index/c.png
Executable file
Binary file not shown.
After Width: | Height: | Size: 18 KiB |
BIN
static/src/img/index/m.png
Executable file
BIN
static/src/img/index/m.png
Executable file
Binary file not shown.
After Width: | Height: | Size: 23 KiB |
@ -21,43 +21,110 @@ define("admin", ["jquery", "avalon"], function ($, avalon) {
|
|||||||
hash = "index/index";
|
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({
|
var vm = avalon.define({
|
||||||
$id: "admin",
|
$id: "admin",
|
||||||
template_url: "template/" + hash + ".html",
|
template_url: "template/" + hash + ".html",
|
||||||
groupId: -1,
|
groupId: -1,
|
||||||
problemId: -1,
|
problemId: -1,
|
||||||
|
adminNavList: [],
|
||||||
hide_loading: function () {
|
hide_loading: function () {
|
||||||
$("#loading-gif").hide();
|
$("#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.groupId = groupId;
|
||||||
vm.template_url = "template/group/group_detail.html";
|
vm.template_url = "template/group/group_detail.html";
|
||||||
});
|
});
|
||||||
|
|
||||||
vm.$watch("showEditProblemPage", function(problemId){
|
vm.$watch("showEditProblemPage", function (problemId) {
|
||||||
vm.problemId = problemId;
|
vm.problemId = problemId;
|
||||||
vm.template_url = "template/problem/edit_problem.html";
|
vm.template_url = "template/problem/edit_problem.html";
|
||||||
});
|
});
|
||||||
|
|
||||||
vm.$watch("showProblemListPage", function(){
|
vm.$watch("showProblemListPage", function () {
|
||||||
vm.template_url = "template/problem/problem_list.html";
|
vm.template_url = "template/problem/problem_list.html";
|
||||||
});
|
});
|
||||||
|
|
||||||
vm.$watch("showGroupListPage", function(){
|
vm.$watch("showGroupListPage", function () {
|
||||||
vm.template_url = "template/group/group.html";
|
vm.template_url = "template/group/group.html";
|
||||||
});
|
});
|
||||||
|
|
||||||
vm.$watch("showProblemSubmissionPage", function(problemId){
|
vm.$watch("showProblemSubmissionPage", function (problemId) {
|
||||||
vm.problemId = problemId;
|
vm.problemId = problemId;
|
||||||
vm.template_url = "template/problem/submission_list.html";
|
vm.template_url = "template/problem/submission_list.html";
|
||||||
});
|
});
|
||||||
|
|
||||||
avalon.scan();
|
avalon.scan();
|
||||||
|
|
||||||
li_active("#li-" + hash.replace("/", "-"));
|
|
||||||
|
|
||||||
window.onhashchange = function () {
|
window.onhashchange = function () {
|
||||||
var hash = window.location.hash.substring(1);
|
var hash = window.location.hash.substring(1);
|
||||||
if (hash) {
|
if (hash) {
|
||||||
@ -66,6 +133,7 @@ define("admin", ["jquery", "avalon"], function ($, avalon) {
|
|||||||
show_template("template/" + hash + ".html");
|
show_template("template/" + hash + ".html");
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
setTimeout(function(){li_active("#li-" + hash.replace("/", "-"));}, 500)
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,8 +1,5 @@
|
|||||||
require(["jquery", "avalon", "csrfToken", "bsAlert", "editor", "validator"],
|
require(["jquery", "avalon", "csrfToken", "bsAlert", "editor", "validator"],
|
||||||
function ($, avalon, csrfTokenHeader, bsAlert, editor) {
|
function ($, avalon, csrfTokenHeader, bsAlert, editor) {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
avalon.ready(function () {
|
avalon.ready(function () {
|
||||||
avalon.vmodels.announcement = null;
|
avalon.vmodels.announcement = null;
|
||||||
|
|
||||||
@ -20,7 +17,11 @@ require(["jquery", "avalon", "csrfToken", "bsAlert", "editor", "validator"],
|
|||||||
totalPage: 1, // 总页数
|
totalPage: 1, // 总页数
|
||||||
showVisibleOnly: false, //仅显示可见公告
|
showVisibleOnly: false, //仅显示可见公告
|
||||||
// 编辑
|
// 编辑
|
||||||
|
newTitle: "",
|
||||||
announcementVisible: 0,
|
announcementVisible: 0,
|
||||||
|
showGlobalViewRadio: true,
|
||||||
|
isGlobal: true,
|
||||||
|
allGroups: [],
|
||||||
getState: function (el) { //获取公告当前状态,显示
|
getState: function (el) { //获取公告当前状态,显示
|
||||||
if (el.visible)
|
if (el.visible)
|
||||||
return "可见";
|
return "可见";
|
||||||
@ -47,49 +48,75 @@ require(["jquery", "avalon", "csrfToken", "bsAlert", "editor", "validator"],
|
|||||||
|
|
||||||
},
|
},
|
||||||
editAnnouncement: function (announcement) {
|
editAnnouncement: function (announcement) {
|
||||||
$("#newTitle").val(announcement.title);
|
vm.newTitle = announcement.title;
|
||||||
editAnnouncementEditor.setValue(announcement.content);
|
editAnnouncementEditor.setValue(announcement.content);
|
||||||
vm.announcementVisible = announcement.visible;
|
vm.announcementVisible = announcement.visible;
|
||||||
if (vm.editingAnnouncementId == announcement.id)
|
if (vm.editingAnnouncementId == announcement.id)
|
||||||
vm.editingAnnouncementId = 0;
|
vm.editingAnnouncementId = 0;
|
||||||
else
|
else
|
||||||
vm.editingAnnouncementId = announcement.id;
|
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();
|
editAnnouncementEditor.focus();
|
||||||
},
|
},
|
||||||
cancelEdit: function () {
|
cancelEdit: function () {
|
||||||
vm.editingAnnouncementId = 0;
|
vm.editingAnnouncementId = 0;
|
||||||
},
|
},
|
||||||
submitChange: function () {
|
submitChange: function () {
|
||||||
var title = $("#newTitle").val();
|
var title = vm.newTitle;
|
||||||
var content = editAnnouncementEditor.getValue();
|
var content = editAnnouncementEditor.getValue();
|
||||||
|
|
||||||
if (content && title) {
|
if (content == "" || title == "") {
|
||||||
$.ajax({
|
bsAlert("标题和内容都不能为空");
|
||||||
beforeSend: csrfTokenHeader,
|
return false;
|
||||||
url: "/api/admin/announcement/",
|
}
|
||||||
dataType: "json",
|
|
||||||
method: "put",
|
var selectedGroups = [];
|
||||||
data: {
|
if (!vm.isGlobal) {
|
||||||
id: vm.editingAnnouncementId,
|
for (var i = 0; i < vm.allGroups.length; i++) {
|
||||||
title: title,
|
if (vm.allGroups[i].isSelected) {
|
||||||
content: content,
|
selectedGroups.push(vm.allGroups[i].id);
|
||||||
visible: vm.announcementVisible
|
|
||||||
},
|
|
||||||
success: function (data) {
|
|
||||||
if (!data.code) {
|
|
||||||
bsAlert("修改成功");
|
|
||||||
vm.editingAnnouncementId = 0;
|
|
||||||
getPageData(1);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
bsAlert(data.data);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
}
|
||||||
}
|
}
|
||||||
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 () {
|
vm.$watch("showVisibleOnly", function () {
|
||||||
@ -98,8 +125,44 @@ require(["jquery", "avalon", "csrfToken", "bsAlert", "editor", "validator"],
|
|||||||
|
|
||||||
getPageData(1);
|
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) {
|
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)
|
if (vm.showVisibleOnly)
|
||||||
url += "&visible=true";
|
url += "&visible=true";
|
||||||
$.ajax({
|
$.ajax({
|
||||||
@ -122,9 +185,7 @@ require(["jquery", "avalon", "csrfToken", "bsAlert", "editor", "validator"],
|
|||||||
}
|
}
|
||||||
|
|
||||||
//新建公告表单验证与数据提交
|
//新建公告表单验证与数据提交
|
||||||
|
$("#announcement-form").validator().on('submit', function (e) {
|
||||||
|
|
||||||
$('form').validator().on('submit', function (e) {
|
|
||||||
if (!e.isDefaultPrevented()) {
|
if (!e.isDefaultPrevented()) {
|
||||||
var title = $("#title").val();
|
var title = $("#title").val();
|
||||||
var content = createAnnouncementEditor.getValue();
|
var content = createAnnouncementEditor.getValue();
|
||||||
@ -132,10 +193,29 @@ require(["jquery", "avalon", "csrfToken", "bsAlert", "editor", "validator"],
|
|||||||
bsAlert("请填写公告内容");
|
bsAlert("请填写公告内容");
|
||||||
return false;
|
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({
|
$.ajax({
|
||||||
beforeSend: csrfTokenHeader,
|
beforeSend: csrfTokenHeader,
|
||||||
url: "/api/admin/announcement/",
|
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",
|
dataType: "json",
|
||||||
method: "post",
|
method: "post",
|
||||||
success: function (data) {
|
success: function (data) {
|
||||||
@ -148,7 +228,7 @@ require(["jquery", "avalon", "csrfToken", "bsAlert", "editor", "validator"],
|
|||||||
bsAlert(data.data);
|
bsAlert(data.data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
});
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
@ -1,80 +1,48 @@
|
|||||||
require(["jquery", "chart"], function ($, Chart) {
|
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 = {
|
var data = {
|
||||||
labels: ["January", "February", "March", "April", "May", "June", "July",
|
labels: ["初始化"],
|
||||||
"January", "February", "March", "April", "January", "February", "March", "April"],
|
|
||||||
datasets: [
|
datasets: [
|
||||||
{
|
{
|
||||||
label: "11111111",
|
label: "队列长度",
|
||||||
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)",
|
fillColor: "rgba(255,255,255,0.2)",
|
||||||
strokeColor: "rgba(151,187,205,1)",
|
strokeColor: "rgba(151,187,205,1)",
|
||||||
pointColor: "rgba(151,187,205,1)",
|
pointColor: "rgba(151,187,205,1)",
|
||||||
pointStrokeColor: "#fff",
|
pointStrokeColor: "#fff",
|
||||||
pointHighlightFill: "#fff",
|
pointHighlightFill: "#fff",
|
||||||
pointHighlightStroke: "rgba(151,187,205,1)",
|
pointHighlightStroke: "rgba(151,187,205,1)",
|
||||||
data: [3, 7, 8, 9, 1, 4, 10, 10, 9, 8, 7, 10, 10, 10, 10]
|
data: [0]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
};
|
};
|
||||||
Chart.defaults.global.responsive = true;
|
var chart = new Chart($("#waiting-queue-chart").get(0).getContext("2d")).Line(data);
|
||||||
new Chart($("#judge-instance-chart").get(0).getContext("2d")).Line(data);
|
|
||||||
|
|
||||||
var data1 = {
|
var dataCounter = 0;
|
||||||
labels: ["January", "February", "March", "April", "May", "June", "July",
|
|
||||||
"January", "February", "March", "April", "January", "February", "March", "April"],
|
function getMonitorData(){
|
||||||
datasets: [
|
var hash = location.hash;
|
||||||
{
|
if (hash != "#monitor/monitor"){
|
||||||
label: "2222222",
|
clearInterval(intervalId);
|
||||||
fillColor: "rgba(255,255,255,0.2)",
|
}
|
||||||
strokeColor: "rgba(151,187,205,1)",
|
$.ajax({
|
||||||
pointColor: "rgba(151,187,205,1)",
|
url: "/api/admin/monitor/",
|
||||||
pointStrokeColor: "#fff",
|
method: "get",
|
||||||
pointHighlightFill: "#fff",
|
dataType: "json",
|
||||||
pointHighlightStroke: "rgba(151,187,205,1)",
|
success: function(data){
|
||||||
data: [3, 7, 8, 9, 1, 4, 10, 10, 9, 8, 7, 10, 10, 10, 10]
|
if(!data.code){
|
||||||
},
|
chart.addData([data.data["count"]], data.data["time"])
|
||||||
{
|
dataCounter ++;
|
||||||
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]
|
|
||||||
}
|
}
|
||||||
]
|
})
|
||||||
};
|
}
|
||||||
Chart.defaults.global.responsive = true;
|
|
||||||
new Chart($("#c1").get(0).getContext("2d")).Line(data1);
|
|
||||||
|
|
||||||
|
$("#clear-chart-data").click(function(){
|
||||||
|
for(var i = 0;i < dataCounter;i++) {
|
||||||
|
chart.removeData();
|
||||||
|
dataCounter = 0;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
var intervalId = setInterval(getMonitorData, 3000);
|
||||||
|
|
||||||
});
|
});
|
@ -11,7 +11,14 @@ require(["jquery", "bsAlert", "csrfToken", "validator"], function ($, bsAlert, c
|
|||||||
method: "post",
|
method: "post",
|
||||||
success: function (data) {
|
success: function (data) {
|
||||||
if (!data.code) {
|
if (!data.code) {
|
||||||
window.location.href = "/";
|
//成功登陆
|
||||||
|
var ref = document.referrer;
|
||||||
|
if(ref){
|
||||||
|
if(ref.split("/")[2] == location.hostname){
|
||||||
|
location.href = ref;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
location.href = "/";
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
bsAlert(data.data);
|
bsAlert(data.data);
|
||||||
|
56
static/src/js/lib/fullpage/jquery.fullPage.min.js
vendored
Executable file
56
static/src/js/lib/fullpage/jquery.fullPage.min.js
vendored
Executable file
@ -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<h?Na(b,e,h):d.verticalCentered&&ia(b)});e.setAutoScrolling(d.autoScrolling,"internal");var a=c(".fp-section.active").find(".fp-slide.active");a.length&&(0!==c(".fp-section.active").index(".fp-section")||0===c(".fp-section.active").index(".fp-section")&&0!==a.index())&&U(a);d.fixedElements&&d.css3&&c(d.fixedElements).appendTo(q);
|
||||||
|
d.navigation&&Oa();d.scrollOverflow?("complete"===l.readyState&&ja(),n.on("load",ja)):ka();la();if(!d.animateAnchor&&(a=m.location.hash.replace("#","").split("/")[0],a.length)){var b=c('[data-anchor="'+a+'"]');b.length&&(d.autoScrolling?x(b.position().top):(x(0),t.scrollTop(b.position().top)),I(a,null),c.isFunction(d.afterLoad)&&d.afterLoad.call(b,a,b.index(".fp-section")+1),b.addClass("active").siblings().removeClass("active"))}ma();n.on("load",function(){var a=m.location.hash.replace("#","").split("/"),
|
||||||
|
b=a[0],a=a[1];b&&V(b,a)})}function Na(a,b,g){var f=100*g,e=100/g;b.wrapAll('<div class="fp-slidesContainer" />');b.parent().wrap('<div class="fp-slides" />');a.find(".fp-slidesContainer").css("width",f+"%");1<g&&(d.controlArrows&&Pa(a),d.slidesNavigation&&Qa(a,g));b.each(function(a){c(this).css("width",e+"%");d.verticalCentered&&ia(c(this))});a=a.find(".fp-slide.active");a.length?U(a):b.eq(0).addClass("active")}function Ma(){c(d.sectionSelector).each(function(){c(this).addClass("fp-section")});c(d.slideSelector).each(function(){c(this).addClass("fp-slide")})}
|
||||||
|
function Pa(a){a.find(".fp-slides").after('<div class="fp-controlArrow fp-prev"></div><div class="fp-controlArrow fp-next"></div>');"#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('<div id="fp-nav"><ul></ul></div>');
|
||||||
|
var a=c("#fp-nav");a.addClass(function(){return d.showActiveTooltip?"fp-show-active "+d.navigationPosition:d.navigationPosition});for(var b=0;b<c(".fp-section").length;b++){var g="";d.anchors.length&&(g=d.anchors[b]);var g='<li><a href="#'+g+'"><span></span></a>',f=d.navigationTooltips[b];"undefined"!==typeof f&&""!==f&&(g+='<div class="fp-tooltip '+d.navigationPosition+'">'+f+"</div>");g+="</li>";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<e.length;++h){var k=p.abs(b-e[h].offsetTop);k<f&&(g=h,f=k)}a=c(e).eq(g)}if(!d.autoScrolling||d.scrollBar){if(!a.hasClass("active")){W=!0;b=c(".fp-section.active");g=b.index(".fp-section")+1;f=X(a);e=a.data("anchor");h=a.index(".fp-section")+1;k=a.find(".fp-slide.active");if(k.length)var m=k.data("anchor"),q=k.index();y&&(a.addClass("active").siblings().removeClass("active"),c.isFunction(d.onLeave)&&
|
||||||
|
d.onLeave.call(b,g,h,f),c.isFunction(d.afterLoad)&&d.afterLoad.call(a,e,h),K(a),I(e,h-1),d.anchors.length&&(A=e,Y(q,m,e,h)));clearTimeout(Z);Z=setTimeout(function(){W=!1},100)}d.fitToSection&&(clearTimeout(aa),aa=setTimeout(function(){y&&(c(".fp-section.active").is(a)&&(v=!0),B(a),v=!1)},d.fitToSectionDelay))}}function pa(a){return a.find(".fp-slides").length?a.find(".fp-slide.active").find(".fp-scrollable"):a.find(".fp-scrollable")}function L(a,b){if(k.m[a]){var d,c;"down"==a?(d="bottom",c=e.moveSectionDown):
|
||||||
|
(d="top",c=e.moveSectionUp);if(0<b.length)if(d="top"===d?!b.scrollTop():"bottom"===d?b.scrollTop()+1+b.innerHeight()>=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<d.normalScrollElementTouchThreshold&&g.is(d.normalScrollElements)?!0:b==d.normalScrollElementTouchThreshold?!1:qa(g,++b)}function ba(a){return"undefined"===typeof a.pointerType||"mouse"!=a.pointerType}function Sa(a){a=a.originalEvent;d.fitToSection&&t.stop();ba(a)&&(a=ra(a),E=a.y,N=a.x)}function sa(a,b){for(var d=0,c=a.slice(p.max(a.length-b,1)),e=0;e<c.length;e++)d+=
|
||||||
|
c[e];return p.ceil(d/b)}function u(a){var b=(new Date).getTime();if(d.autoScrolling&&!O){a=a||m.event;var g=a.wheelDelta||-a.deltaY||-a.detail,f=p.max(-1,p.min(1,g));149<C.length&&C.shift();C.push(p.abs(g));d.scrollBar&&(a.preventDefault?a.preventDefault():a.returnValue=!1);a=c(".fp-section.active");a=pa(a);g=b-ta;ta=b;200<g&&(C=[]);y&&(b=sa(C,10),g=sa(C,70),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.pageY<P?e.moveSectionUp():a.pageY>P&&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"),0<d.scrollingSpeed).css(Aa(g)),fa=setTimeout(function(){u()},d.scrollingSpeed,d.easing)):a.animate({scrollLeft:p.round(g.left)},d.scrollingSpeed,d.easing,function(){u()});l.find(".active").removeClass("active");l.find("li").eq(f).find("a").addClass("active")}function Ba(){la();if(Q){var a=c(l.activeElement);a.is("textarea")||
|
||||||
|
a.is("input")||a.is("select")||(a=n.height(),p.abs(a-ga)>20*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);b&&(h.hasClass("fp-responsive")||e.setResponsive(n.height()<b))}function za(a){var b="all "+d.scrollingSpeed+"ms "+d.easingcss3;a.removeClass("fp-notransition");return a.css({"-webkit-transition":b,transition:b})}function Xa(a,b){if(825>
|
||||||
|
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('<div class="fp-scrollable" />'):a.wrapInner('<div class="fp-scrollable" />'),
|
||||||
|
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('<div class="fp-tableCell" style="height:'+Da(a)+'px;" />')}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('<div class="fp-slidesNav"><ul></ul></div>');var c=a.find(".fp-slidesNav");c.addClass(d.slidesNavPosition);for(var f=0;f<b;f++)c.find("ul").append('<li><a href="#"><span></span></a></li>');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.length&&"none"!==b}function Ya(){if(Q||R){var a=Ha();c(".fullpage-wrapper").off("touchstart "+a.down).on("touchstart "+a.down,Sa);c(".fullpage-wrapper").off("touchmove "+a.move).on("touchmove "+a.move,Ra)}}function Za(){if(Q||R){var a=Ha();c(".fullpage-wrapper").off("touchstart "+a.down);c(".fullpage-wrapper").off("touchmove "+a.move)}}function Ha(){return m.PointerEvent?{down:"pointerdown",move:"pointermove"}:{down:"MSPointerDown",move:"MSPointerMove"}}function ra(a){var b=
|
||||||
|
[];b.y="undefined"!==typeof a.pageY&&(a.pageY||a.pageX)?a.pageY:a.touches[0].pageY;b.x="undefined"!==typeof a.pageX&&(a.pageY||a.pageX)?a.pageX:a.touches[0].pageX;R&&ba(a)&&d.scrollBar&&(b.y=a.touches[0].pageY,b.x=a.touches[0].pageX);return b}function U(a,b){e.setScrollingSpeed(0,"internal");"undefined"!==typeof b&&(v=!0);F(a.closest(".fp-slides"),a);"undefined"!==typeof b&&(v=!1);e.setScrollingSpeed(G.scrollingSpeed,"internal")}function x(a){d.scrollBar?h.scrollTop(a):d.css3?wa("translate3d(0px, -"+
|
||||||
|
a+"px, 0px)",!1):h.css("top",-a)}function Aa(a){return{"-webkit-transform":a,"-moz-transform":a,"-ms-transform":a,transform:a}}function Ia(a,b,c){switch(b){case "up":k[c].up=a;break;case "down":k[c].down=a;break;case "left":k[c].left=a;break;case "right":k[c].right=a;break;case "all":"m"==c?e.setAllowScrolling(a):e.setKeyboardScrolling(a)}}function $a(){x(0);c("#fp-nav, .fp-slidesNav, .fp-controlArrow").remove();c(".fp-section").css({height:"","background-color":"",padding:""});c(".fp-slide").css({width:""});
|
||||||
|
h.css({height:"",position:"","-ms-touch-action":"","touch-action":""});t.css({overflow:"",height:""});c("html").removeClass("fp-enabled");c.each(q.get(0).className.split(/\s+/),function(a,b){0===b.indexOf("fp-viewing")&&q.removeClass(b)});c(".fp-section, .fp-slide").each(function(){Ca(c(this));c(this).removeClass("fp-table active")});h.addClass("fp-notransition");h.find(".fp-tableCell, .fp-slidesContainer, .fp-slides").each(function(){c(this).replaceWith(this.childNodes)});t.scrollTop(0)}function S(a,
|
||||||
|
b,c){d[a]=b;"internal"!==c&&(G[a]=b)}function T(a,b){console&&console[a]&&console[a]("fullPage: "+b)}var t=c("html, body"),q=c("body"),e=c.fn.fullpage;d=c.extend({menu:!1,anchors:[],lockAnchors:!1,navigation:!1,navigationPosition:"right",navigationTooltips:[],showActiveTooltip:!1,slidesNavigation:!1,slidesNavPosition:"bottom",scrollBar:!1,css3:!0,scrollingSpeed:700,autoScrolling:!0,fitToSection:!0,fitToSectionDelay:1E3,easing:"easeInOutCubic",easingcss3:"ease",loopBottom:!1,loopTop:!1,loopHorizontal:!0,
|
||||||
|
continuousVertical:!1,normalScrollElements:null,scrollOverflow:!1,touchSensitivity:5,normalScrollElementTouchThreshold:5,keyboardScrolling:!0,animateAnchor:!0,recordHistory:!0,controlArrows:!0,controlArrowColor:"#fff",verticalCentered:!0,resize:!1,sectionsColor:[],paddingTop:0,paddingBottom:0,fixedElements:null,responsive:0,responsiveWidth:0,responsiveHeight:0,sectionSelector:".section",slideSelector:".slide",afterLoad:null,onLeave:null,afterRender:null,afterResize:null,afterReBuild:null,afterSlideLoad:null,
|
||||||
|
onSlideLeave:null},d);(function(){d.continuousVertical&&(d.loopTop||d.loopBottom)&&(d.continuousVertical=!1,T("warn","Option `loopTop/loopBottom` is mutually exclusive with `continuousVertical`; `continuousVertical` disabled"));d.scrollBar&&d.scrollOverflow&&T("warn","Option `scrollBar` is mutually exclusive with `scrollOverflow`. Sections with scrollOverflow might not work well in Firefox");d.continuousVertical&&d.scrollBar&&(d.continuousVertical=!1,T("warn","Option `scrollBar` is mutually exclusive with `continuousVertical`; `continuousVertical` disabled"));
|
||||||
|
c.each(d.anchors,function(a,b){(c("#"+b).length||c('[name="'+b+'"]').length)&&T("error","data-anchor tags can not have the same value as any `id` element on the site (or `name` element for IE).")})})();c.extend(c.easing,{easeInOutCubic:function(a,b,c,d,e){return 1>(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<c.length&&B(c)};e.moveSlideRight=function(){ua("next")};
|
||||||
|
e.moveSlideLeft=function(){ua("prev")};e.reBuild=function(a){if(!h.hasClass("fp-destroyed")){v=!0;var b=n.width();r=n.height();d.resize&&Xa(r,b);c(".fp-section").each(function(){var a=c(this).find(".fp-slides"),b=c(this).find(".fp-slide");d.verticalCentered&&c(this).find(".fp-tableCell").css("height",Da(c(this))+"px");c(this).css("height",r+"px");d.scrollOverflow&&(b.length?b.each(function(){J(c(this))}):J(c(this)));1<b.length&&F(a,a.find(".fp-slide.active"))});(b=c(".fp-section.active").index(".fp-section"))&&
|
||||||
|
e.silentMoveTo(b+1);v=!1;c.isFunction(d.afterResize)&&a&&d.afterResize.call(h);c.isFunction(d.afterReBuild)&&!a&&d.afterReBuild.call(h)}};e.setResponsive=function(a){var b=h.hasClass("fp-responsive");a?b||(e.setAutoScrolling(!1,"internal"),e.setFitToSection(!1,"internal"),c("#fp-nav").hide(),h.addClass("fp-responsive")):b&&(e.setAutoScrolling(G.autoScrolling,"internal"),e.setFitToSection(G.autoScrolling,"internal"),c("#fp-nav").show(),h.removeClass("fp-responsive"))};var z=!1,Q=navigator.userAgent.match(/(iPhone|iPod|iPad|Android|playbook|silk|BlackBerry|BB10|Windows Phone|Tizen|Bada|webOS|IEMobile|Opera Mini)/),
|
||||||
|
R="ontouchstart"in m||0<navigator.msMaxTouchPoints||navigator.maxTouchPoints,h=c(this),r=n.height(),v=!1,A,ea,y=!0,C=[],O,k={m:{up:!0,down:!0,left:!0,right:!0}};k.k=c.extend(!0,{},k.m);var G=c.extend(!0,{},d),ha,ca,fa,Z,aa,Ja;c(this).length&&Ka();var W=!1;n.on("scroll",oa);var E=0,N=0,D=0,M=0,ta=(new Date).getTime();m.requestAnimFrame=function(){return m.requestAnimationFrame||function(a){a()}}();n.on("hashchange",xa);w.keydown(function(a){clearTimeout(Ja);var b=c(":focus");b.is("textarea")||b.is("input")||
|
||||||
|
b.is("select")||!d.keyboardScrolling||!d.autoScrolling||(-1<c.inArray(a.which,[40,38,32,33,34])&&a.preventDefault(),Ja=setTimeout(function(){var b=a.shiftKey;O=a.ctrlKey;switch(a.which){case 38:case 33:k.k.up&&e.moveSectionUp();break;case 32:if(b&&k.k.up){e.moveSectionUp();break}case 40:case 34:k.k.down&&e.moveSectionDown();break;case 36:k.k.up&&e.moveTo(1);break;case 35:k.k.down&&e.moveTo(c(".fp-section").length);break;case 37:k.k.left&&e.moveSlideLeft();break;case 39:k.k.right&&e.moveSlideRight()}},
|
||||||
|
150))});w.keyup(function(a){O=a.ctrlKey});c(m).blur(function(){O=!1});h.mousedown(function(a){2==a.which&&(P=a.pageY,h.on("mousemove",Wa))});h.mouseup(function(a){2==a.which&&h.off("mousemove")});var P=0;w.on("click touchstart","#fp-nav a",function(a){a.preventDefault();a=c(this).parent().index();B(c(".fp-section").eq(a))});w.on("click touchstart",".fp-slidesNav a",function(a){a.preventDefault();a=c(this).closest(".fp-section").find(".fp-slides");var b=a.find(".fp-slide").eq(c(this).closest("li").index());
|
||||||
|
F(a,b)});d.normalScrollElements&&(w.on("mouseenter",d.normalScrollElements,function(){e.setMouseWheelScrolling(!1)}),w.on("mouseleave",d.normalScrollElements,function(){e.setMouseWheelScrolling(!0)}));c(".fp-section").on("click touchstart",".fp-controlArrow",function(){c(this).hasClass("fp-prev")?k.m.left&&e.moveSlideLeft():k.m.right&&e.moveSlideRight()});n.resize(Ba);var ga=r;e.destroy=function(a){e.setAutoScrolling(!1,"internal");e.setAllowScrolling(!1);e.setKeyboardScrolling(!1);h.addClass("fp-destroyed");
|
||||||
|
clearTimeout(fa);clearTimeout(ca);clearTimeout(ha);clearTimeout(Z);clearTimeout(aa);n.off("scroll",oa).off("hashchange",xa).off("resize",Ba);w.off("click","#fp-nav a").off("mouseenter","#fp-nav li").off("mouseleave","#fp-nav li").off("click",".fp-slidesNav a").off("mouseover",d.normalScrollElements).off("mouseout",d.normalScrollElements);c(".fp-section").off("click",".fp-controlArrow");clearTimeout(fa);clearTimeout(ca);a&&$a()}}});
|
19
submission/migrations/0002_submission_is_counted.py
Normal file
19
submission/migrations/0002_submission_is_counted.py
Normal file
@ -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),
|
||||||
|
),
|
||||||
|
]
|
24
submission/migrations/0003_auto_20150821_1654.py
Normal file
24
submission/migrations/0003_auto_20150821_1654.py
Normal file
@ -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),
|
||||||
|
),
|
||||||
|
]
|
@ -6,18 +6,19 @@ from judge.judger.result import result
|
|||||||
|
|
||||||
class Submission(models.Model):
|
class Submission(models.Model):
|
||||||
id = models.CharField(max_length=32, default=rand_str, primary_key=True, db_index=True)
|
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)
|
create_time = models.DateTimeField(auto_now_add=True)
|
||||||
result = models.IntegerField(default=result["waiting"])
|
result = models.IntegerField(default=result["waiting"])
|
||||||
language = models.IntegerField()
|
language = models.IntegerField()
|
||||||
code = models.TextField()
|
code = models.TextField()
|
||||||
problem_id = models.IntegerField()
|
problem_id = models.IntegerField(db_index=True)
|
||||||
# 这个字段可能存储很多数据 比如编译错误、系统错误的时候,存储错误原因字符串
|
# 这个字段可能存储很多数据 比如编译错误、系统错误的时候,存储错误原因字符串
|
||||||
# 正常运行的时候存储 lrun 的判题结果,比如cpu时间内存之类的
|
# 正常运行的时候存储 lrun 的判题结果,比如cpu时间内存之类的
|
||||||
info = models.TextField(blank=True, null=True)
|
info = models.TextField(blank=True, null=True)
|
||||||
accepted_answer_time = models.IntegerField(blank=True, null=True)
|
accepted_answer_time = models.IntegerField(blank=True, null=True)
|
||||||
# 这个字段只有在题目是accepted 的时候才会用到,比赛题目的提交可能还会有得分等信息,存储在这里面
|
# 这个字段只有在题目是accepted 的时候才会用到,比赛题目的提交可能还会有得分等信息,存储在这里面
|
||||||
accepted_answer_info = models.TextField(blank=True, null=True)
|
accepted_answer_info = models.TextField(blank=True, null=True)
|
||||||
|
is_counted = models.BooleanField(default=False)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
db_table = "submission"
|
db_table = "submission"
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
# coding=utf-8
|
# coding=utf-8
|
||||||
import json
|
import json
|
||||||
|
import redis
|
||||||
|
|
||||||
from django.shortcuts import render
|
from django.shortcuts import render
|
||||||
|
|
||||||
@ -7,6 +8,7 @@ from rest_framework.views import APIView
|
|||||||
|
|
||||||
from judge.judger.result import result
|
from judge.judger.result import result
|
||||||
from judge.judger_controller.tasks import judge
|
from judge.judger_controller.tasks import judge
|
||||||
|
from judge.judger_controller.settings import redis_config
|
||||||
from account.decorators import login_required
|
from account.decorators import login_required
|
||||||
from account.models import SUPER_ADMIN
|
from account.models import SUPER_ADMIN
|
||||||
from problem.models import Problem
|
from problem.models import Problem
|
||||||
@ -29,6 +31,9 @@ class SubmissionAPIView(APIView):
|
|||||||
data = serializer.data
|
data = serializer.data
|
||||||
try:
|
try:
|
||||||
problem = Problem.objects.get(id=data["problem_id"])
|
problem = Problem.objects.get(id=data["problem_id"])
|
||||||
|
# 更新问题的总提交计数
|
||||||
|
problem.total_submit_number += 1
|
||||||
|
problem.save()
|
||||||
except Problem.DoesNotExist:
|
except Problem.DoesNotExist:
|
||||||
return error_response(u"题目不存在")
|
return error_response(u"题目不存在")
|
||||||
submission = Submission.objects.create(user_id=request.user.id, language=int(data["language"]),
|
submission = Submission.objects.create(user_id=request.user.id, language=int(data["language"]),
|
||||||
@ -39,6 +44,10 @@ class SubmissionAPIView(APIView):
|
|||||||
except Exception:
|
except Exception:
|
||||||
return error_response(u"提交判题任务失败")
|
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})
|
return success_response({"submission_id": submission.id})
|
||||||
else:
|
else:
|
||||||
return serializer_invalid_response(serializer)
|
return serializer_invalid_response(serializer)
|
||||||
@ -52,6 +61,18 @@ class SubmissionAPIView(APIView):
|
|||||||
submission = Submission.objects.get(id=submission_id, user_id=request.user.id)
|
submission = Submission.objects.get(id=submission_id, user_id=request.user.id)
|
||||||
except Submission.DoesNotExist:
|
except Submission.DoesNotExist:
|
||||||
return error_response(u"提交不存在")
|
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}
|
response_data = {"result": submission.result}
|
||||||
if submission.result == 0:
|
if submission.result == 0:
|
||||||
response_data["accepted_answer_time"] = submission.accepted_answer_time
|
response_data["accepted_answer_time"] = submission.accepted_answer_time
|
||||||
@ -64,7 +85,8 @@ def problem_my_submissions_list_page(request, problem_id):
|
|||||||
problem = Problem.objects.get(id=problem_id, visible=True)
|
problem = Problem.objects.get(id=problem_id, visible=True)
|
||||||
except Problem.DoesNotExist:
|
except Problem.DoesNotExist:
|
||||||
return error_page(request, u"问题不存在")
|
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).order_by("-create_time").\
|
||||||
|
values("id", "result", "create_time", "accepted_answer_time", "language")
|
||||||
return render(request, "oj/problem/my_submissions_list.html",
|
return render(request, "oj/problem/my_submissions_list.html",
|
||||||
{"submissions": submissions, "problem": problem})
|
{"submissions": submissions, "problem": problem})
|
||||||
|
|
||||||
|
151
template/404.html
Normal file
151
template/404.html
Normal file
@ -0,0 +1,151 @@
|
|||||||
|
{% extends "oj_base.html" %}
|
||||||
|
{% block css_block %}
|
||||||
|
<style>
|
||||||
|
pre {
|
||||||
|
position: relative;
|
||||||
|
padding: 10px;
|
||||||
|
border: none;
|
||||||
|
overflow: auto;
|
||||||
|
line-height: 1.3;
|
||||||
|
max-height: 500px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.hljs {
|
||||||
|
display: block;
|
||||||
|
padding: 0.5em;
|
||||||
|
background: #fdf6e3;
|
||||||
|
color: #657b83;
|
||||||
|
}
|
||||||
|
|
||||||
|
.hljs-comment,
|
||||||
|
.hljs-template_comment,
|
||||||
|
.diff .hljs-header,
|
||||||
|
.hljs-doctype,
|
||||||
|
.hljs-pi,
|
||||||
|
.lisp .hljs-string,
|
||||||
|
.hljs-javadoc {
|
||||||
|
color: #93a1a1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Solarized Green */
|
||||||
|
.hljs-keyword,
|
||||||
|
.hljs-winutils,
|
||||||
|
.method,
|
||||||
|
.hljs-addition,
|
||||||
|
.css .hljs-tag,
|
||||||
|
.hljs-request,
|
||||||
|
.hljs-status,
|
||||||
|
.nginx .hljs-title {
|
||||||
|
color: #859900;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Solarized Cyan */
|
||||||
|
.hljs-number,
|
||||||
|
.hljs-command,
|
||||||
|
.hljs-string,
|
||||||
|
.hljs-tag .hljs-value,
|
||||||
|
.hljs-rules .hljs-value,
|
||||||
|
.hljs-phpdoc,
|
||||||
|
.tex .hljs-formula,
|
||||||
|
.hljs-regexp,
|
||||||
|
.hljs-hexcolor,
|
||||||
|
.hljs-link_url {
|
||||||
|
color: #2aa198;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Solarized Blue */
|
||||||
|
.hljs-title,
|
||||||
|
.hljs-localvars,
|
||||||
|
.hljs-chunk,
|
||||||
|
.hljs-decorator,
|
||||||
|
.hljs-built_in,
|
||||||
|
.hljs-identifier,
|
||||||
|
.vhdl .hljs-literal,
|
||||||
|
.hljs-id,
|
||||||
|
.css .hljs-function {
|
||||||
|
color: #268bd2;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Solarized Yellow */
|
||||||
|
.hljs-attribute,
|
||||||
|
.hljs-variable,
|
||||||
|
.lisp .hljs-body,
|
||||||
|
.smalltalk .hljs-number,
|
||||||
|
.hljs-constant,
|
||||||
|
.hljs-class .hljs-title,
|
||||||
|
.hljs-parent,
|
||||||
|
.haskell .hljs-type,
|
||||||
|
.hljs-link_reference {
|
||||||
|
color: #b58900;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Solarized Orange */
|
||||||
|
.hljs-preprocessor,
|
||||||
|
.hljs-preprocessor .hljs-keyword,
|
||||||
|
.hljs-pragma,
|
||||||
|
.hljs-shebang,
|
||||||
|
.hljs-symbol,
|
||||||
|
.hljs-symbol .hljs-string,
|
||||||
|
.diff .hljs-change,
|
||||||
|
.hljs-special,
|
||||||
|
.hljs-attr_selector,
|
||||||
|
.hljs-subst,
|
||||||
|
.hljs-cdata,
|
||||||
|
.clojure .hljs-title,
|
||||||
|
.css .hljs-pseudo,
|
||||||
|
.hljs-header {
|
||||||
|
color: #cb4b16;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Solarized Red */
|
||||||
|
.hljs-deletion,
|
||||||
|
.hljs-important {
|
||||||
|
color: #dc322f;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Solarized Violet */
|
||||||
|
.hljs-link_label {
|
||||||
|
color: #6c71c4;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tex .hljs-formula {
|
||||||
|
background: #eee8d5;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
{% endblock %}
|
||||||
|
{% block body %}
|
||||||
|
<div class="container">
|
||||||
|
<h2>404 - Page Not Found</h2>
|
||||||
|
<hr>
|
||||||
|
<div class="article fmt">
|
||||||
|
|
||||||
|
<pre><code class="cpp"><span class="hljs-comment">// C</span>
|
||||||
|
<span class="hljs-preprocessor">#<span class="hljs-keyword">include</span> <stdio.h></span>
|
||||||
|
<span class="hljs-function"><span class="hljs-keyword">int</span> <span class="hljs-title">main</span><span class="hljs-params">()</span>
|
||||||
|
</span>{
|
||||||
|
<span class="hljs-built_in">printf</span>(<span class="hljs-string">"404 - Page Not Found"</span>);
|
||||||
|
<span class="hljs-keyword">return</span> <span class="hljs-number">0</span>;
|
||||||
|
}</code></pre>
|
||||||
|
<pre><code class="cpp"><span class="hljs-comment">// C++</span>
|
||||||
|
<span class="hljs-preprocessor">#<span class="hljs-keyword">include</span> <iostream></span>
|
||||||
|
<span class="hljs-function"><span class="hljs-keyword">int</span> <span class="hljs-title">main</span><span class="hljs-params">()</span>
|
||||||
|
</span>{
|
||||||
|
std::<span class="hljs-built_in">cout</span> << <span class="hljs-string">"404 - Page Not Found"</span> << std::endl;
|
||||||
|
<span class="hljs-keyword">return</span> <span class="hljs-number">0</span>;
|
||||||
|
}</code></pre>
|
||||||
|
<pre><code class="java"><span class="hljs-comment">// Java</span>
|
||||||
|
<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Main</span>
|
||||||
|
</span>{
|
||||||
|
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span><span class="hljs-params">(String[] args)</span>
|
||||||
|
</span>{
|
||||||
|
System.out.println(<span class="hljs-string">"404 - Page Not Found"</span>);
|
||||||
|
}
|
||||||
|
}</code></pre>
|
||||||
|
<pre><code class="js"><span class="hljs-comment">// JavaScript</span>
|
||||||
|
<span class="hljs-built_in">console</span>.log(<span class="hljs-string">"404 - Page Not Found"</span>)</code></pre>
|
||||||
|
<pre><code class="python"><span class="hljs-comment">// Python</span>
|
||||||
|
<span class="hljs-keyword">print</span> <span class="hljs-string">"404 - Page Not Found"</span></code></pre>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
151
template/500.html
Normal file
151
template/500.html
Normal file
@ -0,0 +1,151 @@
|
|||||||
|
{% extends "oj_base.html" %}
|
||||||
|
{% block css_block %}
|
||||||
|
<style>
|
||||||
|
pre {
|
||||||
|
position: relative;
|
||||||
|
padding: 10px;
|
||||||
|
border: none;
|
||||||
|
overflow: auto;
|
||||||
|
line-height: 1.3;
|
||||||
|
max-height: 500px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.hljs {
|
||||||
|
display: block;
|
||||||
|
padding: 0.5em;
|
||||||
|
background: #fdf6e3;
|
||||||
|
color: #657b83;
|
||||||
|
}
|
||||||
|
|
||||||
|
.hljs-comment,
|
||||||
|
.hljs-template_comment,
|
||||||
|
.diff .hljs-header,
|
||||||
|
.hljs-doctype,
|
||||||
|
.hljs-pi,
|
||||||
|
.lisp .hljs-string,
|
||||||
|
.hljs-javadoc {
|
||||||
|
color: #93a1a1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Solarized Green */
|
||||||
|
.hljs-keyword,
|
||||||
|
.hljs-winutils,
|
||||||
|
.method,
|
||||||
|
.hljs-addition,
|
||||||
|
.css .hljs-tag,
|
||||||
|
.hljs-request,
|
||||||
|
.hljs-status,
|
||||||
|
.nginx .hljs-title {
|
||||||
|
color: #859900;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Solarized Cyan */
|
||||||
|
.hljs-number,
|
||||||
|
.hljs-command,
|
||||||
|
.hljs-string,
|
||||||
|
.hljs-tag .hljs-value,
|
||||||
|
.hljs-rules .hljs-value,
|
||||||
|
.hljs-phpdoc,
|
||||||
|
.tex .hljs-formula,
|
||||||
|
.hljs-regexp,
|
||||||
|
.hljs-hexcolor,
|
||||||
|
.hljs-link_url {
|
||||||
|
color: #2aa198;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Solarized Blue */
|
||||||
|
.hljs-title,
|
||||||
|
.hljs-localvars,
|
||||||
|
.hljs-chunk,
|
||||||
|
.hljs-decorator,
|
||||||
|
.hljs-built_in,
|
||||||
|
.hljs-identifier,
|
||||||
|
.vhdl .hljs-literal,
|
||||||
|
.hljs-id,
|
||||||
|
.css .hljs-function {
|
||||||
|
color: #268bd2;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Solarized Yellow */
|
||||||
|
.hljs-attribute,
|
||||||
|
.hljs-variable,
|
||||||
|
.lisp .hljs-body,
|
||||||
|
.smalltalk .hljs-number,
|
||||||
|
.hljs-constant,
|
||||||
|
.hljs-class .hljs-title,
|
||||||
|
.hljs-parent,
|
||||||
|
.haskell .hljs-type,
|
||||||
|
.hljs-link_reference {
|
||||||
|
color: #b58900;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Solarized Orange */
|
||||||
|
.hljs-preprocessor,
|
||||||
|
.hljs-preprocessor .hljs-keyword,
|
||||||
|
.hljs-pragma,
|
||||||
|
.hljs-shebang,
|
||||||
|
.hljs-symbol,
|
||||||
|
.hljs-symbol .hljs-string,
|
||||||
|
.diff .hljs-change,
|
||||||
|
.hljs-special,
|
||||||
|
.hljs-attr_selector,
|
||||||
|
.hljs-subst,
|
||||||
|
.hljs-cdata,
|
||||||
|
.clojure .hljs-title,
|
||||||
|
.css .hljs-pseudo,
|
||||||
|
.hljs-header {
|
||||||
|
color: #cb4b16;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Solarized Red */
|
||||||
|
.hljs-deletion,
|
||||||
|
.hljs-important {
|
||||||
|
color: #dc322f;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Solarized Violet */
|
||||||
|
.hljs-link_label {
|
||||||
|
color: #6c71c4;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tex .hljs-formula {
|
||||||
|
background: #eee8d5;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
{% endblock %}
|
||||||
|
{% block body %}
|
||||||
|
<div class="container">
|
||||||
|
<h2>500 - Server Error</h2>
|
||||||
|
<hr>
|
||||||
|
<div class="article fmt">
|
||||||
|
|
||||||
|
<pre><code class="cpp"><span class="hljs-comment">// C</span>
|
||||||
|
<span class="hljs-preprocessor">#<span class="hljs-keyword">include</span> <stdio.h></span>
|
||||||
|
<span class="hljs-function"><span class="hljs-keyword">int</span> <span class="hljs-title">main</span><span class="hljs-params">()</span>
|
||||||
|
</span>{
|
||||||
|
<span class="hljs-built_in">printf</span>(<span class="hljs-string">"500 - Server Error"</span>);
|
||||||
|
<span class="hljs-keyword">return</span> <span class="hljs-number">0</span>;
|
||||||
|
}</code></pre>
|
||||||
|
<pre><code class="cpp"><span class="hljs-comment">// C++</span>
|
||||||
|
<span class="hljs-preprocessor">#<span class="hljs-keyword">include</span> <iostream></span>
|
||||||
|
<span class="hljs-function"><span class="hljs-keyword">int</span> <span class="hljs-title">main</span><span class="hljs-params">()</span>
|
||||||
|
</span>{
|
||||||
|
std::<span class="hljs-built_in">cout</span> << <span class="hljs-string">"500 - Server Error"</span> << std::endl;
|
||||||
|
<span class="hljs-keyword">return</span> <span class="hljs-number">0</span>;
|
||||||
|
}</code></pre>
|
||||||
|
<pre><code class="java"><span class="hljs-comment">// Java</span>
|
||||||
|
<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Main</span>
|
||||||
|
</span>{
|
||||||
|
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span><span class="hljs-params">(String[] args)</span>
|
||||||
|
</span>{
|
||||||
|
System.out.println(<span class="hljs-string">"500 - Server Error"</span>);
|
||||||
|
}
|
||||||
|
}</code></pre>
|
||||||
|
<pre><code class="js"><span class="hljs-comment">// JavaScript</span>
|
||||||
|
<span class="hljs-built_in">console</span>.log(<span class="hljs-string">"500 - Server Error"</span>)</code></pre>
|
||||||
|
<pre><code class="python"><span class="hljs-comment">// Python</span>
|
||||||
|
<span class="hljs-keyword">print</span> <span class="hljs-string">"500 - Server Error"</span></code></pre>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
@ -1,3 +1,4 @@
|
|||||||
|
{% verbatim %}
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
@ -8,10 +9,6 @@
|
|||||||
|
|
||||||
<title>在线评测系统 - 后台管理</title>
|
<title>在线评测系统 - 后台管理</title>
|
||||||
|
|
||||||
<!-- custom css begin -->
|
|
||||||
{% block css_block %}{% endblock %}
|
|
||||||
<!-- custom css end -->
|
|
||||||
|
|
||||||
<!-- global css begin -->
|
<!-- global css begin -->
|
||||||
<link href="/static/css/admin.css" rel="stylesheet">
|
<link href="/static/css/admin.css" rel="stylesheet">
|
||||||
<!-- global css end -->
|
<!-- global css end -->
|
||||||
@ -70,7 +67,13 @@
|
|||||||
<!-- admin left begin-->
|
<!-- admin left begin-->
|
||||||
<div class="col-md-2">
|
<div class="col-md-2">
|
||||||
<ul class="list-group">
|
<ul class="list-group">
|
||||||
<li class="list-group-header">首页</li>
|
<div ms-repeat="adminNavList">
|
||||||
|
<li class="list-group-header">{{ el.name }}</li>
|
||||||
|
<li class="list-group-item" ms-attr-id="getLiId(item.hash)" ms-repeat-item="el.children">
|
||||||
|
<a ms-attr-href="el.hash">{{ item.name }}</a>
|
||||||
|
</li>
|
||||||
|
</div>
|
||||||
|
<!--<li class="list-group-header">首页</li>
|
||||||
<li class="list-group-item" id="li-index-index">
|
<li class="list-group-item" id="li-index-index">
|
||||||
<a href="#index/index">主页</a>
|
<a href="#index/index">主页</a>
|
||||||
</li>
|
</li>
|
||||||
@ -80,8 +83,12 @@
|
|||||||
<li class="list-group-item" id="li-statistics-statistics">
|
<li class="list-group-item" id="li-statistics-statistics">
|
||||||
<a href="#statistics/statistics">统计</a>
|
<a href="#statistics/statistics">统计</a>
|
||||||
</li>
|
</li>
|
||||||
|
<li class="list-group-header">通用</li>
|
||||||
<li class="list-group-item" id="li-announcement-announcement">
|
<li class="list-group-item" id="li-announcement-announcement">
|
||||||
<a href="#announcement/announcement">公告</a>
|
<a href="#announcement/announcement">公告管理</a>
|
||||||
|
</li>
|
||||||
|
<li class="list-group-item" id="li-user-user_list">
|
||||||
|
<a href="#user/user_list">用户管理</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="list-group-header">题目管理</li>
|
<li class="list-group-header">题目管理</li>
|
||||||
<li class="list-group-item" id="li-problem-problem_list">
|
<li class="list-group-item" id="li-problem-problem_list">
|
||||||
@ -97,17 +104,14 @@
|
|||||||
<li class="list-group-item" id="li-contest-add_contest">
|
<li class="list-group-item" id="li-contest-add_contest">
|
||||||
<a href="#contest/add_contest">创建比赛</a>
|
<a href="#contest/add_contest">创建比赛</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="list-group-header">用户管理</li>
|
|
||||||
<li class="list-group-item" id="li-user-user_list">
|
|
||||||
<a href="#user/user_list">用户列表</a>
|
|
||||||
</li>
|
|
||||||
<li class="list-group-header">小组管理</li>
|
<li class="list-group-header">小组管理</li>
|
||||||
<li class="list-group-item" id="li-group-group">
|
<li class="list-group-item" id="li-group-group">
|
||||||
<a href="#group/group">小组列表</a>
|
<a href="#group/group">小组列表</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="list-group-item" id="li-group-join_group_request_list">
|
<li class="list-group-item" id="li-group-join_group_request_list">
|
||||||
<a href="#group/join_group_request_list">加入小组请求</a>
|
<a href="#group/join_group_request_list">加入小组请求</a>
|
||||||
</li>
|
</li>-->
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<!-- admin left end -->
|
<!-- admin left end -->
|
||||||
@ -133,4 +137,5 @@
|
|||||||
</div>
|
</div>
|
||||||
<!-- footer end -->
|
<!-- footer end -->
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
{% endverbatim %}
|
@ -7,6 +7,7 @@
|
|||||||
<th>创建时间</th>
|
<th>创建时间</th>
|
||||||
<th>更新时间</th>
|
<th>更新时间</th>
|
||||||
<th>创建者</th>
|
<th>创建者</th>
|
||||||
|
<td>可见范围</td>
|
||||||
<th>状态</th>
|
<th>状态</th>
|
||||||
<th></th>
|
<th></th>
|
||||||
</tr>
|
</tr>
|
||||||
@ -16,6 +17,7 @@
|
|||||||
<td>{{ el.create_time|date("yyyy-MM-dd HH:mm:ss")}}</td>
|
<td>{{ el.create_time|date("yyyy-MM-dd HH:mm:ss")}}</td>
|
||||||
<td>{{ el.last_update_time|date("yyyy-MM-dd HH:mm:ss")}}</td>
|
<td>{{ el.last_update_time|date("yyyy-MM-dd HH:mm:ss")}}</td>
|
||||||
<td>{{ el.created_by.username }}</td>
|
<td>{{ el.created_by.username }}</td>
|
||||||
|
<td ms-text="el.is_global?'全局可见':'组内可见'"></td>
|
||||||
<td>{{ getState(el)}}</td>
|
<td>{{ getState(el)}}</td>
|
||||||
<td>
|
<td>
|
||||||
<button class="btn-sm btn-info" ms-click="editAnnouncement(el)">编辑</button>
|
<button class="btn-sm btn-info" ms-click="editAnnouncement(el)">编辑</button>
|
||||||
@ -36,7 +38,7 @@
|
|||||||
|
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label>标题</label>
|
<label>标题</label>
|
||||||
<input name="title" type="text" class="form-control" id="newTitle" placeholder="公告标题" value=""></div>
|
<input name="title" type="text" class="form-control" id="newTitle" placeholder="公告标题" value="" ms-duplex="newTitle"></div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label>内容</label>
|
<label>内容</label>
|
||||||
<textarea id="edit-announcement-editor"></textarea>
|
<textarea id="edit-announcement-editor"></textarea>
|
||||||
@ -44,6 +46,25 @@
|
|||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label>可见 <input ms-duplex-checked="announcementVisible" type="checkbox"/></label>
|
<label>可见 <input ms-duplex-checked="announcementVisible" type="checkbox"/></label>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label>可见范围</label>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<span ms-if="showGlobalViewRadio">
|
||||||
|
<input type="radio" value="true" name="isGlobal" ms-duplex-boolean="isGlobal">全局可见
|
||||||
|
</span>
|
||||||
|
<span>
|
||||||
|
<input type="radio" value="false" name="isGlobal" ms-duplex-boolean="isGlobal">小组内可见
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="form-group col-md-12" ms-if="!isGlobal">
|
||||||
|
<!-- radio 的value 没有用 但是没有的话,表单验证会出错-->
|
||||||
|
<div ms-repeat="allGroups" class="col-md-4">
|
||||||
|
<input type="checkbox" value="group_id" ms-duplex-checked="el.isSelected"> {{ el.name }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<button ms-click="submitChange()" class="btn btn-primary">提交</button>
|
<button ms-click="submitChange()" class="btn btn-primary">提交</button>
|
||||||
|
|
||||||
@ -65,6 +86,25 @@
|
|||||||
</textarea>
|
</textarea>
|
||||||
<div class="help-block with-errors"></div>
|
<div class="help-block with-errors"></div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label>可见范围</label>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<span ms-if="showGlobalViewRadio">
|
||||||
|
<input type="radio" value="true" name="isGlobal" ms-duplex-boolean="isGlobal">全局可见
|
||||||
|
</span>
|
||||||
|
<span>
|
||||||
|
<input type="radio" value="false" name="isGlobal" ms-duplex-boolean="isGlobal">小组内可见
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="form-group col-md-12" ms-if="!isGlobal">
|
||||||
|
<!-- radio 的value 没有用 但是没有的话,表单验证会出错-->
|
||||||
|
<div ms-repeat="allGroups" class="col-md-4">
|
||||||
|
<input type="checkbox" value="group_id" ms-duplex-checked="el.isSelected"> {{ el.name }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<button type="submit" class="btn btn-primary">提交</button>
|
<button type="submit" class="btn btn-primary">提交</button>
|
||||||
</div>
|
</div>
|
||||||
|
@ -9,21 +9,7 @@
|
|||||||
<canvas class="line-chart" id="waiting-queue-chart"></canvas>
|
<canvas class="line-chart" id="waiting-queue-chart"></canvas>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
|
||||||
|
|
||||||
<h3>【10.1.24.23 - judge1 】</h3>
|
|
||||||
|
|
||||||
<div>
|
|
||||||
<canvas class="line-chart" id="judge-instance-chart"></canvas>
|
|
||||||
<div class="chart-description">判题实例数量变化</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div>
|
|
||||||
<canvas id="c1" class="line-chart"></canvas>
|
|
||||||
<div class="chart-description">cpu 和 内存</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
<button class="btn btn-danger" id="clear-chart-data">清空图表数据</button>
|
||||||
<script src="/static/js/app/admin/monitor/monitor.js"></script>
|
<script src="/static/js/app/admin/monitor/monitor.js"></script>
|
||||||
</div>
|
</div>
|
@ -1,39 +1,139 @@
|
|||||||
{% extends "oj_base.html" %}
|
<!DOCTYPE html>
|
||||||
{% block body %}
|
<html>
|
||||||
<div class="container">
|
|
||||||
<div class="container">
|
|
||||||
|
|
||||||
<div class="jumbotron">
|
<head>
|
||||||
<h1>青岛大学在线评测平台</h1>
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
|
||||||
|
<title>青岛大学在线评测平台 - 首页</title>
|
||||||
|
|
||||||
<p class="lead">走心的在线评测平台和算法交流社区,全新登场~</p>
|
<link rel="stylesheet" type="text/css" href="/static/css/fullpage/jquery.fullPage.css">
|
||||||
|
<style>
|
||||||
|
html, textarea, input, option, select, button {
|
||||||
|
font: 1em "Helvetica Neue", Helvetica, "Lantinghei SC", "Hiragino Sans GB", "Microsoft YaHei", "微软雅黑", "STHeiti", "WenQuanYi Micro Hei", SimSun, sans-serif;
|
||||||
|
color: #FFF;
|
||||||
|
}
|
||||||
|
|
||||||
<p><a class="btn btn-lg btn-primary" href="/problems/" role="button">开始刷题!</a></p>
|
a {
|
||||||
</div>
|
text-decoration: none;
|
||||||
|
color: #FFF;
|
||||||
|
}
|
||||||
|
|
||||||
<!-- Example row of columns -->
|
#header {
|
||||||
<div class="row">
|
position: fixed;
|
||||||
<div class="col-lg-4">
|
height: 30px;
|
||||||
<h2>全新UI 全新设计</h2>
|
display: block;
|
||||||
|
width: 100%;
|
||||||
|
background: transparent;
|
||||||
|
z-index: 10;
|
||||||
|
padding: 20px 20px 0 20px;
|
||||||
|
}
|
||||||
|
|
||||||
<p>精心设计的UI和交互让你。。。编不下去了 </p>
|
#name {
|
||||||
</div>
|
font-size: 45px;
|
||||||
<div class="col-lg-4">
|
margin-right: 20px;
|
||||||
<h2>分布式评测</h2>
|
}
|
||||||
|
|
||||||
<p>技术领先的高性能分布式评测机制,根据提交数量自动伸缩判题机器实例。</p>
|
.section {
|
||||||
</div>
|
position: relative;
|
||||||
<div class="col-lg-4">
|
}
|
||||||
<h2>高质量原创题目</h2>
|
|
||||||
|
|
||||||
<p>Donec sed odio dui. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Vestibulum id
|
.section h1 {
|
||||||
ligula
|
font-size: 60px;
|
||||||
porta felis euismod semper. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum
|
}
|
||||||
nibh,
|
|
||||||
ut fermentum massa.</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
.section h3 {
|
||||||
|
font-size: 30px;
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bottom-pointer {
|
||||||
|
top: auto;
|
||||||
|
bottom: 20px;
|
||||||
|
position: absolute;
|
||||||
|
left: 48%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.index-section-text {
|
||||||
|
position: absolute;
|
||||||
|
top: 30%;
|
||||||
|
width: 100%;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.section-text {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon {
|
||||||
|
max-height: 300px;
|
||||||
|
max-width: 300px;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
<link rel="stylesheet" href="/static/css/animate/animate.css">
|
||||||
|
|
||||||
|
<script src="/static/js/lib/jquery/jquery.js"></script>
|
||||||
|
|
||||||
|
<script src="/static/js/lib/fullpage/jquery.fullPage.min.js"></script>
|
||||||
|
|
||||||
|
<script type="text/javascript">
|
||||||
|
$(document).ready(function () {
|
||||||
|
$('#fullpage').fullpage({
|
||||||
|
sectionsColor: ['#28ac72', '#2f7ddb', '#FAC832', '#B01414'],
|
||||||
|
css3: true,
|
||||||
|
navigation: true,
|
||||||
|
loopBottom: true
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="header">
|
||||||
|
<span id="name">qduoj</span>
|
||||||
|
<a href="/problems/">题目</a> <a href="#">比赛</a> <a href="#">小组</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="fullpage">
|
||||||
|
<div class="section" id="section0">
|
||||||
|
<div class="index-section-text animated bounceInUp">
|
||||||
|
<h1>青岛大学在线评测平台</h1>
|
||||||
|
|
||||||
|
<h3>全新面貌,新的开始~</h3>
|
||||||
|
</div>
|
||||||
|
<div class="bottom-pointer">↓继续滚动~</div>
|
||||||
|
</div>
|
||||||
|
<div class="section" id="section1">
|
||||||
|
|
||||||
|
<div class="section-text">
|
||||||
|
<img class="icon" id="img1" src="/static/img/index/a.png">
|
||||||
|
|
||||||
|
<h1>分布式评测</h1>
|
||||||
|
|
||||||
|
<h3>再也不怕一直是 waiting 了~~</h3>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="section" id="section2">
|
||||||
|
|
||||||
|
<div class="section-text">
|
||||||
|
<img class="icon" id="img2" src="/static/img/index/c.png">
|
||||||
|
|
||||||
|
<h1>多种比赛模式</h1>
|
||||||
|
|
||||||
|
<h3>ACM 模式,AC 数量模式,单题得分模式等</h3>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endblock %}
|
<div class="section" id="section3">
|
||||||
|
|
||||||
|
<div class="section-text">
|
||||||
|
<img class="icon" id="img3" src="/static/img/index/m.png">
|
||||||
|
|
||||||
|
<h1>自由举办小组赛</h1>
|
||||||
|
|
||||||
|
<h3>内部比赛,日常作业,期末考试,通通搞定</h3>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
@ -1,15 +1,15 @@
|
|||||||
{% extends "oj_base.html" %}
|
{% extends "oj_base.html" %}
|
||||||
{% block body %}
|
{% block body %}
|
||||||
{% load problem %}
|
{% load problem %}
|
||||||
<div class="container main" ms-controller="problem_list">
|
<div class="container main">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-lg-9">
|
<div class="col-lg-9">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="right">
|
<div class="right">
|
||||||
<form class="form-inline" onsubmit="return false;">
|
<form class="form-inline" method="get">
|
||||||
<div class="form-group-sm">
|
<div class="form-group-sm">
|
||||||
<input name="keyWord" class="form-control" placeholder="请输入关键词" ms-duplex="key_word">
|
<input name="keyword" class="form-control" placeholder="请输入关键词">
|
||||||
<input type="submit" value="搜索" class="btn btn-primary" ms-click="getPage(1)">
|
<input type="submit" value="搜索" class="btn btn-primary">
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
@ -18,19 +18,21 @@
|
|||||||
<table class="table table-striped">
|
<table class="table table-striped">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
|
<th></th>
|
||||||
<th>#</th>
|
<th>#</th>
|
||||||
<th>题目</th>
|
<th>题目</th>
|
||||||
<th>难度</th>
|
<th><a href="/problems/?order_by=difficulty">难度</a></th>
|
||||||
<th>通过率</th>
|
<th><a href="/problems/?order_by=aceptance">通过率</a></th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
{% for item in problems %}
|
{% for item in problems %}
|
||||||
<tr>
|
<tr>
|
||||||
|
<th><span class="glyphicon glyphicon-ok ac-flag"></span></th>
|
||||||
<th scope="row"><a href="/problem/{{ item.id }}/">{{ item.id }}</a></th>
|
<th scope="row"><a href="/problem/{{ item.id }}/">{{ item.id }}</a></th>
|
||||||
<td><a href="/problem/{{ item.id }}/">{{ item.title }}</a></td>
|
<td><a href="/problem/{{ item.id }}/">{{ item.title }}</a></td>
|
||||||
<td>{{ item.difficulty }}</td>
|
<td>{{ item.difficulty }}</td>
|
||||||
<td>{{ item|accepted_radio }}</td>
|
<td>{{ item|accepted_radio }}%</td>
|
||||||
</tr>
|
</tr>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</tbody>
|
</tbody>
|
||||||
@ -59,7 +61,11 @@
|
|||||||
<span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span>
|
<span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span>
|
||||||
公告
|
公告
|
||||||
</h3></div>
|
</h3></div>
|
||||||
<div class="panel-body"> Panel content</div>
|
<div class="panel-body">
|
||||||
|
{% for item in announcements %}
|
||||||
|
{{ forloop.counter }}. <a href="/announcement/{{ item.id }}/" target="_blank">{{ item.title }}</a>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="panel panel-info">
|
<div class="panel panel-info">
|
||||||
<div class="panel-heading">
|
<div class="panel-heading">
|
||||||
@ -69,26 +75,12 @@
|
|||||||
</h3>
|
</h3>
|
||||||
</div>
|
</div>
|
||||||
<ul class="list-group">
|
<ul class="list-group">
|
||||||
<li class="list-group-item problem-tag">
|
{% for item in tags %}
|
||||||
<span class="badge">14</span>
|
<li class="list-group-item problem-tag" onclick="location.href='/problems/?tag={{ item.name }}'">
|
||||||
Cras justo odio
|
<span class="badge">{{ item.problem_number }}</span>
|
||||||
</li>
|
{{ item.name }}
|
||||||
<li class="list-group-item problem-tag">
|
|
||||||
<span class="badge">14</span>
|
|
||||||
Cras justo odio
|
|
||||||
</li>
|
|
||||||
<li class="list-group-item problem-tag">
|
|
||||||
<span class="badge">14</span>
|
|
||||||
Cras justo odio
|
|
||||||
</li>
|
|
||||||
<li class="list-group-item problem-tag">
|
|
||||||
<span class="badge">14</span>
|
|
||||||
Cras justo odio
|
|
||||||
</li>
|
|
||||||
<li class="list-group-item problem-tag">
|
|
||||||
<span class="badge">14</span>
|
|
||||||
Cras justo odio
|
|
||||||
</li>
|
</li>
|
||||||
|
{% endfor %}
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -1,10 +1,151 @@
|
|||||||
<!DOCTYPE html>
|
{% extends "oj_base.html" %}
|
||||||
<html>
|
{% block css_block %}
|
||||||
<head lang="en">
|
<style>
|
||||||
<meta charset="UTF-8">
|
pre {
|
||||||
<title></title>
|
position: relative;
|
||||||
</head>
|
padding: 10px;
|
||||||
<body>
|
border: none;
|
||||||
{{ error }}
|
overflow: auto;
|
||||||
</body>
|
line-height: 1.3;
|
||||||
</html>
|
max-height: 500px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.hljs {
|
||||||
|
display: block;
|
||||||
|
padding: 0.5em;
|
||||||
|
background: #fdf6e3;
|
||||||
|
color: #657b83;
|
||||||
|
}
|
||||||
|
|
||||||
|
.hljs-comment,
|
||||||
|
.hljs-template_comment,
|
||||||
|
.diff .hljs-header,
|
||||||
|
.hljs-doctype,
|
||||||
|
.hljs-pi,
|
||||||
|
.lisp .hljs-string,
|
||||||
|
.hljs-javadoc {
|
||||||
|
color: #93a1a1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Solarized Green */
|
||||||
|
.hljs-keyword,
|
||||||
|
.hljs-winutils,
|
||||||
|
.method,
|
||||||
|
.hljs-addition,
|
||||||
|
.css .hljs-tag,
|
||||||
|
.hljs-request,
|
||||||
|
.hljs-status,
|
||||||
|
.nginx .hljs-title {
|
||||||
|
color: #859900;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Solarized Cyan */
|
||||||
|
.hljs-number,
|
||||||
|
.hljs-command,
|
||||||
|
.hljs-string,
|
||||||
|
.hljs-tag .hljs-value,
|
||||||
|
.hljs-rules .hljs-value,
|
||||||
|
.hljs-phpdoc,
|
||||||
|
.tex .hljs-formula,
|
||||||
|
.hljs-regexp,
|
||||||
|
.hljs-hexcolor,
|
||||||
|
.hljs-link_url {
|
||||||
|
color: #2aa198;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Solarized Blue */
|
||||||
|
.hljs-title,
|
||||||
|
.hljs-localvars,
|
||||||
|
.hljs-chunk,
|
||||||
|
.hljs-decorator,
|
||||||
|
.hljs-built_in,
|
||||||
|
.hljs-identifier,
|
||||||
|
.vhdl .hljs-literal,
|
||||||
|
.hljs-id,
|
||||||
|
.css .hljs-function {
|
||||||
|
color: #268bd2;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Solarized Yellow */
|
||||||
|
.hljs-attribute,
|
||||||
|
.hljs-variable,
|
||||||
|
.lisp .hljs-body,
|
||||||
|
.smalltalk .hljs-number,
|
||||||
|
.hljs-constant,
|
||||||
|
.hljs-class .hljs-title,
|
||||||
|
.hljs-parent,
|
||||||
|
.haskell .hljs-type,
|
||||||
|
.hljs-link_reference {
|
||||||
|
color: #b58900;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Solarized Orange */
|
||||||
|
.hljs-preprocessor,
|
||||||
|
.hljs-preprocessor .hljs-keyword,
|
||||||
|
.hljs-pragma,
|
||||||
|
.hljs-shebang,
|
||||||
|
.hljs-symbol,
|
||||||
|
.hljs-symbol .hljs-string,
|
||||||
|
.diff .hljs-change,
|
||||||
|
.hljs-special,
|
||||||
|
.hljs-attr_selector,
|
||||||
|
.hljs-subst,
|
||||||
|
.hljs-cdata,
|
||||||
|
.clojure .hljs-title,
|
||||||
|
.css .hljs-pseudo,
|
||||||
|
.hljs-header {
|
||||||
|
color: #cb4b16;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Solarized Red */
|
||||||
|
.hljs-deletion,
|
||||||
|
.hljs-important {
|
||||||
|
color: #dc322f;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Solarized Violet */
|
||||||
|
.hljs-link_label {
|
||||||
|
color: #6c71c4;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tex .hljs-formula {
|
||||||
|
background: #eee8d5;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
{% endblock %}
|
||||||
|
{% block body %}
|
||||||
|
<div class="container">
|
||||||
|
<h2>出错了~~ {{ error }}</h2>
|
||||||
|
<hr>
|
||||||
|
<div class="article fmt">
|
||||||
|
|
||||||
|
<pre><code class="cpp"><span class="hljs-comment">// C</span>
|
||||||
|
<span class="hljs-preprocessor">#<span class="hljs-keyword">include</span> <stdio.h></span>
|
||||||
|
<span class="hljs-function"><span class="hljs-keyword">int</span> <span class="hljs-title">main</span><span class="hljs-params">()</span>
|
||||||
|
</span>{
|
||||||
|
<span class="hljs-built_in">printf</span>(<span class="hljs-string">"An error occurred\n"</span>);
|
||||||
|
<span class="hljs-keyword">return</span> <span class="hljs-number">0</span>;
|
||||||
|
}</code></pre>
|
||||||
|
<pre><code class="cpp"><span class="hljs-comment">// C++</span>
|
||||||
|
<span class="hljs-preprocessor">#<span class="hljs-keyword">include</span> <iostream></span>
|
||||||
|
<span class="hljs-function"><span class="hljs-keyword">int</span> <span class="hljs-title">main</span><span class="hljs-params">()</span>
|
||||||
|
</span>{
|
||||||
|
std::<span class="hljs-built_in">cout</span> << <span class="hljs-string">"An error occurred"</span> << std::endl;
|
||||||
|
<span class="hljs-keyword">return</span> <span class="hljs-number">0</span>;
|
||||||
|
}</code></pre>
|
||||||
|
<pre><code class="java"><span class="hljs-comment">// Java</span>
|
||||||
|
<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Main</span>
|
||||||
|
</span>{
|
||||||
|
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span><span class="hljs-params">(String[] args)</span>
|
||||||
|
</span>{
|
||||||
|
System.out.println(<span class="hljs-string">"An error occurred"</span>);
|
||||||
|
}
|
||||||
|
}</code></pre>
|
||||||
|
<pre><code class="js"><span class="hljs-comment">// JavaScript</span>
|
||||||
|
<span class="hljs-built_in">console</span>.log(<span class="hljs-string">"An error occurred\n"</span>)</code></pre>
|
||||||
|
<pre><code class="python"><span class="hljs-comment">// Python</span>
|
||||||
|
<span class="hljs-keyword">print</span> <span class="hljs-string">"An error occurred"</span></code></pre>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
@ -1,10 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html>
|
|
||||||
<head lang="en">
|
|
||||||
<meta charset="UTF-8">
|
|
||||||
<title></title>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
{{ info }}
|
|
||||||
</body>
|
|
||||||
</html>
|
|
Loading…
Reference in New Issue
Block a user