Ajax — 大事件項目(第三天)

大事件-03

用戶信息

表單驗證

html中,直接使用layui提供的內置驗證規則 email

<input type="text" name="email" required lay-verify="required|email" placeholder="請輸入郵箱" autocomplete="off" class="layui-input">

重置表單

// ------------------   重置表單 --------------------
// 重置的時候,并不是清空輸入框的值,而是恢復默認的樣子
$('button[type="reset"]').on('click', function (e) {e.preventDefault();renderForm(); // 調用函數,從新發送ajax請求,獲取用戶信息,從新為表單賦值
});

關于base64格式的圖片說明

  • base64格式只是圖片的一種格式,用字符串表示圖片的格式
  • base64格式的優點:減少http請求,加快小圖片的響應速度
  • base64格式的缺點:體積比正常圖片大 30% 左右。

https://www.css-js.com/tools/base64.html

優化JS

新建 /assets/js/common.js。代碼如下:

$(function () {// 修改和配置ajax選項$.ajaxPrefilter(function (options) {console.log(options);// 修改url// options.url ====  /my/userinfooptions.url = 'http://www.liulongbin.top:3007' + options.url;// 以 /my 開頭的url需要設置headers// if (options.url.indexOf('/my') > -1) {if (options.url.includes('/my')) {options.headers = {Authorization: localStorage.getItem('token')}}/*** options = {*    type: 'xxx',*    url: xxxxx*    .....* }*/});
})
  • 其他HTML頁面,引入common.js文件

    • 注意引入的位置(在jQuery之后,在自己的js之前)
  • 修改原來的JS。

    • 去掉 http://www.liulongbin.top:3007 (查找替換比較快、一個一個改也行)
    • 去掉headers

沒有登錄不能訪問有權限的接口

在common.js 開頭的位置,加入一個判斷

如果沒有token,并且地址欄的url也不是login.html 。說明沒有登錄,還想看其他頁面,不允許,直接跳轉到登錄頁面。


//  common.js
// 判斷。如果沒有token,直接退出到 /login.html 
// 不要放到入口函數里面,需要代碼執行到common.js,馬上就執行代碼
// 請求的路徑不是login.html  并且 還沒有token,那么就跳轉到 /login.html
if (!localStorage.getItem('token') && !location.href.includes('/login.html')) {location.href = '/login.html';
}

測試的時候,注意看一下token有沒有。

上述判斷,對于大多數用戶,沒有問題。

如果,一個懂得編程的人,手動加了一個假token,則上述判斷就會失效。解決辦法是,ajax請求之后,根據接口返回的結果,再次判斷用戶是否是真的登錄了,如果沒有登錄,則跳轉到登錄頁面。

// $.ajaxPrefilter() 函數內部
// 配置complete函數。ajax請求完成(不管成功還是失敗)都會觸發的一個函數
options.complete = function (xhr) {// xhr.responseJSON 表示服務器返回的結果// console.log(xhr);if (xhr.responseJSON.status === 1 && xhr.responseJSON.message === '身份認證失敗!') {// 滿足條件,說明用戶沒有登錄,而且還訪問了需要驗證的接口// 清除假tokenlocalStorage.removeItem('token');// 跳轉到登錄頁面location.href = '/login.html';}
}

更新密碼

準備工作

  • 創建所需的HTML、css、js文件
  • 首頁側邊欄和頭部區域掛好鏈接
  • 加載好所需的css和js文件

頁面布局

  • html,去復制 userinfo.html

  • css,去復制 userinfo.css

  • HTML自行修改

    • type類型
    • 去掉readonly

表單驗證

let form = layui.form;
// --------------- 表單驗證 -----------------
form.verify({// key: value// 驗證規則: []// 驗證規則: function// 驗證長度 6~12位len: [/^\S{6,12}$/, '長度必須6到12位,不能有空格'],  // {6,12}不能出現空格// 驗證新密碼不能和原密碼相同diff: function (value) {// value 表示新密碼// 獲取原密碼let oldPwd = $('.oldPwd').val();if (value === oldPwd) {return '新密碼不能和原密碼相同';}},// 驗證兩次新密碼必須相同same: function (value) {// value 表示確認密碼// 獲取新密碼let newPwd = $('.newPwd').val();if (newPwd !== value) {return '兩次密碼不一致';}}
});
  • 三個密碼框,都使用len這個驗證規則
  • 新密碼,使用diff,這個驗證規則
  • 確認密碼,使用 same 驗證規則

自行給原密碼(oldPwd)和新密碼(newPwd)加一個 類

ajax請求,完成更新

