diff --git a/problem/serizalizers.py b/problem/serizalizers.py index d7a18568..d53b2bb9 100644 --- a/problem/serizalizers.py +++ b/problem/serizalizers.py @@ -33,8 +33,14 @@ class CreateProblemSerializer(serializers.Serializer): hint = serializers.CharField(max_length=3000, required=False, default=None) +class ProblemTagSerializer(serializers.ModelSerializer): + class Meta: + model = ProblemTag + + class ProblemSerializer(serializers.ModelSerializer): samples = JSONField() + tags = ProblemTagSerializer(many=True) class UserSerializer(serializers.ModelSerializer): class Meta: @@ -58,17 +64,11 @@ class EditProblemSerializer(serializers.Serializer): time_limit = serializers.IntegerField() memory_limit = serializers.IntegerField() difficulty = serializers.IntegerField() - tags = serializers.ListField(child=serializers.IntegerField()) + tags = serializers.ListField(child=serializers.CharField(max_length=20)) samples = ProblemSampleSerializer() hint = serializers.CharField(max_length=10000) visible = serializers.BooleanField() - -class ProblemTagSerializer(serializers.ModelSerializer): - class Meta: - model = ProblemTag - - class CreateProblemTagSerializer(serializers.Serializer): name = serializers.CharField(max_length=10) diff --git a/problem/views.py b/problem/views.py index 0730502a..4560ffc4 100644 --- a/problem/views.py +++ b/problem/views.py @@ -60,6 +60,7 @@ class ProblemAdminAPIView(APIView): serializer = CreateProblemSerializer(data=request.data) if serializer.is_valid(): data = serializer.data + print data problem = Problem.objects.create(title=data["title"], description=data["description"], input_description=data["input_description"], @@ -114,20 +115,30 @@ class ProblemAdminAPIView(APIView): # 删除原有的标签的对应关系 problem.tags.remove(*problem.tags.all()) # 重新添加所有的标签 - problem.tags.add(*ProblemTag.objects.filter(id__in=data["tags"])) + for tag in data["tags"]: + try: + tag = ProblemTag.objects.get(name=tag) + except ProblemTag.DoesNotExist: + tag = ProblemTag.objects.create(name=tag) + problem.tags.add(tag) problem.save() return success_response(ProblemSerializer(problem).data) else: return serializer_invalid_response(serializer) - -class ProblemAPIView(APIView): def get(self, request): """ 题目分页json api接口 --- response_serializer: ProblemSerializer """ + problem_id = request.GET.get("problem_id", None) + if problem_id: + try: + problem = Problem.objects.get(id=problem_id) + return success_response(ProblemSerializer(problem).data) + except Problem.DoesNotExist: + return error_response(u"题目不存在") problem = Problem.objects.all().order_by("-last_update_time") visible = request.GET.get("visible", None) if visible: @@ -209,8 +220,7 @@ class TestCaseUploadAPIView(APIView): file_info["test_cases"][str(i + 1)] = {"input_name": str(i + 1) + ".in", "output_name": str(i + 1) + ".out", "output_md5": md5.hexdigest(), - "output_size": os.path.getsize( - test_case_dir + str(i + 1) + ".out")} + "output_size": os.path.getsize(test_case_dir + str(i + 1) + ".out")} # 写入配置文件 open(test_case_dir + "info", "w").write(json.dumps(file_info)) @@ -222,12 +232,28 @@ class TestCaseUploadAPIView(APIView): def problem_list_page(request, page=1): + # 正常情况 problems = Problem.objects.all() + + # 搜索的情况 + keyword = request.GET.get("keyword", None) + if keyword: + problems = problems.filter(title__contains=keyword) + + # 按照标签筛选 + tag_text = request.GET.get("tag", None) + if tag_text: + try: + tag = ProblemTag.objects.get(name=tag_text) + except ProblemTag.DoesNotExist: + return error_page(request, u"标签不存在") + problems = tag.problem_set.all() + paginator = Paginator(problems, 20) try: current_page = paginator.page(int(page)) except Exception: - return error_response(u"不存在的页码") + return error_page(request, u"不存在的页码") previous_page = next_page = None @@ -241,5 +267,7 @@ def problem_list_page(request, page=1): except Exception: pass - return render(request, "oj/problem/problem_list.html", {"problems": current_page, "page": int(page), - "previous_page": previous_page, "next_page": next_page}) + return render(request, "oj/problem/problem_list.html", + {"problems": current_page, "page": int(page), + "previous_page": previous_page, "next_page": next_page, + "keyword": keyword, "tag": tag_text}) diff --git a/static/src/css/admin.css b/static/src/css/admin.css index b9fc4cb7..9eb4f9ca 100644 --- a/static/src/css/admin.css +++ b/static/src/css/admin.css @@ -32,4 +32,9 @@ .pie-chart-container{ width: 50%; float: left; +} + +.tag-editor{ + border: 1px solid #d9d9d9; + border-top-color: silver; } \ No newline at end of file diff --git a/static/src/css/global.css b/static/src/css/global.css index 17826003..1d7dc5b1 100644 --- a/static/src/css/global.css +++ b/static/src/css/global.css @@ -28,4 +28,8 @@ label { [ms-controller] { display: none +} + +.right{ + float: right; } \ No newline at end of file diff --git a/static/src/js/app/admin/admin.js b/static/src/js/app/admin/admin.js index 4584d9a9..80ba2d98 100644 --- a/static/src/js/app/admin/admin.js +++ b/static/src/js/app/admin/admin.js @@ -24,17 +24,23 @@ define("admin", ["jquery", "avalon"], function ($, avalon) { var vm = avalon.define({ $id: "admin", template_url: "template/" + hash + ".html", - group_id: -1, + groupId: -1, + problemId: -1, hide_loading: function () { $("#loading-gif").hide(); } }); - vm.$watch("showGroupDetailPage", function(group_id){ - vm.group_id = group_id; + vm.$watch("showGroupDetailPage", function(groupId){ + vm.groupId = groupId; vm.template_url = "template/group/group_detail.html"; }); + vm.$watch("showEditProblemPage", function(problemId){ + vm.problemId = problemId; + vm.template_url = "template/problem/edit_problem.html"; + }); + avalon.scan(); li_active("#li-" + hash.replace("/", "-")); diff --git a/static/src/js/app/admin/announcement/announcement.js b/static/src/js/app/admin/announcement/announcement.js index 2614a558..13db2920 100644 --- a/static/src/js/app/admin/announcement/announcement.js +++ b/static/src/js/app/admin/announcement/announcement.js @@ -1,171 +1,166 @@ -require(["jquery", "avalon", "csrf", "bs_alert", "editor", "validation"], function ($, avalon, csrfHeader, bs_alert, editor) { +require(["jquery", "avalon", "csrfToken", "bsAlert", "editor", "formValidation"], + function ($, avalon, csrfTokenHeader, bsAlert, editor) { - avalon.vmodels.announcement = null; - // avalon:定义模式 announcement - avalon.ready(function () { - var announcementEditor = editor("#editor"); //创建新建公告的内容编辑器 - var editAnnouncementEditor = editor("#editAnnouncementEditor"); + avalon.ready(function () { + avalon.vmodels.announcement = null; - var vm = avalon.define({ - $id: "announcement", - //通用变量 - 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 "可见"; - else - return "隐藏"; - }, - getNext: function () { - if (!vm.next_page) - return; - getPageData(vm.page + 1); - }, - getPrevious: function () { - if (!vm.previous_page) - return; - getPageData(vm.page - 1); - }, - getBtnClass: function (btn) { //上一页/下一页按钮启用禁用逻辑 - if (btn) { - return vm.next_page ? "btn btn-primary" : "btn btn-primary disabled"; - } - else { - return vm.previous_page ? "btn btn-primary" : "btn btn-primary disabled"; - } + var createAnnouncementEditor = editor("#create-announcement-editor"); + var editAnnouncementEditor = editor("#edit-announcement-editor"); - }, - enEdit: function (el) { //点击编辑按钮的事件,显示/隐藏编辑区 - $("#newTitle").val(el.title); - editAnnouncementEditor.setValue(el.content); - vm.announcementVisible = el.visible; - if (vm.isEditing == el.id) - vm.isEditing = 0; - else - vm.isEditing = el.id; - editAnnouncementEditor.focus(); - }, - disEdit: function () { //收起编辑框 - vm.isEditing = 0; - }, - submitChange: function () { // 处理编辑公告提交事件,顺便验证字段为空 - var title = $("#newTitle").val(), content = editAnnouncementEditor.getValue(); - if (title != "") { - if (content != "") { - $.ajax({ //发送修改公告请求 - beforeSend: csrfHeader, + var vm = avalon.define({ + $id: "announcement", + //通用变量 + announcementList: [], // 公告列表数据项 + previousPage: 0, // 之前的页数 + nextPage: 0, // 之后的页数 + page: 1, // 当前页数 + editingAnnouncementId: 0, // 正在编辑的公告的ID, 为零说明未在编辑 + totalPage: 1, // 总页数 + showVisibleOnly: false, //仅显示可见公告 + // 编辑 + announcementVisible: 0, + getState: function (el) { //获取公告当前状态,显示 + if (el.visible) + return "可见"; + else + return "隐藏"; + }, + getNext: function () { + if (!vm.nextPage) + return; + getPageData(vm.page + 1); + }, + getPrevious: function () { + if (!vm.previousPage) + return; + getPageData(vm.page - 1); + }, + getBtnClass: function (btnType) { + if (btnType == "next") { + return vm.nextPage ? "btn btn-primary" : "btn btn-primary disabled"; + } + else { + return vm.previousPage ? "btn btn-primary" : "btn btn-primary disabled"; + } + + }, + editAnnouncement: function (announcement) { + $("#newTitle").val(announcement.title); + editAnnouncementEditor.setValue(announcement.content); + vm.announcementVisible = announcement.visible; + if (vm.editingAnnouncementId == announcement.id) + vm.editingAnnouncementId = 0; + else + vm.editingAnnouncementId = announcement.id; + editAnnouncementEditor.focus(); + }, + cancelEdit: function () { + vm.editingAnnouncementId = 0; + }, + submitChange: function () { + var title = $("#newTitle").val(); + var content = editAnnouncementEditor.getValue(); + + if (content && title) { + $.ajax({ + beforeSend: csrfTokenHeader, url: "/api/admin/announcement/", dataType: "json", method: "put", data: { - id: vm.isEditing, + id: vm.editingAnnouncementId, title: title, content: content, visible: vm.announcementVisible }, success: function (data) { if (!data.code) { - bs_alert("修改成功"); - vm.isEditing = 0; + bsAlert("修改成功"); + vm.editingAnnouncementId = 0; getPageData(1); } else { - bs_alert(data.data); + bsAlert(data.data); } } }); } - else - bs_alert("公告内容不得为空"); - } - else - bs_alert("公告标题不能为空"); - } - }); - vm.$watch("visableOnly", function () { - getPageData(1); - }); - - 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); + bsAlert("标题和公告内容不得为空"); } } }); - } + vm.$watch("showVisibleOnly", function () { + getPageData(1); + }); - //新建公告表单验证与数据提交 - $("#announcement-form") - .formValidation({ - framework: "bootstrap", - fields: { - title: { - validators: { - notEmpty: { - message: "请填写公告标题" + getPageData(1); + + function getPageData(page) { + var url = "/api/announcements/?paging=true&page=" + page + "&page_size=10"; + if (vm.showVisibleOnly) + url += "&visible=true"; + $.ajax({ + url: url, + dataType: "json", + method: "get", + success: function (data) { + if (!data.code) { + vm.announcementList = data.data.results; + vm.totalPage = data.data.total_page; + vm.previousPage = data.data.previous_page; + vm.nextPage = 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); - } else { - bs_alert(data.data); - } + ).on('success.form.fv', function (e) { + e.preventDefault(); + var title = $("#title").val(); + var content = createAnnouncementEditor.getValue(); + if (content == "") { + bsAlert("请填写公告内容"); + return; } - }) - }); - }); - - -}); \ No newline at end of file + $.ajax({ + beforeSend: csrfTokenHeader, + url: "/api/admin/announcement/", + data: {title: title, content: content}, + dataType: "json", + method: "post", + success: function (data) { + if (!data.code) { + bsAlert("提交成功!"); + $("#title").val(""); + createAnnouncementEditor.setValue(""); + getPageData(1); + } else { + bs_alert(data.data); + } + } + }) + }); + }); + avalon.scan(); + }); \ No newline at end of file diff --git a/static/src/js/app/admin/group/group.js b/static/src/js/app/admin/group/group.js index 9ba1ed88..4ff6ba40 100644 --- a/static/src/js/app/admin/group/group.js +++ b/static/src/js/app/admin/group/group.js @@ -1,73 +1,74 @@ -require(["jquery", "avalon", "csrf", "bs_alert", "validation"], function ($, avalon, csrfHeader, bs_alert) { - avalon.vmodels.group = null; +require(["jquery", "avalon", "csrfToken", "bsAlert", "formValidation"], function ($, avalon, csrfTokenHeader, bsAlert) { + - // avalon:定义模式 group_list avalon.ready(function () { + avalon.vmodels.group = null; var vm = avalon.define({ $id: "group", //通用变量 - group_list: [], // 用户列表数据项 - previous_page: 0, // 之前的页数 - next_page: 0, // 之后的页数 + groupList: [], // 用户列表数据项 + previousPage: 0, // 之前的页数 + nextPage: 0, // 之后的页数 page: 1, // 当前页数 - page_count: 1, // 总页数 + totalPage: 1, // 总页数 keyword: "", getNext: function () { - if (!vm.next_page) + if (!vm.nextPage) return; getPageData(vm.page + 1); }, getPrevious: function () { - if (!vm.previous_page) + if (!vm.previousPage) return; getPageData(vm.page - 1); }, - getBtnClass: function (btn) { //上一页/下一页按钮启用禁用逻辑 - if (btn) { - return vm.next_page ? "btn btn-primary" : "btn btn-primary disabled"; + getBtnClass: function (btnType) { + if (btnType == "next") { + return vm.nextPage ? "btn btn-primary" : "btn btn-primary disabled"; } else { - return vm.previous_page ? "btn btn-primary" : "btn btn-primary disabled"; + return vm.previousPage ? "btn btn-primary" : "btn btn-primary disabled"; } + }, - getPage: function (page_index) { - getPageData(page_index); + search: function(){ + getPageData(1); }, - getGroupSettingString: function(setting){ + getGroupSettingString: function (setting) { return {0: "允许任何人加入", 1: "提交请求后管理员审核", 2: "不允许任何人加入"}[setting] }, - showGroupDetailPage: function(group_id){ - vm.$fire("up!showGroupDetailPage", group_id); + showGroupDetailPage: function (groupId) { + vm.$fire("up!showGroupDetailPage", groupId); } }); + getPageData(1); - avalon.scan(); - getPageData(1); //用户列表初始化 - //Ajax get数据 function getPageData(page) { var url = "/api/admin/group/?paging=true&page=" + page + "&page_size=10"; - if (vm.keyword != "") + if (vm.keyword) url += "&keyword=" + vm.keyword; $.ajax({ - beforeSend: csrfHeader, url: url, dataType: "json", method: "get", success: function (data) { if (!data.code) { - vm.group_list = 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.groupList = data.data.results; + vm.totalPage = data.data.total_page; + vm.previousPage = data.data.previous_page; + vm.nextPage = data.data.next_page; vm.page = page; } else { - bs_alert(data.data); + bsAlert(data.data); } } }); } + }); + avalon.scan(); + }); \ No newline at end of file diff --git a/static/src/js/app/admin/group/group_detail.js b/static/src/js/app/admin/group/groupDetail.js similarity index 50% rename from static/src/js/app/admin/group/group_detail.js rename to static/src/js/app/admin/group/groupDetail.js index e946ba22..8dd0202c 100644 --- a/static/src/js/app/admin/group/group_detail.js +++ b/static/src/js/app/admin/group/groupDetail.js @@ -1,51 +1,50 @@ -require(["jquery", "avalon", "csrf", "bs_alert", "validation"], function ($, avalon, csrfHeader, bs_alert) { - avalon.vmodels.group_detail = null; +require(["jquery", "avalon", "csrfToken", "bsAlert", "formValidation"], function ($, avalon, csrfTokenHeader, bsAlert) { + // avalon:定义模式 group_list avalon.ready(function () { + avalon.vmodels.groupDetail = null; var vm = avalon.define({ - $id: "group_detail", + $id: "groupDetail", //通用变量 - member_list: [], - previous_page: 0, - next_page: 0, + memberList: [], + previousPage: 0, + nextPage: 0, page: 1, - page_count: 1, + totalPage: 1, name: "", description: "", - checked_setting: "0", + checkedSetting: "0", getNext: function () { - if (!vm.next_page) + if (!vm.nextPage) return; getPageData(vm.page + 1); }, getPrevious: function () { - if (!vm.previous_page) + if (!vm.previousPage) return; getPageData(vm.page - 1); }, getBtnClass: function (btn) { - if (btn) { - return vm.next_page ? "btn btn-primary" : "btn btn-primary disabled"; + if (btn == "next") { + return vm.nextPage ? "btn btn-primary" : "btn btn-primary disabled"; } else { - return vm.previous_page ? "btn btn-primary" : "btn btn-primary disabled"; + return vm.previousPage ? "btn btn-primary" : "btn btn-primary disabled"; } }, - getPage: function (page_index) { - getPageData(page_index); - }, + removeMember: function (relation) { $.ajax({ - beforeSend: csrfHeader, + beforeSend: csrfTokenHeader, url: "/api/admin/group_member/", method: "put", data: JSON.stringify({group_id: relation.group, members: [relation.user.id]}), contentType: "application/json", success: function (data) { - vm.member_list.remove(relation); - bs_alert(data.data); + vm.memberList.remove(relation); + bsAlert(data.data); } }) } @@ -55,90 +54,90 @@ require(["jquery", "avalon", "csrf", "bs_alert", "validation"], function ($, ava getPageData(1); function getPageData(page) { var url = "/api/admin/group_member/?paging=true&page=" + page + - "&page_size=10&group_id=" + avalon.vmodels.admin.group_id; + "&page_size=10&group_id=" + avalon.vmodels.admin.groupId; $.ajax({ url: url, dataType: "json", method: "get", success: function (data) { if (!data.code) { - vm.member_list = 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.memberList = data.data.results; + vm.totalPage = data.data.total_page; + vm.previousPage = data.data.previous_page; + vm.nextPage = data.data.next_page; vm.page = page; } else { - bs_alert(data.data); + bsAlert(data.data); } } }); } $.ajax({ - url: "/api/admin/group/?group_id=" + avalon.vmodels.admin.group_id, + url: "/api/admin/group/?group_id=" + avalon.vmodels.admin.groupId, method: "get", dataType: "json", success: function (data) { if (!data.code) { vm.name = data.data.name; vm.description = data.data.description; - vm.checked_setting = data.data.join_group_setting.toString(); + vm.checkedSetting = data.data.join_group_setting.toString(); } else { - bs_alert(data.data); + bsAlert(data.data); } } - }) + }); $("#edit_group_form") - .formValidation({ - framework: "bootstrap", - fields: { - name: { - validators: { - notEmpty: { - message: "请填写小组名" - }, - stringLength: { - max: 20, - message: '小组名长度必须在20位之内' - } + .formValidation({ + framework: "bootstrap", + fields: { + name: { + validators: { + notEmpty: { + message: "请填写小组名" + }, + stringLength: { + max: 20, + message: '小组名长度必须在20位之内' } - }, - description: { - validators: { - notEmpty: { - message: "请填写描述" - }, - stringLength: { - max: 300, - message: '描述长度必须在300位之内' - } + } + }, + description: { + validators: { + notEmpty: { + message: "请填写描述" + }, + stringLength: { + max: 300, + message: '描述长度必须在300位之内' } } } } - ).on('success.form.fv', function (e) { + } + ).on('success.form.fv', function (e) { e.preventDefault(); var data = { - group_id: avalon.vmodels.admin.group_id, + group_id: avalon.vmodels.admin.groupId, name: vm.name, description: vm.description, - join_group_setting: vm.checked_setting + join_group_setting: vm.checkedSetting }; $.ajax({ - beforeSend: csrfHeader, + beforeSend: csrfTokenHeader, url: "/api/admin/group/", method: "put", data: data, dataType: "json", success: function (data) { if (!data.code) { - bs_alert("修改成功"); + bsAlert("修改成功"); } else { - bs_alert(data.data); + bsAlert(data.data); } } }) diff --git a/static/src/js/app/admin/group/join_group_request_list.js b/static/src/js/app/admin/group/joinGroupRequestList.js similarity index 74% rename from static/src/js/app/admin/group/join_group_request_list.js rename to static/src/js/app/admin/group/joinGroupRequestList.js index 8bf2caab..e565aad7 100644 --- a/static/src/js/app/admin/group/join_group_request_list.js +++ b/static/src/js/app/admin/group/joinGroupRequestList.js @@ -1,46 +1,47 @@ -require(["jquery", "avalon", "csrf", "bs_alert", "validation"], function ($, avalon, csrfHeader, bs_alert) { - avalon.vmodels.request_list = null; +require(["jquery", "avalon", "csrfToken", "bsAlert", "formValidation"], function ($, avalon, csrfTokenHeader, bsAlert) { // avalon:定义模式 group_list avalon.ready(function () { + avalon.vmodels.requestList = null; var vm = avalon.define({ - $id: "request_list", + $id: "requestList", //通用变量 - request_list: [], // 列表数据项 - previous_page: 0, // 之前的页数 - next_page: 0, // 之后的页数 + requestList: [], // 列表数据项 + previousPage: 0, // 之前的页数 + nextPage: 0, // 之后的页数 page: 1, // 当前页数 - page_count: 1, // 总页数 + totalPage: 1, // 总页数 getNext: function () { - if (!vm.next_page) + if (!vm.nextPage) return; getPageData(vm.page + 1); }, getPrevious: function () { - if (!vm.previous_page) + if (!vm.previousPage) return; getPageData(vm.page - 1); }, getBtnClass: function (btn) { //上一页/下一页按钮启用禁用逻辑 - if (btn) { - return vm.next_page ? "btn btn-primary" : "btn btn-primary disabled"; + if (btn == "next") { + return vm.nextPage ? "btn btn-primary" : "btn btn-primary disabled"; } else { - return vm.previous_page ? "btn btn-primary" : "btn btn-primary disabled"; + return vm.previousPage ? "btn btn-primary" : "btn btn-primary disabled"; } }, getPage: function (page_index) { getPageData(page_index); }, - processRequest: function(request_id, status){ + processRequest: function(request, status){ $.ajax({ - beforeSend: csrfHeader, + beforeSend: csrfTokenHeader, url: "/api/admin/join_group_request/", method: "put", - data: {request_id: request_id, status: status}, + data: {request_id: request.id, status: status}, success: function(data){ - bs_alert(data.data); + vm.requestList.remove(request); + bsAlert(data.data); } }) } @@ -52,20 +53,20 @@ require(["jquery", "avalon", "csrf", "bs_alert", "validation"], function ($, ava function getPageData(page) { var url = "/api/admin/join_group_request/?paging=true&page=" + page + "&page_size=10"; $.ajax({ - beforeSend: csrfHeader, + beforeSend: csrfTokenHeader, url: url, dataType: "json", method: "get", success: function (data) { if (!data.code) { - vm.request_list = 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.requestList = data.data.results; + vm.totalPage = data.data.total_page; + vm.previousPage = data.data.previous_page; + vm.nextPage = data.data.next_page; vm.page = page; } else { - bs_alert(data.data); + bsAlert(data.data); } } }); @@ -134,11 +135,11 @@ require(["jquery", "avalon", "csrf", "bs_alert", "validation"], function ($, ava method: "put", success: function (data) { if (!data.code) { - bs_alert("提交成功!"); + bsAlert("提交成功!"); getPageData(1); $("#password").val(""); } else { - bs_alert(data.data); + bsAlert(data.data); } } }) diff --git a/static/src/js/app/admin/problem/add_problem.js b/static/src/js/app/admin/problem/add_problem.js index ebb661ed..40f74da9 100644 --- a/static/src/js/app/admin/problem/add_problem.js +++ b/static/src/js/app/admin/problem/add_problem.js @@ -1,219 +1,218 @@ -require(["jquery", "avalon", "editor", "uploader", "bs_alert", "csrf", "tagEditor", "validation", "jqueryUI"], - function ($, avalon, editor, uploader, bs_alert, csrfHeader) { - avalon.vmodels.add_problem = null; - $("#add-problem-form") - .formValidation({ - framework: "bootstrap", - fields: { - title: { - validators: { - notEmpty: { - message: "请填写题目名称" - }, - stringLength: { - min: 1, - max: 30, - message: "名称不能超过30个字" +require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "tagEditor", "formValidation", "jqueryUI"], + function ($, avalon, editor, uploader, bsAlert, csrfTokenHeader) { + avalon.ready(function () { + avalon.vmodels.addProblem = null; + $("#add-problem-form") + .formValidation({ + framework: "bootstrap", + fields: { + title: { + validators: { + notEmpty: { + message: "请填写题目名称" + }, + stringLength: { + min: 1, + max: 30, + message: "名称不能超过30个字" + } } - } - }, - cpu: { - validators: { - notEmpty: { - message: "请输入时间限制" - }, - integer: { - message: "请输入一个合法的数字" - }, - between: { - inclusive: true, - min: 1, - max: 5000, - message: "只能在1-5000之间" + }, + cpu: { + validators: { + notEmpty: { + message: "请输入时间限制" + }, + integer: { + message: "请输入一个合法的数字" + }, + between: { + inclusive: true, + min: 1, + max: 5000, + message: "只能在1-5000之间" + } } - } - }, - memory: { - validators: { - notEmpty: { - message: "请输入内存限制" - }, - integer: { - message: "请输入一个合法的数字" + }, + memory: { + validators: { + notEmpty: { + message: "请输入内存限制" + }, + integer: { + message: "请输入一个合法的数字" + } } - } - }, - difficulty: { - validators: { - notEmpty: { - message: "请输入难度" - }, - integer: { - message: "难度用一个整数表示" + }, + difficulty: { + validators: { + notEmpty: { + message: "请输入难度" + }, + integer: { + message: "难度用一个整数表示" + } } - } - }, - input_description: { - validators: { - notEmpty: { - message: "请填写输入描述" + }, + input_description: { + validators: { + notEmpty: { + message: "请填写输入描述" + } } - } - }, - output_description: { - validators: { - notEmpty: { - message: "请填写输出描述" + }, + output_description: { + validators: { + notEmpty: { + message: "请填写输出描述" + } } } } - } - }) - .on("success.form.fv", function (e) { - e.preventDefault(); - if (vm.test_case_id == '') { - bs_alert("你还没有上传测试数据!"); - return; - } - if (vm.description == '') { - bs_alert("题目描述不能为空!"); - return; - } - var ajaxData = { - title: vm.title, - description: vm.description, - time_limit: vm.cpu, - memory_limit: vm.memory, - samples: [], - test_case_id: vm.test_case_id, - hint: vm.hint, - source: vm.source, - tags: $("#tags").tagEditor("getTags")[0].tags, - input_description: vm.input_description, - output_description: vm.output_description, - difficulty: vm.difficulty - }; - if (vm.samples.length == 0) { - bs_alert("请至少添加一组样例!"); - return; - } - - for(var i = 0; i < vm.samples.length; i++){ - if (vm.samples[i].input == "" || vm.samples[i].output == ""){ - bs_alert("样例输入与样例输出不能为空!"); - return; - } - } - - if (tags.length == 0) { - bs_alert("请至少添加一个标签,这将有利于用户发现你的题目!"); - return; - } - - for (var i = 0; i < vm.samples.$model.length; i++) { - ajaxData.samples.push({input: vm.samples.$model[i].input, output: vm.samples.$model[i].output}); - } - - $.ajax({ - beforeSend: csrfHeader, - url: "/api/admin/problem/", - dataType: "json", - data: JSON.stringify(ajaxData), - method: "post", - contentType: "application/json", - success: function (data) { - if (!data.code) { - bs_alert("successful!"); - console.log(data); - } - else { - bs_alert(data.data); - } - } - }) - }); - var problemDiscription = editor("#problemDescription"); - var testCaseUploader = uploader("#testCaseFile", "/api/admin/test_case_upload/", function (file, respond) { - if (respond.code) - bs_alert(respond.data); - else { - vm.test_case_id = respond.data.test_case_id; - vm.uploadSuccess = true; - vm.testCaseList = []; - for (var i = 0; i < respond.data.file_list.input.length; i++) { - vm.testCaseList.push({ - input: respond.data.file_list.input[i], - output: respond.data.file_list.output[i] - }); - - } - bs_alert("测试数据添加成功!共添加"+vm.testCaseList.length +"组测试数据"); - } - }); - var hinteditor = editor("#hint"); - var tagList = [], completeList = []; - var vm = avalon.define({ - $id: "add_problem", - title: "", - description: "", - cpu: 1000, - memory: 256, - samples: [{input: "", output: "", "visible": true}], - hint: "", - visible: true, - difficulty: 0, - tags: [], - tag: "", - input_description: "", - output_description: "", - test_case_id: "", - testCaseList: [], - uploadSuccess: false, - source: "", - add_sample: function () { - vm.samples.push({input: "", output: "", "visible": true}); - }, - del_sample: function (sample) { - if (confirm("你确定要删除么?")) { - vm.samples.remove(sample); - } - }, - toggle_sample: function (sample) { - sample.visible = !sample.visible; - }, - getBtnContent: function (item) { - if (item.visible) - return "折叠"; - return "展开"; - } - }); - - $.ajax({ - beforeSend: csrfHeader, - url: "/api/admin/tag/", - dataType: "json", - method: "get", - success: function (data) { - if (!data.code) { - tagList = data.data; - completeList = []; - for (var i = 0; i < tagList.length; i++) { - completeList.push(tagList[i].name); + .on("success.form.fv", function (e) { + e.preventDefault(); + if (vm.testCaseId == "") { + bsAlert("你还没有上传测试数据!"); + return; } - $("#tags").tagEditor({ - autocomplete: { - delay: 0, // show suggestions immediately - position: {collision: 'flip'}, // automatic menu position up/down - source: completeList + if (vm.description == "") { + bsAlert("题目描述不能为空!"); + return; + } + if (vm.samples.length == 0) { + bsAlert("请至少添加一组样例!"); + return; + } + for (var i = 0; i < vm.samples.length; i++) { + if (vm.samples[i].input == "" || vm.samples[i].output == "") { + bsAlert("样例输入与样例输出不能为空!"); + return; } - }); - } - else { - bs_alert(data.data); - } - } + } + if (tags.length == 0) { + bsAlert("请至少添加一个标签,这将有利于用户发现你的题目!"); + return; + } + var ajaxData = { + title: vm.title, + description: vm.description, + time_limit: vm.timeLimit, + memory_limit: vm.memoryLimit, + samples: [], + test_case_id: vm.testCaseId, + hint: vm.hint, + source: vm.source, + tags: $("#tags").tagEditor("getTags")[0].tags, + input_description: vm.inputDescription, + output_description: vm.outputDescription, + difficulty: vm.difficulty + }; + for (var i = 0; i < vm.samples.$model.length; i++) { + ajaxData.samples.push({input: vm.samples.$model[i].input, output: vm.samples.$model[i].output}); + } + + $.ajax({ + beforeSend: csrfTokenHeader, + url: "/api/admin/problem/", + dataType: "json", + data: JSON.stringify(ajaxData), + method: "post", + contentType: "application/json", + success: function (data) { + if (!data.code) { + bsAlert("题目添加成功!"); + } + else { + bsAlert(data.data); + } + } + + }) + }); + + var testCaseUploader = uploader("#testCaseFile", "/api/admin/test_case_upload/", function (file, response) { + if (response.code) + bsAlert(response.data); + else { + vm.testCaseId = response.data.test_case_id; + vm.uploadSuccess = true; + vm.testCaseList = []; + for (var i = 0; i < response.data.file_list.input.length; i++) { + vm.testCaseList.push({ + input: response.data.file_list.input[i], + output: response.data.file_list.output[i] + }); + } + bsAlert("测试数据添加成功!共添加" + vm.testCaseList.length + "组测试数据"); + } + }); + + var hintEditor = editor("#hint"); + var problemDescription = editor("#problemDescription"); + + var vm = avalon.define({ + $id: "addProblem", + title: "", + description: "", + cpu: 1000, + memory: 256, + samples: [{input: "", output: "", "visible": true}], + hint: "", + visible: true, + difficulty: 0, + tags: [], + inputDescription: "", + outputDescription: "", + testCaseId: "", + testCaseList: [], + uploadSuccess: false, + source: "", + addSample: function () { + vm.samples.push({input: "", output: "", "visible": true}); + }, + delSample: function (sample) { + if (confirm("你确定要删除么?")) { + vm.samples.remove(sample); + } + }, + toggleSample: function (sample) { + sample.visible = !sample.visible; + }, + getBtnContent: function (item) { + if (item.visible) + return "折叠"; + return "展开"; + } + }); + + var tagAutoCompleteList = []; + + $.ajax({ + beforeSend: csrfTokenHeader, + url: "/api/admin/tag/", + dataType: "json", + method: "get", + success: function (data) { + if (!data.code) { + for (var i = 0; i < data.data.length; i++) { + tagAutoCompleteList.push(data.data[i].name); + } + $("#tags").tagEditor({ + autocomplete: { + delay: 0, // show suggestions immediately + position: {collision: 'flip'}, // automatic menu position up/down + source: tagAutoCompleteList + } + }); + } + else { + bsAlert(data.data); + } + } + + }); }); avalon.scan(); }); \ No newline at end of file diff --git a/static/src/js/app/admin/problem/edit_problem.js b/static/src/js/app/admin/problem/edit_problem.js new file mode 100644 index 00000000..75ebbae4 --- /dev/null +++ b/static/src/js/app/admin/problem/edit_problem.js @@ -0,0 +1,257 @@ +require(["jquery", "avalon", "editor", "uploader", "bsAlert", "csrfToken", "tagEditor", "formValidation", "jqueryUI"], + function ($, avalon, editor, uploader, bsAlert, csrfTokenHeader) { + + avalon.ready(function () { + avalon.vmodels.editProblem = null; + + $("#edit-problem-form") + .formValidation({ + framework: "bootstrap", + fields: { + title: { + validators: { + notEmpty: { + message: "请填写题目名称" + }, + stringLength: { + min: 1, + max: 30, + message: "名称不能超过30个字" + } + } + }, + cpu: { + validators: { + notEmpty: { + message: "请输入时间限制" + }, + integer: { + message: "请输入一个合法的数字" + }, + between: { + inclusive: true, + min: 1, + max: 5000, + message: "只能在1-5000之间" + } + } + }, + memory: { + validators: { + notEmpty: { + message: "请输入内存限制" + }, + integer: { + message: "请输入一个合法的数字" + } + } + }, + difficulty: { + validators: { + notEmpty: { + message: "请输入难度" + }, + integer: { + message: "难度用一个整数表示" + } + } + }, + input_description: { + validators: { + notEmpty: { + message: "请填写输入描述" + } + } + }, + output_description: { + validators: { + notEmpty: { + message: "请填写输出描述" + } + } + } + } + }) + .on("success.form.fv", function (e) { + e.preventDefault(); + if (vm.testCaseId == "") { + bsAlert("你还没有上传测试数据!"); + return; + } + if (vm.description == "") { + bsAlert("题目描述不能为空!"); + return; + } + if (vm.samples.length == 0) { + bsAlert("请至少添加一组样例!"); + return; + } + for (var i = 0; i < vm.samples.length; i++) { + if (vm.samples[i].input == "" || vm.samples[i].output == "") { + bsAlert("样例输入与样例输出不能为空!"); + return; + } + } + if (tags.length == 0) { + bsAlert("请至少添加一个标签,这将有利于用户发现你的题目!"); + return; + } + var ajaxData = { + id: avalon.vmodels.admin.problemId, + title: vm.title, + description: vm.description, + time_limit: vm.timeLimit, + memory_limit: vm.memoryLimit, + samples: [], + test_case_id: vm.testCaseId, + hint: vm.hint, + source: vm.source, + visible: vm.visible, + tags: $("#tags").tagEditor("getTags")[0].tags, + input_description: vm.inputDescription, + output_description: vm.outputDescription, + difficulty: vm.difficulty + }; + + for (var i = 0; i < vm.samples.$model.length; i++) { + ajaxData.samples.push({input: vm.samples.$model[i].input, output: vm.samples.$model[i].output}); + } + + $.ajax({ + beforeSend: csrfTokenHeader, + url: "/api/admin/problem/", + dataType: "json", + data: JSON.stringify(ajaxData), + method: "put", + contentType: "application/json", + success: function (data) { + if (!data.code) { + bsAlert("题目编辑成功!"); + } + else { + bsAlert(data.data); + } + } + + }) + }); + + var vm = avalon.define({ + $id: "editProblem", + title: "", + description: "", + timeLimit: -1, + memoryLimit: -1, + samples: [], + hint: "", + visible: true, + difficulty: 0, + inputDescription: "", + outputDescription: "", + testCaseIdd: "", + uploadSuccess: false, + source: "", + testCaseList: [], + addSample: function () { + vm.samples.push({input: "", output: "", "visible": true}); + }, + delSample: function (sample) { + if (confirm("你确定要删除么?")) { + vm.samples.remove(sample); + } + }, + toggleSample: function (sample) { + sample.visible = !sample.visible; + }, + getBtnContent: function (item) { + if (item.visible) + return "折叠"; + return "展开"; + } + }); + var hintEditor = editor("#hint"); + var descriptionEditor = editor("#problemDescription"); + var testCaseUploader = uploader("#testCaseFile", "/api/admin/test_case_upload/", function (file, response) { + if (response.code) + bsAlert(response.data); + else { + vm.testCaseId = response.data.test_case_id; + vm.uploadSuccess = true; + vm.testCaseList = []; + for (var i = 0; i < response.data.file_list.input.length; i++) { + vm.testCaseList.push({ + input: response.data.file_list.input[i], + output: response.data.file_list.output[i] + }); + } + bsAlert("测试数据添加成功!共添加" + vm.testCaseList.length + "组测试数据"); + } + }); + + $.ajax({ + url: "/api/admin/problem/?problem_id=" + avalon.vmodels.admin.problemId, + method: "get", + dataType: "json", + success: function (data) { + if (data.code) { + bsAlert(data.data); + } + else { + var problem = data.data; + console.log(problem); + vm.title = problem.title; + vm.description = problem.description; + vm.timeLimit = problem.time_limit; + vm.memoryLimit = problem.memory_limit; + for (var i = 0; i < problem.samples.length; i++) { + vm.samples.push({ + input: problem.samples[i].input, + output: problem.samples[i].output, + visible: false + }) + } + vm.hint = problem.hint; + vm.visible = problem.visible; + vm.difficulty = problem.difficulty; + vm.inputDescription = problem.input_description; + vm.outputDescription = problem.output_description; + vm.testCaseId = problem.test_case_id; + vm.source = problem.source; + var problemTags = problem.tags; + hintEditor.setValue(vm.hint); + descriptionEditor.setValue(vm.description); + $.ajax({ + url: "/api/admin/tag/", + dataType: "json", + method: "get", + success: function (data) { + if (!data.code) { + var tagAutoCompleteList = [], tags = []; + for (var i = 0; i < data.data.length; i++) { + tagAutoCompleteList.push(data.data[i].name); + } + for (var j = 0; j < problem.tags.length; j++) { + tags.push(problemTags[j].name); + } + $("#tags").tagEditor({ + initialTags: tags, + autocomplete: { + delay: 0, + position: {collision: 'flip'}, + source: tagAutoCompleteList + } + }); + } + else { + bsAlert(data.data); + } + } + + }); + } + } + }); + }); + avalon.scan(); + + }); \ No newline at end of file diff --git a/static/src/js/app/admin/problem/problem.js b/static/src/js/app/admin/problem/problem.js new file mode 100644 index 00000000..4f87b3d6 --- /dev/null +++ b/static/src/js/app/admin/problem/problem.js @@ -0,0 +1,65 @@ +require(["jquery", "avalon", "csrfToken", "bsAlert", "formValidation"], function ($, avalon, csrfTokenHeader, bsAlert) { + + avalon.ready(function () { + avalon.vmodels.problemList = null; + var vm = avalon.define({ + $id: "problemList", + problemList: [], + previousPage: 0, + nextPage: 0, + page: 1, + totalPage: 1, + keyword: "", + getNext: function () { + if (!vm.nextPage) + return; + getPageData(vm.page + 1); + }, + getPrevious: function () { + if (!vm.previousPage) + return; + getPageData(vm.page - 1); + }, + getBtnClass: function (btn) { + if (btn == "next") { + return vm.nextPage ? "btn btn-primary" : "btn btn-primary disabled"; + } + else { + return vm.previousPage ? "btn btn-primary" : "btn btn-primary disabled"; + } + }, + getPage: function (page_index) { + getPageData(page_index); + }, + showEditProblemPage: function (problem_id) { + vm.$fire("up!showEditProblemPage", problem_id); + } + }); + + function getPageData(page) { + var url = "/api/admin/problem/?paging=true&page=" + page + "&page_size=10"; + if (vm.keyword != "") + url += "&keyword=" + vm.keyword; + $.ajax({ + url: url, + dataType: "json", + method: "get", + success: function (data) { + if (!data.code) { + vm.problemList = data.data.results; + vm.totalPage = data.data.total_page; + vm.previousPage = data.data.previous_page; + vm.nextPage = data.data.next_page; + vm.page = page; + } + else { + bsAlert(data.data); + } + } + }); + } + + getPageData(1); + }); + avalon.scan(); +}); \ No newline at end of file diff --git a/static/src/js/app/admin/user/user_list.js b/static/src/js/app/admin/user/userList.js similarity index 63% rename from static/src/js/app/admin/user/user_list.js rename to static/src/js/app/admin/user/userList.js index 1e5f254a..277aa88f 100644 --- a/static/src/js/app/admin/user/user_list.js +++ b/static/src/js/app/admin/user/userList.js @@ -1,59 +1,58 @@ -require(["jquery", "avalon", "csrf", "bs_alert", "validation"], function ($, avalon, csrfHeader, bs_alert) { - avalon.vmodels.user_list = null; +require(["jquery", "avalon", "csrfToken", "bsAlert", "formValidation"], function ($, avalon, csrfTokenHeader, bsAlert) { - // avalon:定义模式 user_list + + // avalon:定义模式 userList avalon.ready(function () { + avalon.vmodels.userList = null; var vm = avalon.define({ - $id: "user_list", + $id: "userList", //通用变量 - user_list: [], // 用户列表数据项 - previous_page: 0, // 之前的页数 - next_page: 0, // 之后的页数 - page: 1, // 当前页数 - isEditing: 0, // 正在编辑的公告的ID, 为零说明未在编辑 - page_count: 1, // 总页数 - user_type: ["一般用户", "管理员", "超级管理员"], - key_word: "", + userList: [], + previousPage: 0, + nextPage: 0, + page: 1, + editingUserId: 0, + totalPage: 1, + userType: ["一般用户", "管理员", "超级管理员"], + keyword: "", showAdminOnly: false, //编辑区域同步变量 username: "", - real_name: "", + realName: "", email: "", - admin_type: 0, + adminType: 0, id: 0, - last_login: "", - create_time: "", getNext: function () { - if (!vm.next_page) + if (!vm.nextPage) return; getPageData(vm.page + 1); }, getPrevious: function () { - if (!vm.previous_page) + if (!vm.previousPage) return; getPageData(vm.page - 1); }, getBtnClass: function (btn) { //上一页/下一页按钮启用禁用逻辑 if (btn) { - return vm.next_page ? "btn btn-primary" : "btn btn-primary disabled"; + return vm.nextPage ? "btn btn-primary" : "btn btn-primary disabled"; } else { - return vm.previous_page ? "btn btn-primary" : "btn btn-primary disabled"; + return vm.previousPage ? "btn btn-primary" : "btn btn-primary disabled"; } }, - enEdit: function (el) { //点击编辑按钮的事件,显示/隐藏编辑区 - vm.username = el.username; - vm.real_name = el.real_name; - vm.admin_type = el.admin_type; - vm.email = el.email; - vm.id = el.id; - if (vm.isEditing == el.id) - vm.isEditing = 0; + editUser: function (user) { //点击编辑按钮的事件,显示/隐藏编辑区 + vm.username = user.username; + vm.realName = user.real_name; + vm.adminType = user.admin_type; + vm.email = user.email; + vm.id = user.id; + if (vm.editingUserId == user.id) + vm.editingUserId = 0; else - vm.isEditing = el.id; + vm.editingUserId = user.id; }, - getPage: function (page_index) { - getPageData(page_index); + search: function () { + getPageData(1); } }); vm.$watch("showAdminOnly", function () { @@ -66,23 +65,23 @@ require(["jquery", "avalon", "csrf", "bs_alert", "validation"], function ($, ava var url = "/api/admin/user/?paging=true&page=" + page + "&page_size=10"; if (vm.showAdminOnly == true) url += "&admin_type=1"; - if (vm.key_word != "") - url += "&keyword=" + vm.key_word; + if (vm.keyword != "") + url += "&keyword=" + vm.keyword; $.ajax({ - beforeSend: csrfHeader, + beforeSend: csrfTokenHeader, url: url, dataType: "json", method: "get", success: function (data) { if (!data.code) { - vm.user_list = 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.userList = data.data.results; + vm.totalPage = data.data.total_page; + vm.previousPage = data.data.previous_page; + vm.nextPage = data.data.next_page; vm.page = page; } else { - bs_alert(data.data); + bsAlert(data.data); } } }); @@ -136,26 +135,26 @@ require(["jquery", "avalon", "csrf", "bs_alert", "validation"], function ($, ava e.preventDefault(); var data = { username: vm.username, - real_name: vm.real_name, + real_name: vm.realName, email: vm.email, id: vm.id, - admin_type: vm.admin_type + admin_type: vm.adminType }; if ($("#password").val() !== "") data.password = $("#password").val(); $.ajax({ - beforeSend: csrfHeader, + beforeSend: csrfTokenHeader, url: "/api/admin/user/", data: data, dataType: "json", method: "put", success: function (data) { if (!data.code) { - bs_alert("提交成功!"); + bsAlert("提交成功!"); getPageData(1); $("#password").val(""); } else { - bs_alert(data.data); + bsAlert(data.data); } } }) diff --git a/static/src/js/app/oj/account/change_password.js b/static/src/js/app/oj/account/change_password.js index c76dd9d7..8129fb1d 100644 --- a/static/src/js/app/oj/account/change_password.js +++ b/static/src/js/app/oj/account/change_password.js @@ -1,4 +1,4 @@ -require(["jquery", "bs_alert", "csrf", "validation"], function ($, bs_alert, csrfHeader) { +require(["jquery", "bsAlert", "csrfToken", "formValidation"], function ($, bsAlert, csrfTokenHeader) { $("#change_password-form").formValidation({ framework: "bootstrap", fields: { @@ -47,21 +47,20 @@ require(["jquery", "bs_alert", "csrf", "validation"], function ($, bs_alert, csr ).on('success.form.fv', function (e) { e.preventDefault(); var username = $("#username").val(); - var new_password = $("#new_password ").val(); + var newPassword = $("#new_password ").val(); var password = $("#password").val(); $.ajax({ - beforeSend: csrfHeader, + beforeSend: csrfTokenHeader, url: "/api/change_password/", - data: {username: username, new_password: new_password, old_password: password}, + data: {username: username, new_password: newPassword, old_password: password}, dataType: "json", method: "post", success: function (data) { - if (!data.code) { window.location.href = "/login/"; } else { - bs_alert(data.data); + bsAlert(data.data); } } }) diff --git a/static/src/js/app/oj/account/login.js b/static/src/js/app/oj/account/login.js index 2ecebf73..ca84975e 100644 --- a/static/src/js/app/oj/account/login.js +++ b/static/src/js/app/oj/account/login.js @@ -1,4 +1,4 @@ -require(["jquery", "bs_alert", "csrf", "validation"], function ($, bs_alert, csrfHeader) { +require(["jquery", "bsAlert", "csrfToken", "formValidation"], function ($, bsAlert, csrfTokenHeader) { $("#login-form") .formValidation({ framework: "bootstrap", @@ -24,7 +24,7 @@ require(["jquery", "bs_alert", "csrf", "validation"], function ($, bs_alert, csr var username = $("#username").val(); var password = $("#password").val(); $.ajax({ - beforeSend: csrfHeader, + beforeSend: csrfTokenHeader, url: "/api/login/", data: {username: username, password: password}, dataType: "json", @@ -34,7 +34,7 @@ require(["jquery", "bs_alert", "csrf", "validation"], function ($, bs_alert, csr window.location.href = "/"; } else { - bs_alert(data.data); + bsAlert(data.data); } } diff --git a/static/src/js/app/oj/account/register.js b/static/src/js/app/oj/account/register.js index 432ce21c..bd00fb89 100644 --- a/static/src/js/app/oj/account/register.js +++ b/static/src/js/app/oj/account/register.js @@ -1,4 +1,4 @@ -require(["jquery", "bs_alert", "csrf", "validation"], function ($, bs_alert, csrfHeader) { +require(["jquery", "bsAlert", "csrfToken", "validation"], function ($, bsAlert, csrfTokenHeader) { $("#register-form") .formValidation({ framework: "bootstrap", @@ -73,13 +73,13 @@ require(["jquery", "bs_alert", "csrf", "validation"], function ($, bs_alert, csr ).on('success.form.fv', function (e) { e.preventDefault(); var username = $("#username").val(); - var real_name = $("#real_name").val(); + var realName = $("#real_name").val(); var password = $("#password").val(); var email = $("#email").val(); $.ajax({ beforeSend: csrfHeader, url: "/api/register/", - data: {username: username, real_name: real_name, password: password, email: email}, + data: {username: username, real_name: realName, password: password, email: email}, dataType: "json", method: "post", success: function (data) { @@ -87,7 +87,7 @@ require(["jquery", "bs_alert", "csrf", "validation"], function ($, bs_alert, csr window.location.href = "/login/"; } else { - bs_alert(data.data); + bsAlert(data.data); } } }) diff --git a/static/src/js/app/oj/problem/problem.js b/static/src/js/app/oj/problem/problem.js index abcf39c1..8e107bb8 100644 --- a/static/src/js/app/oj/problem/problem.js +++ b/static/src/js/app/oj/problem/problem.js @@ -1,12 +1,12 @@ -require(["jquery", "code_mirror", "csrf", "bs_alert"], function ($, code_mirror, csrfHeader, bs_alert) { - var code_editor = code_mirror($("#code-editor")[0], "text/x-csrc"); +require(["jquery", "codeMirror", "csrfToken", "bsAlert"], function ($, codeMirror, csrfTokenHeader, bsAlert) { + var codeEditor = codeMirror($("#code-editor")[0], "text/x-csrc"); var language = $("input[name='language'][checked]").val(); - var submission_id; + var submissionId; $("input[name='language']").change(function () { language = this.value; - var language_types = {"1": "text/x-csrc", "2": "text/x-c++src", "3": "text/x-java"}; - code_editor.setOption("mode", language_types[language]); + var languageTypes = {"1": "text/x-csrc", "2": "text/x-c++src", "3": "text/x-java"}; + codeEditor.setOption("mode", languageTypes[language]); }); $("#show-more-btn").click(function () { @@ -14,18 +14,17 @@ require(["jquery", "code_mirror", "csrf", "bs_alert"], function ($, code_mirror, $("#show-more-btn").hide(); }); - function show_loading() { + function showLoading() { $("#submit-code-button").attr("disabled", "disabled"); $("#loading-gif").show(); } - function hide_loading() { + function hideLoading() { $("#submit-code-button").removeAttr("disabled"); $("#loading-gif").hide(); } - - function get_result_html(data) { + function getResultHtml(data) { // 0 结果正确 1 运行错误 2 超时 3 超内存 4 编译错误 // 5 格式错误 6 结果错误 7 系统错误 8 等待判题 var results = { @@ -49,14 +48,14 @@ require(["jquery", "code_mirror", "csrf", "bs_alert"], function ($, code_mirror, if (!data.result) { html += "CPU time: " + data.accepted_answer_info.time + "ms   "; } - html += ('查看详情 '); + html += ('查看详情 '); return html; } - function get_result() { + function getResult() { $.ajax({ - url: "/api/submission/?submission_id=" + submission_id, + url: "/api/submission/?submission_id=" + submissionId, method: "get", dataType: "json", success: function (data) { @@ -64,54 +63,54 @@ require(["jquery", "code_mirror", "csrf", "bs_alert"], function ($, code_mirror, // 8是还没有完成判题 if (data.data.result == 8) { // 1秒之后重新去获取 - setTimeout(get_result, 1000); + setTimeout(getResult, 1000); } else { - hide_loading(); - $("#result").html(get_result_html(data.data)); + hideLoading(); + $("#result").html(getResultHtml(data.data)); } } else { - bs_alert(data.data); - hide_loading(); + bsAlert(data.data); + hideLoading(); } } }) } $("#submit-code-button").click(function () { - var problem_id = window.location.pathname.split("/")[2]; - var code = code_editor.getValue(); + var problemId = window.location.pathname.split("/")[2]; + var code = codeEditor.getValue(); - show_loading(); + showLoading(); if(!code.trim()){ bs_alert("请填写代码!"); - hide_loading(); + hideLoading(); return false; } $("#result").html(""); $.ajax({ - beforeSend: csrfHeader, + beforeSend: csrfTokenHeader, url: "/api/submission/", method: "post", data: JSON.stringify({ - problem_id: window.location.pathname.split("/")[2], + problem_id: problemId, language: language, - code: code_editor.getValue() + code: codeEditor.getValue() }), contentType: "application/json", success: function (data) { if (!data.code) { - submission_id = data.data.submission_id; + submissionId = data.data.submission_id; // 获取到id 之后2秒去查询一下判题结果 - setTimeout(get_result, 2000); + setTimeout(getResult, 2000); } else { bs_alert(data.data); - hide_loading(); + hideLoading(); } } }); diff --git a/static/src/js/config.js b/static/src/js/config.js index 0c63006b..d74fcdd3 100644 --- a/static/src/js/config.js +++ b/static/src/js/config.js @@ -2,24 +2,28 @@ var require = { // RequireJS 通过一个相对的路径 baseUrl来加载所有代码。baseUrl通常被设置成data-main属性指定脚本的同级目录。 baseUrl: "/static/js/", paths: { - //百度webuploader - webuploader: "lib/webuploader/webuploader", jquery: "lib/jquery/jquery", avalon: "lib/avalon/avalon", editor: "utils/editor", uploader: "utils/uploader", - validation: "utils/validation", - code_mirror: "utils/code_mirror", - bs_alert: "utils/bs_alert", + formValidation: "utils/formValidation", + codeMirror: "utils/codeMirror", + bsAlert: "utils/bsAlert", problem: "app/oj/problem/problem", contest: "app/admin/contest/contest", - csrf: "utils/csrf", + csrfToken: "utils/csrfToken", admin: "app/admin/admin", chart: "lib/chart/Chart", tagEditor: "lib/tagEditor/jquery.tag-editor.min", jqueryUI: "lib/jqueryUI/jquery-ui", - //formValidation 不要在代码中单独使用,而是使用和修改utils/validation + bootstrap: "lib/bootstrap/bootstrap", + datetimePicker: "lib/datetime_picker/bootstrap-datetimepicker.zh-CN", + + + // ------ 下面写的都不要直接用,而是使用上面的封装版本 ------ + + //formValidation -> utils/validation base: "lib/formValidation/base", helper: "lib/formValidation/helper", "language/zh_CN": "lib/formValidation/language/zh_CN", @@ -32,26 +36,25 @@ var require = { "validator/confirm":"lib/formValidation/validator/confirm", "validator/remote":"lib/formValidation/validator/remote", "validator/emailAddress":"lib/formValidation/validator/emailAddress", - //富文本编辑器 不要直接使用,而是使用上面的editor + + //富文本编辑器simditor -> editor simditor: "lib/simditor/simditor", "simple-module": "lib/simditor/module", "simple-hotkeys": "lib/simditor/hotkeys", "simple-uploader": "lib/simditor/uploader", - //code mirroe 代码编辑器 - _code_mirror: "lib/codeMirror/codemirror", - code_mirror_clang: "lib/codeMirror/language/clike", + //code mirror 代码编辑器 ->codeMirror + _codeMirror: "lib/codeMirror/codemirror", + codeMirrorClang: "lib/codeMirror/language/clike", - //bootstrap - bootstrap: "lib/bootstrap/bootstrap", + //百度webuploader -> uploader + webUploader: "lib/webuploader/webuploader", - // - "_datetimepicker": "lib/datetime_picker/bootstrap-datetimepicker", - "datetimepicker": "lib/datetime_picker/bootstrap-datetimepicker.zh-CN" + "_datetimePicker": "lib/datetime_picker/bootstrap-datetimepicker" }, shim: { - "bootstrap": {"deps": ['jquery']}, - "_datetimepicker": {"deps": ["jquery"]}, - "datetimepicker": {"deps": ["_datetimepicker"]} + bootstrap: {deps: ["jquery"]}, + _datetimePicker: {dep: ["jquery"]}, + datetimePicker: {deps: ["_datetimePicker"]} } }; \ No newline at end of file diff --git a/static/src/js/lib/codeMirror/language/clike.js b/static/src/js/lib/codeMirror/language/clike.js index 660b5477..ef29ae97 100755 --- a/static/src/js/lib/codeMirror/language/clike.js +++ b/static/src/js/lib/codeMirror/language/clike.js @@ -5,7 +5,7 @@ if (typeof exports == "object" && typeof module == "object") // CommonJS mod(require("../../lib/codemirror")); else if (typeof define == "function" && define.amd) // AMD - define(["_code_mirror"], mod); + define(["_codeMirror"], mod); else // Plain browser env mod(CodeMirror); })(function(CodeMirror) { diff --git a/static/src/js/lib/formValidation/validator/remote.js b/static/src/js/lib/formValidation/validator/remote.js index 83a6fc52..0f48676e 100755 --- a/static/src/js/lib/formValidation/validator/remote.js +++ b/static/src/js/lib/formValidation/validator/remote.js @@ -7,12 +7,12 @@ // AMD module is defined if (typeof define === "function" && define.amd) { - define("validator/remote", ["jquery", "base", "csrf"], factory); + define("validator/remote", ["jquery", "base", "csrfToken"], factory); } else { // planted over the root! factory(root.jQuery, root.FormValidation); } -}(this, function ($, FormValidation, csrfHeader) { +}(this, function ($, FormValidation, csrfTokenHeader) { FormValidation.I18n = $.extend(true, FormValidation.I18n || {}, { 'en_US': { remote: { @@ -28,7 +28,7 @@ return true; var url = options.url; var xhr = $.ajax({ - beforeSend: csrfHeader, + beforeSend: csrfTokenHeader, url: url, dataType: 'json', data: ajaxData, diff --git a/static/src/js/utils/bs_alert.js b/static/src/js/utils/bsAlert.js similarity index 88% rename from static/src/js/utils/bs_alert.js rename to static/src/js/utils/bsAlert.js index 547b9197..52f46f84 100644 --- a/static/src/js/utils/bs_alert.js +++ b/static/src/js/utils/bsAlert.js @@ -1,5 +1,5 @@ -define("bs_alert", ["jquery", "bootstrap"], function($){ - function bs_alert(content){ +define("bsAlert", ["jquery", "bootstrap"], function($){ + function bsAlert(content){ if(!$("#alert-modal").length) { var html = '