Accept Merge Request #44 : (virusdefender-dev -> dev)

Merge Request: 后台模板加载问题修复
Created By: @virusdefender
Accepted By: @virusdefender
URL: https://coding.net/u/virusdefender/p/qduoj/git/merge/44
This commit is contained in:
virusdefender
2015-08-08 09:45:29 +08:00
12 changed files with 122 additions and 211 deletions

View File

@@ -1,39 +0,0 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
import account.models
class Migration(migrations.Migration):
dependencies = [
]
operations = [
migrations.CreateModel(
name='User',
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('password', models.CharField(max_length=128, verbose_name='password')),
('last_login', models.DateTimeField(null=True, verbose_name='last login', blank=True)),
('username', models.CharField(unique=True, max_length=30)),
('real_name', models.CharField(max_length=30, null=True, blank=True)),
('email', models.EmailField(max_length=254, null=True, blank=True)),
('create_time', models.DateTimeField(auto_now_add=True)),
('admin_type', models.IntegerField(default=0)),
],
options={
'db_table': 'user',
},
managers=[
('objects', account.models.UserManager()),
],
),
migrations.CreateModel(
name='AdminGroup',
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
],
),
]

View File

@@ -1,26 +0,0 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
import account.models
class Migration(migrations.Migration):
dependencies = [
('account', '0001_initial'),
]
operations = [
migrations.AlterModelManagers(
name='user',
managers=[
(b'objects', account.models.UserManager()),
],
),
migrations.AddField(
model_name='user',
name='real_name',
field=models.CharField(max_length=30, null=True, blank=True),
),
]

View File

@@ -1,19 +0,0 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
class Migration(migrations.Migration):
dependencies = [
('account', '0002_auto_20150731_2310'),
]
operations = [
migrations.AddField(
model_name='user',
name='email',
field=models.EmailField(max_length=254, null=True, blank=True),
),
]

View File

@@ -1,23 +0,0 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
class Migration(migrations.Migration):
dependencies = [
('account', '0003_user_email'),
]
operations = [
migrations.RemoveField(
model_name='user',
name='admin_group',
),
migrations.AddField(
model_name='user',
name='admin_type',
field=models.IntegerField(default=0),
),
]

View File

@@ -19,7 +19,7 @@ class UserLoginAPIView(APIView):
---
request_serializer: UserLoginSerializer
"""
serializer = UserLoginSerializer(data=request.DATA)
serializer = UserLoginSerializer(data=request.data)
if serializer.is_valid():
data = serializer.data
user = auth.authenticate(username=data["username"], password=data["password"])
@@ -40,7 +40,7 @@ class UserRegisterAPIView(APIView):
---
request_serializer: UserRegisterSerializer
"""
serializer = UserRegisterSerializer(data=request.DATA)
serializer = UserRegisterSerializer(data=request.data)
if serializer.is_valid():
data = serializer.data
try:
@@ -68,7 +68,7 @@ class UserChangePasswordAPIView(APIView):
---
request_serializer: UserChangePasswordSerializer
"""
serializer = UserChangePasswordSerializer(data=request.DATA)
serializer = UserChangePasswordSerializer(data=request.data)
if serializer.is_valid():
data = serializer.data
user = auth.authenticate(username=data["username"], password=data["old_password"])
@@ -89,7 +89,7 @@ class UsernameCheckAPIView(APIView):
---
request_serializer: UsernameCheckSerializer
"""
serializer = UsernameCheckSerializer(data=request.DATA)
serializer = UsernameCheckSerializer(data=request.data)
if serializer.is_valid():
try:
User.objects.get(username=serializer.data["username"])
@@ -107,7 +107,7 @@ class EmailCheckAPIView(APIView):
---
request_serializer: EmailCheckSerializer
"""
serializer = EmailCheckSerializer(data=request.DATA)
serializer = EmailCheckSerializer(data=request.data)
if serializer.is_valid():
try:
User.objects.get(email=serializer.data["email"])
@@ -148,7 +148,7 @@ class UserAdminAPIView(APIView):
request_serializer: EditUserSerializer
response_serializer: UserSerializer
"""
serializer = EditUserSerializer(data=request.DATA)
serializer = EditUserSerializer(data=request.data)
if serializer.is_valid():
data = serializer.data
try:

View File

@@ -17,7 +17,7 @@ class AnnouncementAdminAPIView(APIView):
---
request_serializer: CreateAnnouncementSerializer
"""
serializer = CreateAnnouncementSerializer(data=request.DATA)
serializer = CreateAnnouncementSerializer(data=request.data)
if serializer.is_valid():
data = serializer.data
Announcement.objects.create(title=data["title"],
@@ -34,7 +34,7 @@ class AnnouncementAdminAPIView(APIView):
request_serializer: EditAnnouncementSerializer
response_serializer: AnnouncementSerializer
"""
serializer = EditAnnouncementSerializer(data=request.DATA)
serializer = EditAnnouncementSerializer(data=request.data)
if serializer.is_valid():
data = serializer.data
try:

View File

