From 324e72c231906f2a7f810095daf2080c991ac092 Mon Sep 17 00:00:00 2001 From: sxw Date: Fri, 7 Aug 2015 19:46:46 +0800 Subject: [PATCH 1/6] =?UTF-8?q?=E5=90=8E=E5=8F=B0=E9=A1=B5=E9=9D=A2?= =?UTF-8?q?=E5=B0=8Fbug=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 包括按钮的距离,模板的css等 --- static/src/css/global.css | 4 ++++ template/admin/admin.html | 2 +- .../admin/{index => announcement}/announcement.html | 12 ++++++------ template/admin/contest/add_contest.html | 2 -- 4 files changed, 11 insertions(+), 9 deletions(-) rename template/admin/{index => announcement}/announcement.html (91%) diff --git a/static/src/css/global.css b/static/src/css/global.css index c55a0bb3..17826003 100644 --- a/static/src/css/global.css +++ b/static/src/css/global.css @@ -24,4 +24,8 @@ img { label { font-size: 16px; +} + +[ms-controller] { + display: none } \ No newline at end of file diff --git a/template/admin/admin.html b/template/admin/admin.html index 99d5b894..e72e0f44 100644 --- a/template/admin/admin.html +++ b/template/admin/admin.html @@ -84,7 +84,7 @@ -
+
diff --git a/template/admin/index/announcement.html b/template/admin/announcement/announcement.html similarity index 91% rename from template/admin/index/announcement.html rename to template/admin/announcement/announcement.html index c93b7609..22692d5f 100644 --- a/template/admin/index/announcement.html +++ b/template/admin/announcement/announcement.html @@ -1,8 +1,7 @@ - -

Announcement

-
+ + +
+

Announcement

@@ -45,7 +44,8 @@
- +    +

添加公告

diff --git a/template/admin/contest/add_contest.html b/template/admin/contest/add_contest.html index 9a789a4f..4ac0be84 100644 --- a/template/admin/contest/add_contest.html +++ b/template/admin/contest/add_contest.html @@ -1,6 +1,4 @@
- -
From a03b8af79d867107ac938de3a880cf0488881127 Mon Sep 17 00:00:00 2001 From: sxw Date: Sat, 8 Aug 2015 08:39:37 +0800 Subject: [PATCH 2/6] =?UTF-8?q?[=E5=89=8D=E7=AB=AF-=E5=85=AC=E5=91=8A?= =?UTF-8?q?=E7=AE=A1=E7=90=86]=E5=A2=9E=E5=8A=A0=E4=BB=85=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E5=8F=AF=E8=A7=81=E5=85=AC=E5=91=8A=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=EF=BC=8C=E7=BB=9F=E4=B8=80=E6=95=B0=E6=8D=AE=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 58 ------------------- .../js/app/admin/announcement/announcement.js | 31 +++++++--- template/admin/announcement/announcement.html | 14 +++-- 3 files changed, 31 insertions(+), 72 deletions(-) delete mode 100644 .gitignore diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 12a8c859..00000000 --- a/.gitignore +++ /dev/null @@ -1,58 +0,0 @@ -# Byte-compiled / optimized / DLL files -__pycache__/ -*.py[cod] -# C extensions -*.so -# Distribution / packaging -.Python -env/ -bin/ -build/ -develop-eggs/ -dist/ -eggs/ -lib64/ -parts/ -sdist/ -var/ -*.egg-info/ -.installed.cfg -*.egg -# Installer logs -pip-log.txt -pip-delete-this-directory.txt -# Unit test / coverage reports -htmlcov/ -.tox/ -.coverage -.cache -nosetests.xml -coverage.xml -# Translations -*.mo -# Mr Developer -.mr.developer.cfg -.project -.pydevproject -# Rope -.ropeproject -.idea/ -# Django stuff: -*.log -*.pot -# Sphinx documentation -docs/_build/ -# Back up file -*~ -#db file -db.db -#vim cache -*swp -*swo -#redis dump -*.rdb -#*.out -db.sqlite3 -.DS_Store -log/ -release/ \ No newline at end of file diff --git a/static/src/js/app/admin/announcement/announcement.js b/static/src/js/app/admin/announcement/announcement.js index 1d3cc28d..4ffe9f14 100644 --- a/static/src/js/app/admin/announcement/announcement.js +++ b/static/src/js/app/admin/announcement/announcement.js @@ -12,6 +12,18 @@ require(["jquery", "avalon", "csrf", "bs_alert", "editor", "validation"], functi next_page: 0, // 之后的页数 page: 1, // 当前页数 isEditing: 0, // 正在编辑的公告的ID, 为零说明未在编辑 + page_count: 1, + visableOnly : false, + showOrHide : "仅显示可见", + announcementVisible : true, + changeHiddenState : function () { + if (vm.visableOnly == false) + vm.showOrHide = "显示全部"; + else + vm.showOrHide = "仅显示可见"; + vm.visableOnly =! vm.visableOnly; + getPageData(vm.page); + }, getState: function (el) { //获取公告当前状态,显示 if (el.visible) return "可见"; @@ -42,8 +54,7 @@ require(["jquery", "avalon", "csrf", "bs_alert", "editor", "validation"], functi if (!editAnnouncementEditor) //初始化编辑器 editAnnouncementEditor = editor("#editAnnouncementEditor"); editAnnouncementEditor.setValue(el.content); - if (el.visible == false) - $("#hidden").attr("checked", true); + vm.announcementVisible=el.visible; if (vm.isEditing == el.id) vm.isEditing = 0; else @@ -54,17 +65,15 @@ require(["jquery", "avalon", "csrf", "bs_alert", "editor", "validation"], functi vm.isEditing = 0; }, submitChange: function () { // 处理编辑公告提交事件,顺便验证字段为空 - var title = $("#newTitle").val(), content = editAnnouncementEditor.getValue(), visible = true; - if ($("#hidden").attr("checked") == true) - visible = false; + var title = $("#newTitle").val(), content = editAnnouncementEditor.getValue(); if (title != "") { if (content != "") { $.ajax({ //发送修改公告请求 beforeSend: csrfHeader, - url: "/api/edit_announcements/", + url: "/api/announcements/", dataType: "json", - method: "post", - data: {id: vm.isEditing, title: title, content: content, visible: visible}, + method: "put", + data: {id: vm.isEditing, title: title, content: content, visible: vm.announcementVisible}, success: function (data) { if (!data.code) { bs_alert("修改成功"); @@ -91,14 +100,18 @@ require(["jquery", "avalon", "csrf", "bs_alert", "editor", "validation"], functi vm.isEditing = 0; //Ajax get数据 function getPageData(page) { + var visible = ''; + if (vm.visableOnly == true) + visible = "&visible=true"; $.ajax({ beforeSend: csrfHeader, - url: "/api/announcements/?paging=true&page=" + page + "&page_size=10", + url: "/api/announcements/?paging=true&page=" + page + "&page_size=10"+visible, dataType: "json", method: "get", success: function (data) { if (!data.code) { vm.announcement = data.data.results; + vm.page_count = data.data.total_page; vm.previous_page = data.data.previous_page; vm.next_page = data.data.next_page; } diff --git a/template/admin/announcement/announcement.html b/template/admin/announcement/announcement.html index 22692d5f..4bfd2279 100644 --- a/template/admin/announcement/announcement.html +++ b/template/admin/announcement/announcement.html @@ -1,4 +1,4 @@ - +

Announcement

@@ -24,8 +24,12 @@
编号
+
+ + +
- 页数:{{page}}/{{page+next_page}} + 页数:{{page}}/{{page_count}}   上一页 下一页
@@ -40,11 +44,11 @@
- - +
-    + +   
From fc57dcbde480c0957754e0f666daa8e1b36b3ddc Mon Sep 17 00:00:00 2001 From: sxw Date: Sat, 8 Aug 2015 08:41:20 +0800 Subject: [PATCH 3/6] =?UTF-8?q?[=E5=90=8E=E7=AB=AF]=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E5=90=8E=E7=AB=AF=E5=85=AC=E5=91=8AGET=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=EF=BC=8C=E5=A2=9E=E5=8A=A0=E8=BF=94=E5=9B=9E=E5=85=AC=E5=91=8A?= =?UTF-8?q?=E6=80=BB=E6=9D=A1=E6=95=B0=EF=BC=8C=E6=80=BB=E9=A1=B5=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- admin/views.py | 2 +- utils/shortcuts.py | 8 ++++++-- utils/tests.py | 8 ++++++-- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/admin/views.py b/admin/views.py index b37d22d1..78762c02 100644 --- a/admin/views.py +++ b/admin/views.py @@ -11,4 +11,4 @@ class AdminTemplateView(APIView): try: return HttpResponse(open(path).read(), content_type="text/html") except IOError: - return HttpResponse(u"模板不存在", content_type="text/html") + raise Http404 diff --git a/utils/shortcuts.py b/utils/shortcuts.py index 852622f3..44610a9f 100644 --- a/utils/shortcuts.py +++ b/utils/shortcuts.py @@ -70,7 +70,11 @@ def paginate(request, query_set, object_serializer): except Exception: return error_response(u"参数错误") - data = {"results": object_serializer(current_page, many=True).data, "previous_page": None, "next_page": None} + data = {"results": object_serializer(current_page, many=True).data, + "previous_page": None, + "next_page": None, + "count": paginator.count, + "total_page": paginator.num_pages} try: data["previous_page"] = current_page.previous_page_number() @@ -82,4 +86,4 @@ def paginate(request, query_set, object_serializer): except Exception: pass - return success_response(data) \ No newline at end of file + return success_response(data) diff --git a/utils/tests.py b/utils/tests.py index 519870ce..31e2f11f 100644 --- a/utils/tests.py +++ b/utils/tests.py @@ -51,14 +51,18 @@ class PaginatorTest(APITestCase): self.assertEqual(response.data, {"code": 1, "data": u"参数错误"}) def test_correct_paginate(self): - response = self.client.get(self.url + "?paging=true&limit=1&page_size=1&page=1") + response = self.client.get(self.url + "?paging=true&page_size=1&page=1") self.assertEqual(response.data["code"], 0) self.assertEqual(response.data["data"]["previous_page"], None) self.assertEqual(response.data["data"]["next_page"], 2) self.assertEqual(len(response.data["data"]["results"]), 1) + self.assertEqual(response.data["data"]["count"], 2) + self.assertEqual(response.data["data"]["total_page"], 2) - response = self.client.get(self.url + "?paging=true&limit=1&page_size=2&page=1") + response = self.client.get(self.url + "?paging=true&page_size=2&page=1") self.assertEqual(response.data["code"], 0) self.assertEqual(response.data["data"]["previous_page"], None) self.assertEqual(response.data["data"]["next_page"], None) self.assertEqual(len(response.data["data"]["results"]), 2) + self.assertEqual(response.data["data"]["count"], 2) + self.assertEqual(response.data["data"]["total_page"], 1) From 47e63d5c73eba57c3d92f1ada961db3c2731feac Mon Sep 17 00:00:00 2001 From: sxw Date: Sat, 8 Aug 2015 08:46:54 +0800 Subject: [PATCH 4/6] =?UTF-8?q?=E5=B9=B6=E6=B2=A1=E6=9C=89=E6=94=B9?= =?UTF-8?q?=E5=8A=A8=E3=80=82=E3=80=82=E3=80=82=E3=80=82=20=20=20=20=20[CI?= =?UTF-8?q?=20SKIP]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..12a8c859 --- /dev/null +++ b/.gitignore @@ -0,0 +1,58 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +# C extensions +*.so +# Distribution / packaging +.Python +env/ +bin/ +build/ +develop-eggs/ +dist/ +eggs/ +lib64/ +parts/ +sdist/ +var/ +*.egg-info/ +.installed.cfg +*.egg +# Installer logs +pip-log.txt +pip-delete-this-directory.txt +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage +.cache +nosetests.xml +coverage.xml +# Translations +*.mo +# Mr Developer +.mr.developer.cfg +.project +.pydevproject +# Rope +.ropeproject +.idea/ +# Django stuff: +*.log +*.pot +# Sphinx documentation +docs/_build/ +# Back up file +*~ +#db file +db.db +#vim cache +*swp +*swo +#redis dump +*.rdb +#*.out +db.sqlite3 +.DS_Store +log/ +release/ \ No newline at end of file From 9da071684886928d42f5ddae0d24f24a75a9acce Mon Sep 17 00:00:00 2001 From: sxw Date: Sat, 8 Aug 2015 12:22:47 +0800 Subject: [PATCH 5/6] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dannouncement=20js?= =?UTF-8?q?=E4=B8=AD=E4=BD=9C=E7=94=A8=E5=9F=9F=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../js/app/admin/announcement/announcement.js | 193 +++++++++--------- template/admin/announcement/announcement.html | 6 +- 2 files changed, 100 insertions(+), 99 deletions(-) diff --git a/static/src/js/app/admin/announcement/announcement.js b/static/src/js/app/admin/announcement/announcement.js index 4ffe9f14..f356ac1d 100644 --- a/static/src/js/app/admin/announcement/announcement.js +++ b/static/src/js/app/admin/announcement/announcement.js @@ -1,29 +1,23 @@ require(["jquery", "avalon", "csrf", "bs_alert", "editor", "validation"], function ($, avalon, csrfHeader, bs_alert, editor) { announcementEditor = editor("#editor"); //创建新建公告的内容编辑器 - editAnnouncementEditor = null; + editAnnouncementEditor = editor("#editAnnouncementEditor"); - if (!avalon.vmodels.announcement) // 防止模式重新定义 - { - // avalon:定义模式 announcement - vm = avalon.define({ + avalon.vmodels.announcement = null; + + // avalon:定义模式 announcement + avalon.ready(function () { + var vm = avalon.define({ $id: "announcement", - announcement: [], // 公告列表数据项 - previous_page: 0, // 之前的页数 - next_page: 0, // 之后的页数 - page: 1, // 当前页数 - isEditing: 0, // 正在编辑的公告的ID, 为零说明未在编辑 - page_count: 1, - visableOnly : false, - showOrHide : "仅显示可见", - announcementVisible : true, - changeHiddenState : function () { - if (vm.visableOnly == false) - vm.showOrHide = "显示全部"; - else - vm.showOrHide = "仅显示可见"; - vm.visableOnly =! vm.visableOnly; - getPageData(vm.page); - }, + //通用变量 + announcement: [], // 公告列表数据项 + previous_page: 0, // 之前的页数 + next_page: 0, // 之后的页数 + page: 1, // 当前页数 + isEditing: 0, // 正在编辑的公告的ID, 为零说明未在编辑 + page_count: 1, // 总页数 + visableOnly: false, //仅显示可见公告 + // 编辑 + announcementVisible: 0, getState: function (el) { //获取公告当前状态,显示 if (el.visible) return "可见"; @@ -33,14 +27,14 @@ require(["jquery", "avalon", "csrf", "bs_alert", "editor", "validation"], functi getNext: function (el) { if (!vm.next_page) return; - getPageData(++(vm.page)); + getPageData(vm.page + 1); }, getPrevious: function (el) { if (!vm.previous_page) return; - getPageData(--(vm.page)); + getPageData(vm.page - 1); }, - getBtnClass: function (btn) { + getBtnClass: function (btn) { //上一页/下一页按钮启用禁用逻辑 if (btn) { return vm.next_page ? "btn btn-primary" : "btn btn-primary disabled"; } @@ -49,12 +43,10 @@ require(["jquery", "avalon", "csrf", "bs_alert", "editor", "validation"], functi } }, - enEdit: function (el) { //点击编辑按钮的事件,显示/隐藏编辑区 + enEdit: function (el) { //点击编辑按钮的事件,显示/隐藏编辑区 $("#newTitle").val(el.title); - if (!editAnnouncementEditor) //初始化编辑器 - editAnnouncementEditor = editor("#editAnnouncementEditor"); editAnnouncementEditor.setValue(el.content); - vm.announcementVisible=el.visible; + vm.announcementVisible = el.visible; if (vm.isEditing == el.id) vm.isEditing = 0; else @@ -70,14 +62,20 @@ require(["jquery", "avalon", "csrf", "bs_alert", "editor", "validation"], functi if (content != "") { $.ajax({ //发送修改公告请求 beforeSend: csrfHeader, - url: "/api/announcements/", + url: "/api/admin/announcement/", dataType: "json", method: "put", - data: {id: vm.isEditing, title: title, content: content, visible: vm.announcementVisible}, + data: { + id: vm.isEditing, + title: title, + content: content, + visible: vm.announcementVisible + }, success: function (data) { if (!data.code) { bs_alert("修改成功"); vm.isEditing = 0; + getPageData(1); } else { bs_alert(data.data); @@ -92,76 +90,81 @@ require(["jquery", "avalon", "csrf", "bs_alert", "editor", "validation"], functi bs_alert("公告标题不能为空"); } }); - } - - avalon.scan(); - getPageData(1); //公告列表初始化 - vm.page = 1; - vm.isEditing = 0; - //Ajax get数据 - function getPageData(page) { - var visible = ''; - if (vm.visableOnly == true) - visible = "&visible=true"; - $.ajax({ - beforeSend: csrfHeader, - url: "/api/announcements/?paging=true&page=" + page + "&page_size=10"+visible, - dataType: "json", - method: "get", - success: function (data) { - if (!data.code) { - vm.announcement = data.data.results; - vm.page_count = data.data.total_page; - vm.previous_page = data.data.previous_page; - vm.next_page = data.data.next_page; - } - else { - bs_alert(data.data); - } - } + vm.$watch("visableOnly", function () { + getPageData(1); }); - } - //新建公告表单验证与数据提交 - $("#announcement-form") - .formValidation({ - framework: "bootstrap", - fields: { - title: { - validators: { - notEmpty: { - message: "请填写公告标题" + avalon.scan(); + + getPageData(1); //公告列表初始化 + + //Ajax get数据 + function getPageData(page) { + var visible = ''; + if (vm.visableOnly == true) + visible = "&visible=true"; + $.ajax({ + beforeSend: csrfHeader, + url: "/api/announcements/?paging=true&page=" + page + "&page_size=10" + visible, + dataType: "json", + method: "get", + success: function (data) { + if (!data.code) { + vm.announcement = data.data.results; + vm.page_count = data.data.total_page; + vm.previous_page = data.data.previous_page; + vm.next_page = data.data.next_page; + vm.page = page; + } + else { + bs_alert(data.data); + } + } + }); + } + + //新建公告表单验证与数据提交 + $("#announcement-form") + .formValidation({ + framework: "bootstrap", + fields: { + title: { + validators: { + notEmpty: { + message: "请填写公告标题" + } } } } } - } - ).on('success.form.fv', function (e) { - e.preventDefault(); - var title = $("#title").val(); - var content = announcementEditor.getValue(); - if (content == "") { - bs_alert("请填写公告内容"); - return; - } - $.ajax({ - beforeSend: csrfHeader, - url: "/api/admin/announcement/", - data: {title: title, content: content}, - dataType: "json", - method: "post", - success: function (data) { - if (!data.code) { - bs_alert("提交成功!"); - $("#title").val(""); - announcementEditor.setValue(""); - getPageData(1, function (data) { - }); - } else { - bs_alert(data.data); - } + ).on('success.form.fv', function (e) { + e.preventDefault(); + var title = $("#title").val(); + var content = announcementEditor.getValue(); + if (content == "") { + bs_alert("请填写公告内容"); + return; } - }) - }); + $.ajax({ + beforeSend: csrfHeader, + url: "/api/admin/announcement/", + data: {title: title, content: content}, + dataType: "json", + method: "post", + success: function (data) { + if (!data.code) { + bs_alert("提交成功!"); + $("#title").val(""); + announcementEditor.setValue(""); + getPageData(1, function (data) { + }); + } else { + bs_alert(data.data); + } + } + }) + }); + }); + }); \ No newline at end of file diff --git a/template/admin/announcement/announcement.html b/template/admin/announcement/announcement.html index 4bfd2279..62977f88 100644 --- a/template/admin/announcement/announcement.html +++ b/template/admin/announcement/announcement.html @@ -25,8 +25,7 @@
- - +
页数:{{page}}/{{page_count}}   @@ -36,7 +35,6 @@

编辑公告

-
@@ -44,7 +42,7 @@
- +
From 31bb8590adfa8c7df11042ab2c3d46efa2ff3c4d Mon Sep 17 00:00:00 2001 From: sxw Date: Sat, 8 Aug 2015 12:23:01 +0800 Subject: [PATCH 6/6] =?UTF-8?q?=E5=88=9B=E5=BB=BAaccount=E7=9A=84=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=BA=93migration?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- account/migrations/0001_initial.py | 39 ++++++++++++++++++++++++++++++ account/migrations/__init__.py | 0 2 files changed, 39 insertions(+) create mode 100644 account/migrations/0001_initial.py create mode 100644 account/migrations/__init__.py diff --git a/account/migrations/0001_initial.py b/account/migrations/0001_initial.py new file mode 100644 index 00000000..03d55846 --- /dev/null +++ b/account/migrations/0001_initial.py @@ -0,0 +1,39 @@ +# -*- 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)), + ], + ), + ] diff --git a/account/migrations/__init__.py b/account/migrations/__init__.py new file mode 100644 index 00000000..e69de29b