// -------------- ajax請求,完成更新 ---------
$('form').on('submit', function (e) {e.preventDefault();// 獲取表單中的數據,ajax提交$.ajax({type: 'POST',url: '/my/updatepwd',data: $(this).serialize(), // 一定要檢查表單各項的name屬性;用layui的表單取值也可以success: function (res) {// console.log(res);layer.msg(res.message);if (res.status === 0) {// 重置輸入框$('button[type="reset"]').click();}                }});
})

更換頭像

準備工作

  • 創建 /user/avatar.html 、創建 /assets/css/user/avatar.css 創建/assets/js/user/avatar.js

  • 側邊欄和頭部區域掛好超鏈接

  • html中引入所需的css和js文件

<!-- 加載layui.css -->
<link rel="stylesheet" href="/assets/lib/layui/css/layui.css">
<!-- 加載cropper.css -->
<link rel="stylesheet" href="/assets/lib/cropper/cropper.css">
<!-- 加載自己的css -->
<link rel="stylesheet" href="/assets/css/user/avatar.css">
<!-- 加載jQuery -->
<script src="/assets/lib/jquery.js"></script>
<!-- 按順序 加載Cropper.js -->
<script src="/assets/lib/cropper/Cropper.js"></script>
<!-- 按順序 jquery-cropper.js -->
<script src="/assets/lib/cropper/jquery-cropper.js"></script>
<!-- 加載layui.all.js -->
<script src="/assets/lib/layui/layui.all.js"></script>
<!-- 加載common -->
<script src="/assets/js/common.js"></script>
<!-- 加載repwd -->
<script src="/assets/js/user/avatar.js"></script>

復制HTML和CSS(完成布局)

完成后的效果:

在這里插入圖片描述

點擊按鈕,可選擇圖片

  • html中加入一個隱藏的文件域
  • 點擊上傳按鈕的時候,觸發文件域的單擊事件
<!-- 加一個隱藏的文件域 -->
<input type="file" id="file" style="display: none;" accept="image/*">
<button type="button" class="layui-btn" id="chooseImage">上傳</button>
// -------------  點擊  上傳  ,可以選擇圖片  ------------
$('#chooseImage').click(function () {$('#file').click();
});

