1. 程式人生 > >潭州課堂25班:Ph201805201 django 專案 第十八課 前臺 註解 (課堂筆記)

潭州課堂25班:Ph201805201 django 專案 第十八課 前臺 註解 (課堂筆記)

在靜態檔案 js/user上當下,的 auth.js 檔案中

$(function () {
  let $username = $('#user_name');  // 選擇id為user_name的網頁元素,需要定義一個id為user_name
  let $img = $(".form-item .captcha-graph-img img");  // 獲取影象標籤
  let sImageCodeId = "";  // 定義影象驗證碼ID值
  let $mobile = $('#mobile');  // 選擇id為mobile的網頁元素,需要定義一個id為mobile
  let $smsCodeBtn = $('.form-item .sms-captcha');// 獲取簡訊驗證碼按鈕元素,需要定義一個id為input_smscode
  let $imgCodeText = $('#input_captcha');  // 獲取使用者輸入的圖片驗證碼元素,需要定義一個id為input_captcha
  let $register = $('.form-contain');  // 獲取登錄檔單元素


  // 1、圖片驗證碼邏輯
  // 通過uuid生成驗證碼編號
  // 拼接驗證碼地址
  // 設定驗證碼圖片標籤的src
  generateImageCode();  // 生成影象驗證碼圖片
  $img.click(generateImageCode);  // 點選圖片驗證碼生成新的圖片驗證碼圖片


  // 2、使用者名稱驗證邏輯
  $username.blur(function () {
    fn_check_usrname();
  });


  // 3、手機號驗證邏輯
  // 判斷使用者手機號是否註冊
  $mobile.blur(function () {
    fn_check_mobile();
  });


  // 4、傳送簡訊驗證碼邏輯
  $smsCodeBtn.click(function () {
    // 判斷手機號是否輸入
    if (fn_check_mobile() !== "success") {
      return
    }

    // 判斷使用者是否輸入圖片驗證碼
    let text = $imgCodeText.val();  // 獲取使用者輸入的圖片驗證碼文字
    if (!text) {
        message.showError('請填寫驗證碼!');
        return
    }

    if (!sImageCodeId) {
      message.showError('圖片UUID為空');
      return
    }

    // 正常
    let SdataParams = {
      "mobile": $mobile.val(),   // 獲取使用者輸入的手機號
      "text": text,   // 獲取使用者輸入的圖片驗證碼文字
      "image_code_id": sImageCodeId  // 獲取圖片UUID
    };

    // for test
    // let SdataParams = {
    //   "mobile": "1806508",   // 獲取使用者輸入的手機號
    //   "text": "ha3d",  // 獲取使用者輸入的圖片驗證碼文字
    //   "image_code_id": "680a5a66-d9e5-4c3c-b8ea"  // 獲取圖片UUID
    // };

    // 向後端傳送請求
    $.ajax({
      // 請求地址
      url: "/sms_codes/",
      // 請求方式
      type: "POST",
      // 向後端傳送csrf token
      // headers: {
      //           // 根據後端開啟的CSRFProtect保護,cookie欄位名固定為X-CSRFToken
      //           "X-CSRFToken": getCookie("csrf_token")
      // },
      // data: JSON.stringify(SdataParams),
      data: JSON.stringify(SdataParams),
      // 請求內容的資料型別(前端發給後端的格式)
      contentType: "application/json; charset=utf-8",
      // 響應資料的格式(後端返回給前端的格式)
      dataType: "json",
      async: false
    })
      .done(function (res) {
        if (res.errno === "0") {
          // 倒計時60秒,60秒後允許使用者再次點擊發送簡訊驗證碼的按鈕
           message.showSuccess('簡訊驗證碼傳送成功');
          let num = 60;
          // 設定一個計時器
          let t = setInterval(function () {
            if (num === 1) {
              // 如果計時器到最後, 清除計時器物件
              clearInterval(t);
              // 將點選獲取驗證碼的按鈕展示的文字恢復成原始文字
              $smsCodeBtn.html("獲取驗證碼");
            } else {
              num -= 1;
              // 展示倒計時資訊
              $smsCodeBtn.html(num + "秒");
            }
          }, 1000);
        } else {
          message.showError(res.errmsg);
        }
      })
      .fail(function(){
        message.showError('伺服器超時,請重試!');
      });

  });


  // 5、註冊邏輯
  $register.submit(function (e) {
    // 阻止預設提交操作
    e.preventDefault();

    // 獲取使用者輸入的內容
    let sUsername = $username.val();  // 獲取使用者輸入的使用者名稱字串
    let sPassword = $("input[name=password]").val();
    let sPasswordRepeat = $("input[name=password_repeat]").val();
    let sMobile = $mobile.val();  // 獲取使用者輸入的手機號碼字串
    let sSmsCode = $("input[name=sms_captcha]").val();

    // 判斷使用者名稱是否已註冊
    if (fn_check_usrname() !== "success") {
      return
    }

    // 判斷手機號是否為空,是否已註冊
    if (fn_check_mobile() !== "success") {
      return
    }

    // 判斷使用者輸入的密碼是否為空
    if ((!sPassword) || (!sPasswordRepeat)) {
      message.showError('密碼或確認密碼不能為空');
      return
    }

    // 判斷使用者輸入的密碼和確認密碼長度是否為6-20位
    if ((sPassword.length < 6 || sPassword.length > 20) ||
      (sPasswordRepeat.length < 6 || sPasswordRepeat.length > 20)) {
      message.showError('密碼和確認密碼的長度需在6~20位以內');
      return
    }

    // 判斷使用者輸入的密碼和確認密碼是否一致
    if (sPassword !== sPasswordRepeat) {
      message.showError('密碼和確認密碼不一致');
      return
    }


  // 判斷使用者輸入的簡訊驗證碼是否為6位數字
    if (!(/^\d{6}$/).test(sSmsCode)) {
      message.showError('簡訊驗證碼格式不正確,必須為6位數字!');
      return
    }

    // 發起註冊請求
    // 1、建立請求引數
    let SdataParams = {
      "username": sUsername,
      "password": sPassword,
      "password_repeat": sPasswordRepeat,
      "mobile": sMobile,
      "sms_code": sSmsCode
    };

    // 2、建立ajax請求
    $.ajax({
      // 請求地址
      url: "/users/register/",  // url尾部需要新增/
      //url: "/users/res/",  // url尾部需要新增/
      // 請求方式
      type: "POST",
      data: JSON.stringify(SdataParams),
      // 請求內容的資料型別(前端發給後端的格式)
      contentType: "application/json; charset=utf-8",
      // 響應資料的格式(後端返回給前端的格式)
      dataType: "json",
    })
      .done(function (res) {
        if (res.errno === "0") {
          // 註冊成功
          message.showSuccess('恭喜你,註冊成功!');
          setTimeout(function () {
            // 註冊成功之後重定向到主頁
            //window.location.href = '/';
            //重定向到原頁面
            window.location.href = document.referrer;
          }, 1000)
        } else {
          // 註冊失敗,列印錯誤資訊
          message.showError(res.errmsg);
        }
      })
      .fail(function(){
        message.showError('伺服器超時,請重試!');
      });

  });


  // 生成一個圖片驗證碼的編號,並設定頁面中圖片驗證碼img標籤的src屬性
  function generateImageCode() {
    // 1、生成一個圖片驗證碼隨機編號
    sImageCodeId = generateUUID();
    // 2、拼接請求url /image_codes/<uuid:image_code_id>/
    let imageCodeUrl = "/image_codes/" + sImageCodeId + "/";
    // 3、修改驗證碼圖片src地址
    $img.attr('src', imageCodeUrl)

  }

  // 生成圖片UUID驗證碼
  function generateUUID() {
    let d = new Date().getTime();
    if (window.performance && typeof window.performance.now === "function") {
      d += performance.now(); //use high-precision timer if available
    }
    let uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
      let r = (d + Math.random() * 16) % 16 | 0;
      d = Math.floor(d / 16);
      return (c == 'x' ? r : (r & 0x3 | 0x8)).toString(16);
    });
    return uuid;
  }

  // 判斷使用者名稱是否已經註冊
  function fn_check_usrname() {
    let sUsername = $username.val();  // 獲取使用者名稱字串
    let sReturnValue = "";

    if (sUsername === "") {
      message.showError('使用者名稱不能為空!');
      return
    }

    if (!(/^\w{5,20}$/).test(sUsername)) {
      message.showError('請輸入5-20個字元的使用者名稱');
      return
    }

    // 傳送ajax請求,去後端查詢使用者名稱是否存在
    $.ajax({
      url: '/usernames/' + sUsername + '/',
      type: 'GET',
      dataType: 'json',
      async: false
    })
      .done(function (res) {
        if (res.data.count !== 0) {
          message.showError(res.data.username + '已註冊,請重新輸入!')
          sReturnValue = ""
        } else {
          message.showInfo(res.data.username + '能正常使用!')
          sReturnValue = "success"
        }
      })
      .fail(function () {
        message.showError('伺服器超時,請重試!');
        sReturnValue = ""
      });
    return sReturnValue
  }

  // 判斷手機號是否註冊
  function fn_check_mobile() {
    let sMobile = $mobile.val();  // 獲取使用者輸入的手機號碼字串
    let sReturnValue = "";
    if (sMobile === "") {
      message.showError('手機號不能為空!');
      return
    }
    if (!(/^1[345789]\d{9}$/).test(sMobile)) {
      message.showError('手機號碼格式不正確,請重新輸入!');
      return
    }

    $.ajax({
      url: '/mobiles/' + sMobile + '/',
      type: 'GET',
      dataType: 'json',
      async: false
    })
      .done(function (res) {
        if (res.data.count !== 0) {
          message.showError(res.data.mobile + '已註冊,請重新輸入!')
          sReturnValue = ""
        } else {
          message.showSuccess(res.data.mobile + '能正常使用!');
          sReturnValue = "success"
        }
      })
      .fail(function () {
        message.showError('伺服器超時,請重試!');
        sReturnValue = ""
      });
    return sReturnValue

  }

  // get cookie using jQuery
  function getCookie(name) {
    let cookieValue = null;
    if (document.cookie && document.cookie !== '') {
      let cookies = document.cookie.split(';');
      for (let i = 0; i < cookies.length; i++) {
        let cookie = jQuery.trim(cookies[i]);
        // Does this cookie string begin with the name we want?
        if (cookie.substring(0, name.length + 1) === (name + '=')) {
          cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
          break;
        }
      }
    }
    return cookieValue;
  }

  function csrfSafeMethod(method) {
    // these HTTP methods do not require CSRF protection
    return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
  }

  // Setting the token on the AJAX request
  $.ajaxSetup({
    beforeSend: function (xhr, settings) {
      if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
        xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));
      }
    }
  });

});

  

 

