From 62a9e050f5ea05cc271edb31c37d505bc08f992e Mon Sep 17 00:00:00 2001 From: sxw Date: Tue, 4 Aug 2015 16:05:40 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=86=E7=99=BB=E9=99=86?= =?UTF-8?q?=EF=BC=8C=E4=BF=AE=E6=94=B9=E5=AF=86=E7=A0=81=EF=BC=8C=E6=B3=A8?= =?UTF-8?q?=E5=86=8C=E4=B8=89=E4=B8=AA=E9=A1=B5=E9=9D=A2=E7=9A=84csrf?= =?UTF-8?q?=EF=BC=9B=20=E6=B7=BB=E5=8A=A0=E4=BA=86usernameCheck=E7=9A=84va?= =?UTF-8?q?luedation=E6=A3=80=E6=B5=8B=E6=96=B9=E6=B3=95;=20urls.py=20?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=86register=EF=BC=8Cchange=5Fpassword?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- oj/urls.py | 2 + .../src/js/app/oj/account/change_password.js | 3 +- static/src/js/app/oj/account/login.js | 3 +- static/src/js/app/oj/account/register.js | 6 ++- static/src/js/config.js | 3 +- .../formValidation/validator/usernameCheck.js | 44 +++++++++++++++++++ static/src/js/utils/csrf.js | 16 +++++++ static/src/js/utils/validation.js | 3 +- 8 files changed, 75 insertions(+), 5 deletions(-) create mode 100644 static/src/js/lib/formValidation/validator/usernameCheck.js create mode 100644 static/src/js/utils/csrf.js diff --git a/oj/urls.py b/oj/urls.py index fc652b3..aa35a62 100644 --- a/oj/urls.py +++ b/oj/urls.py @@ -10,6 +10,8 @@ urlpatterns = [ url(r'^docs/', include('rest_framework_swagger.urls')), url(r'^admin/$', TemplateView.as_view(template_name="admin/index.html"), name="admin_index_page"), url(r'^login/$', TemplateView.as_view(template_name="oj/account/login.html"), name="user_login_page"), + url(r'^register/$', TemplateView.as_view(template_name="oj/account/register.html"), name="user_register_page"), + url(r'^change_password/$', TemplateView.as_view(template_name="oj/account/change_password.html"), name="user_change_password_page"), url(r'^api/login/$', UserLoginAPIView.as_view(), name="user_login_api"), url(r'^api/register/$', UserRegisterAPIView.as_view(), name="user_register_api"), url(r'^api/change_password/$', UserChangePasswordAPIView.as_view(), name="user_change_password_api"), diff --git a/static/src/js/app/oj/account/change_password.js b/static/src/js/app/oj/account/change_password.js index 035e0d3..ff9bf74 100644 --- a/static/src/js/app/oj/account/change_password.js +++ b/static/src/js/app/oj/account/change_password.js @@ -1,5 +1,5 @@ -require(["jquery", "bs_alert", "validation"], function($, bs_alert){ +require(["jquery", "bs_alert", "csrf", "validation"], function($, bs_alert, csrfHeader){ $("#change_password-form").formValidation({ @@ -69,6 +69,7 @@ require(["jquery", "bs_alert", "validation"], function($, bs_alert){ var new_password = $("#new_password ").val(); var password = $("#password").val(); $.ajax({ + beforeSend: csrfHeader, url: "/api/change_password/", data: {username: username, new_password: new_password , old_password : password}, dataType: "json", diff --git a/static/src/js/app/oj/account/login.js b/static/src/js/app/oj/account/login.js index b7c23e7..da4416d 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", "validation"], function($, bs_alert){ +require(["jquery", "bs_alert", "csrf", "validation"], function($, bs_alert, csrfHeader){ $("#login-form") .formValidation({ framework: "bootstrap", @@ -24,6 +24,7 @@ require(["jquery", "bs_alert", "validation"], function($, bs_alert){ var username = $("#username").val(); var password = $("#password").val(); $.ajax({ + beforeSend: csrfHeader, url: "/api/login/", data: {username: username, password: password}, dataType: "json", diff --git a/static/src/js/app/oj/account/register.js b/static/src/js/app/oj/account/register.js index 0241698..4baf334 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", "validation"], function($, bs_alert){ +require(["jquery", "bs_alert", "csrf", "validation"], function($, bs_alert, csrfHeader){ $("#register-form") .formValidation({ @@ -13,6 +13,9 @@ require(["jquery", "bs_alert", "validation"], function($, bs_alert){ min: 3, max: 30, message: '用户名长度必须在3到30位之间' + }, + usernameCheck:{ + message: '用户名已存在' } } }, @@ -75,6 +78,7 @@ require(["jquery", "bs_alert", "validation"], function($, bs_alert){ var real_name = $("#real_name").val(); var password = $("#password").val(); $.ajax({ + beforeSend: csrfHeader, url: "/api/register/", data: {username: username, real_name: real_name, password: password}, dataType: "json", diff --git a/static/src/js/config.js b/static/src/js/config.js index fbeaa3a..3907d1c 100644 --- a/static/src/js/config.js +++ b/static/src/js/config.js @@ -14,6 +14,7 @@ var require = { bs_alert: "utils/bs_alert", submit_code: "app/oj/problem/submit_code", contest: "app/admin/contest/contest", + csrf: "utils/csrf", //formValidation 不要在代码中单独使用,而是使用和修改utils/validation base: "lib/formValidation/base", @@ -26,7 +27,7 @@ var require = { "validator/integer": "lib/formValidation/validator/integer", "validator/between": "lib/formValidation/validator/between", 'validator/confirm':"lib/formValidation/validator/confirm", - + "validator/usernameCheck":"lib/formValidation/validator/usernameCheck", //富文本编辑器 不要直接使用,而是使用上面的editor simditor: "lib/simditor/simditor", "simple-module": "lib/simditor/module", diff --git a/static/src/js/lib/formValidation/validator/usernameCheck.js b/static/src/js/lib/formValidation/validator/usernameCheck.js new file mode 100644 index 0000000..116c1dc --- /dev/null +++ b/static/src/js/lib/formValidation/validator/usernameCheck.js @@ -0,0 +1,44 @@ +/** + * usernameCheck validator + */ + +(function(root, factory) { + + "use strict"; + + // AMD module is defined + if (typeof define === "function" && define.amd) { + define("validator/usernameCheck", ["jquery", "base", "csrf"], factory); + } else { + // planted over the root! + factory(root.jQuery, root.FormValidation); + } + +}(this, function ($, FormValidation, csrfHeader) { + FormValidation.I18n = $.extend(true, FormValidation.I18n || {}, { + 'en_US': { + usernameCheck: { + 'default': 'Please input the same value' + } + } + }); + + FormValidation.Validator.usernameCheck = { + + validate: function(validator, $field, options) { + if ($field.val() == '') + return true; + return !$.ajax({ + async: false, + beforeSend: csrfHeader, + url: "/api/username_check/", + data: {username: $field.val()}, + dataType: "json", + method: "post", + + + }).responseJSON.data; + + } + }; +})); diff --git a/static/src/js/utils/csrf.js b/static/src/js/utils/csrf.js new file mode 100644 index 0000000..767542b --- /dev/null +++ b/static/src/js/utils/csrf.js @@ -0,0 +1,16 @@ +define("csrf",function(){ + function get_cookie(cookie_name) { + var name = cookie_name + "="; + var ca = document.cookie.split(';'); + for (var i = 0; i < ca.length; i++) { + var c = ca[i]; + while (c.charAt(0) == ' ') c = c.substring(1); + if (c.indexOf(name) != -1) return c.substring(name.length, c.length); + } + return ""; + } + function csrfHeader(xhr){ + xhr.setRequestHeader("X-CSRFToken", get_cookie("csrftoken")); + } + return csrfHeader; +}); diff --git a/static/src/js/utils/validation.js b/static/src/js/utils/validation.js index b79bd81..38788f7 100644 --- a/static/src/js/utils/validation.js +++ b/static/src/js/utils/validation.js @@ -8,7 +8,8 @@ define("validation", 'validator/date', 'validator/integer', 'validator/between', - 'validator/confirm'], + 'validator/confirm', + 'validator/usernameCheck'], function () { }); \ No newline at end of file