創建剪裁區

  • 使用插件 cropper ,提供的方法,實現剪裁區的創建
  • 具體做法:
    • 找到剪裁區的圖片 (img#image)
    • 設置配置項
    • 調用cropper方法,創建剪裁區
// ---------------  創建剪裁區 ------------------
// - 找到剪裁區的圖片 (img#image)
let image = $('#image');
// - 設置配置項
let option = {// 縱橫比(寬高比)aspectRatio: 1, // 正方形// 指定預覽區域preview: '.img-preview' // 指定預覽區的類名(選擇器)
};
// - 調用cropper方法,創建剪裁區
image.cropper(option);

更換圖片,重置剪裁區

  • 找到選擇的文件(文件對象)
  • 為文件對象創建一個臨時的url
  • 更換剪裁區的圖片
    • 先銷毀原來的剪裁區
    • 更改圖片的src屬性
    • 重新生成剪裁區
// --------------  更換剪裁區的圖片 ---------------
// 當文件域的內容改變的時候,更換圖片
$('#file').change(function () {// console.log(111);// 1. 找到選擇的圖片(文件對象)// console.dir(this);let fileObj = this.files[0]; // 我們選擇的圖片的文件對象// 2. 根據文件對象,生成一個臨時的url,用于訪問被選擇的圖片let url = URL.createObjectURL(fileObj);// console.log(url);// 3. 更換剪裁區的圖片的src屬性// - 銷毀原理的剪裁區// - 更換圖片// - 重新創建剪裁區image.cropper('destroy').attr('src', url).cropper(option);
});

點擊保存,實現剪裁并修改頭像

  • 調用 cropper 方法,傳遞 getCroppedCanvas 參數,得到一個canvas圖片(對象)
  • 調用canvas的toDataURL()方法,得到base64格式的圖片
  • ajax提交即可
// ---------------  點擊 確定 的時候,剪裁圖片,轉成base64格式,提交字符串到接口 ----------
$('#sure').click(function () {// 剪裁得到一張圖片(canvas圖片)let i = image.cropper('getCroppedCanvas', { // 創建一個 Canvas 畫布width: 100,height: 100});// 把圖片轉成base64格式let str = i.toDataURL(); // 把canvas圖片轉成base64格式// console.log(str); // base64格式的字符串// ajax提交字符串給接口$.ajax({type: 'POST',url: '/my/update/avatar',data: {avatar: str},success: function (res) {layer.msg(res.message);if (res.status === 0) {// 更換成功,調用父頁面的 getUserInfo() ,重新渲染頭像window.parent.getUserInfo();}}});
});

合并user分支,創建article分支

# 提交當前 user 分支所有的代碼
# 切換到master
git checkout master# 合并 user 到 master
git merge user# 創建并切換到article 分支
git checkout -b article

類別列表

準備工作

  • 創建文件
    • /article/category.html
    • /assets/css/article/category.css
    • /assets/js/article/category.js
  • 側邊欄掛超鏈接
  • 加載所需的css和js

頁面布局

<body><div class="layui-card"><div class="layui-card-header">文章管理<button type="button" class="layui-btn  layui-btn-normal layui-btn-sm">添加類別</button></div><div class="layui-card-body"><!-- 內容區 --><table class="layui-table"><colgroup><col width="35%"><col width="35%"><col></colgroup><thead><tr><th>類別名稱</th><th>類別別名</th><th>操作</th></tr> </thead><tbody><!-- 模板引擎遍歷出來的內容 --></tbody></table></div></div><script type="text/html" id="list">{{each data val}}<tr><td>{{val.name}}</td><td>{{val.alias}}</td><td><button type="button" class="layui-btn  layui-btn-xs">編輯</button><button type="button" class="layui-btn layui-btn  layui-btn-danger  layui-btn-xs">刪除</button></td></tr>{{/each}}</script>
</body>

模板引擎渲染頁面

$(function(){//------------------------ajax請求列表-----------------------renderHtml();function renderHtml(){$.ajax({url: '/my/article/cates',success:function(res){// console.log(res);//    if(res.status === 0){let str = template('list',res);// console.log(str);//把最終的結果放在tbody中去$('tbody').html(str);//    }},});}
})

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/248023.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/248023.shtml
英文地址,請注明出處:http://en.pswp.cn/news/248023.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

iOS中監測來電方案

問題 最近在做一個有錄音功能的App&#xff0c;要求當用戶接到來電時&#xff0c;要停止錄音。該如何實現這個功能呢&#xff1f; 解決方案 我首先想到了AppDelegate里的applicationWillResignActive:方法&#xff0c;在該方法的注釋中就寫到到收到來電或短信時&#xff0c;系統…

iOS運行時-使用Runtime向Category中添加屬性以及運行時介紹

前言 了解OC的都應該知道&#xff0c;在一般情況下&#xff0c;我們是不能向Category中添加屬性的&#xff0c;只能添加方法&#xff0c;但有些情況向&#xff0c;我們確實需要向Category中添加屬性&#xff0c;而且很多系統的API也有一些在Category添加屬性的情況&#xff0c;…

Ajax — cropper (圖片剪裁)基本用法

jQuery-cropper插件完整的API&#xff1a;http://www.jq22.com/jquery-info9322 1. 基本使用步驟 在 <head> 中導入 cropper.css 樣式表&#xff1a; <link rel"stylesheet" href"/assets/lib/cropper/cropper.css" />在 <body> 的結…

「短篇小說」靈囚 540 天

轉載&#xff1a;知乎 - BIMBOX 孫彬 - https://zhuanlan.zhihu.com/p/24655832 「我們總有一天會逾越那條上帝劃好的界限&#xff0c;而最終我們將無法面對真實和虛假&#xff0c;正義與罪惡。」 「不幸的是&#xff0c;從伊甸園那一次&#xff0c;我們就已經越界了。」 第十天…

iOS 夠逼格的注釋總結

首先關于注意這里就不說什么VVDocument了&#xff0c;來點新鮮的&#xff01; 也許你使用過#warning 警告提示 也許你也使用過#pragma marks。 但是你見過或者使用過下面這個嗎&#xff1f; Comments containing:MARK:TODO:FIXME:!!!:???: 沒有&#xff0c;那么你就快速的看…

Git圖形化管理工具

Git圖形化管理工具 注意&#xff1a;必須在創建的倉庫中進行右鍵打開 復制這段內容后打開百度網盤App&#xff0c;操作更方便哦。 鏈接&#xff1a;https://pan.baidu.com/s/1eXIk01LXSmzmXvYfw3MnEA 提取碼&#xff1a;J166 --來自百度網盤超級會員V5的分享 分類 sourceTr…

TCP/IP(一):數據鏈路層

背景 這一系列的文章主要是為一般的、非專業開發崗位(如移動端)的工程師準備&#xff0c;一方面可以對網絡的基本知識有基本的了解&#xff0c;另一方面不至于面試中被問到相關問題時束手無策。知識以 TCP/IP 協議簇為主&#xff0c;也會有應用層和數據鏈路層的簡單介紹。 文…

富文本和封面制作

1. 富文本編輯器的實現步驟 添加如下的 layui 表單行&#xff1a; <div class"layui-form-item"><!-- 左側的 label --><label class"layui-form-label">文章內容</label><!-- 為富文本編輯器外部的容器設置高度 --><div…

Linux系統編程——線程(1)

目錄 線程概要Linux內核線程實現原理線程的共享/不共享資源線程優缺點線程控制原語pthread_selfpthread_createpthread_exitpthread_joinpthread_cancel終止線程方式控制原語對比前情提要&#xff1a; Linux用戶級線程和內核級線程區別 線程概要 Linux內核線程實現原理 類Unix系…

TCP/IP(二):IP協議

IP協議處于OSI參考模型的第三層——網絡層&#xff0c;網絡層的主要作用是實現終端節點間的通信。IP協議是網絡層的一個重要協議&#xff0c;網絡層中還有ARP(獲取MAC地址)和ICMP協議(數據發送異常通知) 數據鏈路層的作用在于實現同一種數據鏈路下的包傳遞&#xff0c;而網絡層…

Ajax — 大事件項目(第四天)

分類管理 添加分類 初步使用彈出層 給 “添加分類” 綁定一個單擊事件單擊事件中&#xff0c;使用 layer.open() 實現一個彈出層 type: 1, 彈層的類型是頁面層title, “添加文字分類”content: ‘字符串&#xff0c;DOM’,area: [‘500px’, ‘250px’] // ---------------…

redis學習(四)

一、Redis 鍵(key) 1、Redis 鍵命令用于管理 redis 的鍵。 2、Redis 鍵命令的基本語法如下&#xff1a;redis 127.0.0.1:6379> COMMAND KEY_NAME 3、常用key命令 keys * 獲取所有的keyselect 0 選擇第一個庫move myString 1 將當前的數據庫key移動到某個…

TCP/IP(三):IP協議相關技術

在前兩篇文章中&#xff0c;我分別介紹了數據鏈路層和網絡層的IP協議。雖然這個系列教程的重點是搞定 TCP/IP&#xff0c;不過不用著急&#xff0c;本文簡要介紹完與 IP 協議相關的技術&#xff0c;下一篇文章就會正式、詳細的介紹 傳輸層與 TCP 協議。這篇文章會介紹 DNS、ARP…

Node — 第一天

Node-01 會 JavaScript&#xff0c;就能學會 Node.js&#xff01;&#xff01;&#xff01; **Node.js 的官網地址&#xff1a; ** Node.js 的學習路徑&#xff1a; JavaScript 基礎語法 Node.js 內置 API 模塊&#xff08;fs、path、http等&#xff09; 第三方 API 模塊&…

TCP/IP(四):TCP 與 UDP 協議簡介

從本章開始&#xff0c;我們開始介紹最重要的傳輸層。傳輸層位于 OSI 七層模型的第四層&#xff08;由下往上&#xff09;。顧名思義&#xff0c;傳輸層的主要作用是實現應用程序之間的通信。網絡層主要是保證不同數據鏈路下數據的可達性&#xff0c;至于如何傳輸數據則是由傳輸…

Node — 第二天

http模塊 搭建服務器的步驟 ① 導入 http 模塊 ② 創建 web 服務器實例 ③ 為服務器實例綁定 request 事件&#xff0c;監聽客戶端的請求 ④ 啟動服務器 // ① 導入 http 模塊 const http require(http);// ② 創建 web 服務器實例 const server http.createServer();/…

《學習之道》第九章不要突擊工作

靈感從天而降的時刻確實是存在的。 這樣少見的創造性突破&#xff0c;通常是在經歷了一番神經緊張的準備、竭盡全力的努力&#xff0c;甚至包括熬夜工作后才姍姍來遲。這與 數學 和 科學標準的一天學習 是大不相同的。 它更像體育運動&#xff1a;每隔一陣子會有一天的比賽&…

TCP/IP(五):TCP 協議詳解

上一節 中講過&#xff0c;TCP 協議是面向有連接的協議&#xff0c;它具有丟包重發和流量控制的功能&#xff0c;這是它區別于 UDP 協議最大的特點。本文就主要討論這兩個功能。 數據包重發 數據發送 丟包重發的前提是發送方能夠知道接收方是否成功的接收了消息。所以&#…

nodeJS — 學習的筆記

Node介紹 為什么要學習Node.js 企業需求 具有服務端開發經驗更改front-endback-end全棧開發工程師基本的網站開發能力 服務端前端運維部署 多人社區 [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-MVqHkEIo-1588084625862)(C:\Users\A\AppData\R…

TCP/IP(六):HTTP 與 HTTPS 簡介

本文是準備面試過程中網絡部分總結整理的最后一篇文章&#xff0c;主要介紹以下知識&#xff1a; HTTP 協議概述POST 請求和 GET 請求Cookie 和 Session數據傳輸時的加密HTTPS 簡介 HTTP 協議 在 OSI 七層模型中&#xff0c;HTTP 協議位于最頂層的應用層中。通過瀏覽器訪問網…