在靜態檔案下 js/user 目錄下,的login.js檔案中

/**
 * Created by Administrator on 2018/12/15 0015.
 */
$(function () {
  let $login = $('.form-contain');  // 獲取登入表單元素

  // for test
  // console.log(document.referrer);   // 將referrer url 列印到終端

  // 登入邏輯
  $login.submit(function (e) {
    // 阻止預設提交操作
    e.preventDefault();

    // 獲取使用者輸入的賬號資訊
    let sUserAccount = $("input[name=telephone]").val();  // 獲取使用者輸入的使用者名稱或者手機號
    // 判斷使用者輸入的賬號資訊是否為空
    if (sUserAccount === "") {
      message.showError('使用者賬號不能為空');
      return
    }
    // 判斷輸入手機號格式或者使用者名稱格式是否正確
    if (!(/^\w{5,20}$/).test(sUserAccount) || !(/^\w{5,20}$/).test(sUserAccount)) {
      message.showError('請輸入合法的使用者賬號:5-20個字元的使用者名稱或者11位手機號');
      return
    }

    // 獲取使用者輸入的密碼
    let sPassword = $("input[name=password]").val();  // 獲取使用者輸入的密碼
    // 判斷使用者輸入的密碼是否為空
    if (!sPassword) {
      message.showError('密碼不能為空');
      return
    }
    // 判斷使用者輸入的密碼是否為6-20位
    if (sPassword.length < 6 || sPassword.length > 20) {
      message.showError('密碼的長度需在6~20位以內');
      return
    }

    // 獲取使用者是否勾許"記住我",勾許為true,不勾許為false
    let bStatus = $("input[type='checkbox']").is(":checked");  // 獲取使用者是否選擇記住我,勾上代表true,沒勾上程式碼false

    // 發起登入請求
    // 建立請求引數
    let SdataParams = {
      "user_account": sUserAccount,
      "password": sPassword,
      "remember_me": bStatus
    };

    // 建立ajax請求
    $.ajax({
      // 請求地址
      url: "/users/login/",  // url尾部需要新增/
      // 請求方式
      type: "POST",
      data: JSON.stringify(SdataParams),
      // 請求內容的資料型別(前端發給後端的格式)
      contentType: "application/json; charset=utf-8",
      // 響應資料的格式(後端返回給前端的格式)
      dataType: "json",
    })
      .done(function (res) {
        if (res.errno === "0") {
          // 註冊成功
          message.showSuccess('恭喜你,登入成功!');
          setTimeout(function () {
            // 註冊成功之後重定向到開啟登入頁面之前的頁面
            window.location.href = document.referrer;
          }, 1000)
        } else {
          // 登入失敗,列印錯誤資訊
          message.showError(res.errmsg);
        }
      })
      .fail(function(){
        message.showError('伺服器超時,請重試!');
      });
  });

  // get cookie using jQuery
  function getCookie(name) {
    let cookieValue = null;
    if (document.cookie && document.cookie !== '') {
      let cookies = document.cookie.split(';');
      for (let i = 0; i < cookies.length; i++) {
        let cookie = jQuery.trim(cookies[i]);
        // Does this cookie string begin with the name we want?
        if (cookie.substring(0, name.length + 1) === (name + '=')) {
          cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
          break;
        }
      }
    }
    return cookieValue;
  }

  function csrfSafeMethod(method) {
    // these HTTP methods do not require CSRF protection
    return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
  }

  // Setting the token on the AJAX request
  $.ajaxSetup({
    beforeSend: function (xhr, settings) {
      if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
        xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));
      }
    }
  });

});

  

 

在 html 檔案中要引入對應 js 檔案,級標籤的對名稱 ,