diff --git a/account/serializers.py b/account/serializers.py
index 4cda3ae..f60e9ca 100644
--- a/account/serializers.py
+++ b/account/serializers.py
@@ -7,6 +7,7 @@ from .models import User
class UserLoginSerializer(serializers.Serializer):
username = serializers.CharField(max_length=30)
password = serializers.CharField(max_length=30)
+ captcha = serializers.CharField(required=False,min_length=4,max_length=4)
class UsernameCheckSerializer(serializers.Serializer):
@@ -22,6 +23,7 @@ class UserRegisterSerializer(serializers.Serializer):
real_name = serializers.CharField(max_length=30)
password = serializers.CharField(max_length=30, min_length=6)
email = serializers.EmailField(max_length=254)
+ captcha = serializers.CharField(max_length=4, min_length=4)
class UserChangePasswordSerializer(serializers.Serializer):
diff --git a/static/src/js/app/oj/account/login.js b/static/src/js/app/oj/account/login.js
index 0a05762..32343c9 100644
--- a/static/src/js/app/oj/account/login.js
+++ b/static/src/js/app/oj/account/login.js
@@ -1,26 +1,31 @@
require(["jquery", "bsAlert", "csrfToken", "validator"], function ($, bsAlert, csrfTokenHeader) {
+ var applied_captcha = false;
$('form').validator().on('submit', function (e) {
if (!e.isDefaultPrevented()) {
var username = $("#username").val();
var password = $("#password").val();
+ var ajaxData = {username: username, password: password};
+ if (applied_captcha) {
+ ajaxData.captcha = $("#captcha").val();
+ }
$.ajax({
beforeSend: csrfTokenHeader,
url: "/api/login/",
- data: {username: username, password: password},
+ data: ajaxData,
dataType: "json",
method: "post",
success: function (data) {
if (!data.code) {
//成功登陆
var ref = document.referrer;
- if(ref){
+ if (ref) {
// 注册页和本页的来源的跳转回首页,防止死循环
- if(ref.indexOf("register") > -1 || ref.indexOf("login") > -1){
+ if (ref.indexOf("register") > -1 || ref.indexOf("login") > -1) {
location.href = "/";
return;
}
// 判断来源,只有同域下才跳转
- if(ref.split("/")[2].split(":")[0] == location.hostname){
+ if (ref.split("/")[2].split(":")[0] == location.hostname) {
location.href = ref;
return;
}
@@ -28,6 +33,7 @@ require(["jquery", "bsAlert", "csrfToken", "validator"], function ($, bsAlert, c
location.href = "/";
}
else {
+ refresh_captcha();
bsAlert(data.data);
}
}
@@ -35,5 +41,34 @@ require(["jquery", "bsAlert", "csrfToken", "validator"], function ($, bsAlert, c
});
return false;
}
- })
+ });
+
+ $('#username').blur(function () {
+ if ($("#username").val()) {
+ $.ajax({
+ beforeSend: csrfTokenHeader,
+ url: "/api/account_security_check/?username=" + $("#username").val(),
+ method: "get",
+ success: function (data) {
+ if (!data.code) {
+ if (data.data.applied_captcha) {
+ $('#captcha-area').html('