@@ -1,42 +1,47 @@
define("admin", ["jquery", "avalon"], function($, avalon){
function li_active(selector){
$(selector).attr("class", "list-group-item active");
}
define("admin", ["jquery", "avalon"], function ($, avalon) {
function li_inactive(selector){
$(".list-group-item").attr("class", "list-group-item");
}
avalon.ready(function () {
function show_template(url){
$("#loading-gif").show();
vm.template_url = url;
}
var vm = avalon.define({
$id: "admin",
template_url: "template/index/index.html",
hide_loading: function(){
$("#loading-gif").hide();
function li_active(selector) {
$(selector).attr("class", "list-group-item active");
}
});
var hash = window.location.hash.substring(1);
function li_inactive(selector) {
$(".list-group-item").attr("class", "list-group-item");
}
if(hash){
li_active("#li-" + hash.replace("/", "-"));
show_template("template/" + hash + ".html");
}else {
li_active("#li-index-index");
}
function show_template(url) {
$("#loading-gif").show();
vm.template_url = url;
}
window.onhashchange = function() {
var hash = window.location.hash.substring(1);
if(hash){
li_inactive(".list-group-item");
li_active("#li-" + hash.replace("/", "-"));
show_template("template/" + hash + ".html");
if (!hash) {
hash = "index/index";
}
};
var vm = avalon.define({
$id: "admin",
template_url: "template/" + hash + ".html",
hide_loading: function () {
$("#loading-gif").hide();
}
});
avalon.scan();
li_active("#li-" + hash.replace("/", "-"));
window.onhashchange = function () {
var hash = window.location.hash.substring(1);
if (hash) {
li_inactive(".list-group-item");
li_active("#li-" + hash.replace("/", "-"));
show_template("template/" + hash + ".html");
}
};
});
});

View File

@@ -0,0 +1,56 @@
require(["jquery", "chart"], function ($, Chart) {
var data = {
labels: ["January", "February", "March", "April", "May", "June", "July",
"January", "February", "March", "April", "January", "February", "March", "April"],
datasets: [
{
label: "11111111",
fillColor: "rgba(220,220,220,0.2)",
strokeColor: "rgba(220,220,220,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(151,187,205,0.2)",
strokeColor: "rgba(151,187,205,1)",
pointColor: "rgba(151,187,205,1)",
pointStrokeColor: "#fff",
pointHighlightFill: "#fff",
pointHighlightStroke: "rgba(151,187,205,1)",
data: [3, 7, 8, 9, 1, 4, 10, 10, 9, 8, 7, 10, 10, 10, 10]
}
]
};
Chart.defaults.global.responsive = true;
var myLineChart = new Chart($("#myChart").get(0).getContext("2d")).Line(data);
var data1 = [
{
value: 300,
color:"#F7464A",
highlight: "#FF5A5E",
label: "Red"
},
{
value: 50,
color: "#46BFBD",
highlight: "#5AD3D1",
label: "Green"
},
{
value: 100,
color: "#FDB45C",
highlight: "#FFC870",
label: "Yellow"
}
];
new Chart($("#c1").get(0).getContext("2d")).Pie(data1);
new Chart($("#c2").get(0).getContext("2d")).Pie(data1);
});

View File

@@ -16,6 +16,7 @@ var require = {
contest: "app/admin/contest/contest",
csrf: "utils/csrf",
admin: "app/admin/admin",
chart: "lib/chart/Chart",
//formValidation 不要在代码中单独使用而是使用和修改utils/validation
base: "lib/formValidation/base",

View File

@@ -1,65 +0,0 @@
<style> [ms-controller] {
display: none
}</style>
<h1>Announcement</h1>
<div ms-controller="announcement">
<table class="table table-striped">
<tr>
<th>编号</th>
<th>标题</th>
<th>创建时间</th>
<th>更新时间</th>
<th>创建者</th>
<th>状态</th>
<th>操作</th>
</tr>
<tr ms-repeat="announcement">
<td>{{el.id}}</td>
<td>{{el.title}}</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.created_by.username}}</td>
<td>{{getState(el)}}</td>
<td>
<button class="btn-sm btn-info" ms-click="enEdit(el)">编辑</button>
</td>
</tr>
</table>
<div class="text-right">
页数:{{page}}/{{page+next_page}}
<botton ms-attr-class="getBtnClass(0)" ms-click="getPrevious">上一页</botton>
<botton ms-attr-class="getBtnClass(1)" ms-click="getNext">下一页</botton>
</div>
<div ms-visible="isEditing">
<h3>编辑公告</h3>
<div class="form-group"><label for="title">标题</label>
<input name="title" type="text" class="form-control" id="newTitle" placeholder="公告标题" value=""></div>
<div class="form-group">
<label>内容</label>
<textarea id="editAnnouncementEditor"></textarea>
</div>
<div class="form-group">
<label>隐藏</label>
<input type="checkbox" id="hidden">
</div>
<div class="form-group">
<button ms-click="submitChange()" class="btn btn-primary">提交</button><button ms-click="disEdit()" class="btn btn-danger">取消</button>
</div>
</div>
<h3>添加公告</h3>
<form id="announcement-form">
<div class="form-group"><label for="title">标题</label>
<input name="title" type="text" class="form-control" id="title" placeholder="公告标题"></div>
<div class="form-group">
<label>内容</label>
<textarea id="editor" placeholder="公告内容"></textarea>
</div>
<div class="form-group">
<button type="submit" class="btn btn-primary">提交</button>
</div>
</form>
</div>
<script src="/static/js/app/admin/announcement/announcement.js"></script>

View File

@@ -0,0 +1,21 @@
<div ms-controller="monitor" class="col-lg-9">
<h1>服务器监控</h1>
<div>
<h3>判题实例数量</h3>
<div>
<canvas id="myChart" style="min-width:100%;max-height: 300px;"></canvas>
<div style="text-align: center;">判题实例数量变化</div>
</div>
<div style="width: 50%;float: left;">
<canvas id="c1" width="250" height="125"></canvas>
<div style="text-align: center;">内存</div>
</div>
<div style="width: 50%;float: left;">
<canvas id="c2" width="250" height="125"></canvas>
<div style="text-align: center"> cpu</div>
</div>
</div>
<script src="/static/js/app/admin/monitor/monitor.js"></script>
</div>