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

大事件-02

fix一個bug

原因:

  • 開始做注冊的時候,頁面中只有一個 name=password的input,所以 $(‘input[name=“password”]’) 可以準確的找到元素
  • 后來做登錄的時候,頁面中多了一個name=password的input,所以$(‘input[name=“password”]’)找到的就不是注冊的密碼框了

解決辦法:

  • 給注冊的密碼框加一個 類 reg-password
  • 表單驗證的時候,根據類名來獲取密碼框 let pwd = $('.reg-password').val().trim(); // 獲取密碼

合并login分支,創建index分支

# 先把login分支的內容全部提交# 切換分支到master
git checkout master# 合并分支login
git merge login# 創建并切換到index分支(在這個分支上,開發首頁)
git checkout -b index

后臺首頁布局

完成了基本的頁面布局

去layui官網,文檔 --> 頁面布局 --> 后臺布局,把html代碼全部復制,應用到我們自己的index.html中。

修改一下layui.css 和 layui.all.js的路徑

頭部區域處理

  • 更換logo
  • 刪除頭部的一個導航菜單
  • 修改了右上角(比對線上做好的效果)

頭部字體頭像處理

新注冊的用戶,沒有圖片頭像。只能使用用戶名的首字母(大寫)當做頭像。

<!-- 在圖片前面,加一個span -->
<span class="text-avatar">A</span>

引入自己的 index.css

/*字體頭像*/
.text-avatar {width: 33px;height: 33px;margin-right: 10px;border-radius: 50%;display: inline-block;background-color: #419488;line-height: 33px;text-align: center;vertical-align: middle;color: #fff;font-size: 20px;
}/*默認先讓字體頭像隱藏*/
.text-avatar {display: none;
}

側邊欄菜單手風琴效果和默認選中狀態

  • 自己調整出三個菜單(首頁、文章管理、個人中心)
  • 實現手風琴效果
    • 給 ul 添加一個屬性 lay-shrink="all"
  • 默認讓首頁有選中狀態
    • 給 首頁 li 添加一個 layui-this
  • 默認所有菜單都是收縮狀態
    • 去掉 文章管理 li 標簽的 layui-nav-itemed

側邊欄頂級菜單使用iconfont字體圖標

  • 先看demo(/assets/fonts/demo_index.html),里面有使用方法
  • 具體使用方法
    • index.html 中加載css文件 <link rel="stylesheet" href="/assets/fonts/iconfont.css">
    • 在首頁、文章管理、個人中心、退出之前,分別加入span標簽 <span class="iconfont icon-xxx"></span>
    • 更換類名

注意,個人中心,是側邊欄的個人中心。不是頭部的

自定義樣式,調整圖標的位置

/*跳轉頂級菜單的圖標位置*/
.iconfont {margin-right: 8px;position: relative;top: 1px;
}

側邊欄子菜單使用layui字體圖標

  • 使用layui的字體圖標,不用再次引入css文件了。因為前面引入過了

  • 所以,直接在每個子菜單前面加 <i class="layui-icon layui-icon-app"></i>

  • 自定義樣式,調整一下位置 margin: 0 5px 0 15px;

側邊欄頭像和歡迎語

  • 分析:

    • 側邊欄的頭像和歡迎語和頭部的效果差不多
  • 具體做法

    • 復制頭部“個人中心”的 a 標簽,放到側邊欄 ul 前面,并且把a換成了div

      <div class="userinfo"><span class="text-avatar">A</span><img src="http://t.cn/RCzsdCq" class="layui-nav-img"><span class="welcome">歡迎&nbsp;&nbsp;老湯</span>
      </div>
      
    • 樣式

      /*側邊欄頭像和歡迎語*/
      .userinfo {display: block;height: 60px;line-height: 60px;text-align: center;
      }
      .welcome {color: #fff;font-size: 12px;user-select: none;
      }
      

iframe標簽原理

在這里插入圖片描述

  • 把原來的內容區的div換成iframe標簽

    <div class="layui-body"><!-- 內容主體區域 --><!-- <div style="padding: 15px;">內容主體區域</div> --><iframe src="/home/dashboard.html" name="fm"></iframe>
    </div>
    
  • 修改樣式

    /*iframe*/
    iframe {width: 100%;height: 100%;
    }/*去掉iframe的滾動條  --   給父級的div加 overflow:hidden */
    .layui-body {overflow: hidden;
    }
    
  • 可以自行創建兩個頁面,然后在側邊欄掛好超鏈接,指定target屬性,測試一下。

退出功能

  • 刪除token
  • 跳轉頁面到 /login.html

具體做法:

  • 創建 assets/js/index.js文件
  • index.html 加載 所需的js文件(jQuery、index.js)
  • 在index.js 中,完成退出的功能
$(function () {// 加載layer模塊let layer = layui.layer;// ---------------------  退出 -------------------$('#logout').click(function () {// 1. 詢問是否要刪除layer.confirm('確定退出嗎?', { icon: 3, title: '提示' }, function (index) {//do something// 2. 清除tokenlocalStorage.removeItem('token');// 3. 跳轉到登錄頁面location.href = '/login.html';// 關閉窗口layer.close(index);});});
})

獲取用戶信息并渲染到頁面中

思路:

  • 調用接口 /my/userinfo ,來獲取用戶的信息
  • 那獲取到的信息渲染到頁面中

步驟:

  1. 定義全局函數 getUserInfo()
  2. 頁面加載完畢,調用 getUserInfo()
  3. getUserInfo()內部,發送ajax請求,獲取用戶的信息
    • 必須在請求頭中,攜帶token,否則 請求失敗
  4. 設置歡迎語
    • 優先使用昵稱,沒有昵稱(nickname),則使用賬號(username)
  5. 設置頭像
    • 優先使用圖片
    • 沒有圖片,則使用 名字(設置文字頭像顯示,不要使用 show(),要設置css
// 定義獲取用戶信息的函數,定義一個全局函數
function getUserInfo () {$.ajax({url: 'http://www.liulongbin.top:3007/my/userinfo',success: function (res) {// console.log(res);if (res.status === 0) {// 渲染頁面// 1. 歡迎你 用戶名(優先使用nickname、沒有的話,使用username)let name = res.data.nickname || res.data.username;$('.welcome').html('歡迎&nbsp;&nbsp;' + name); // 必須使用html,不能使用text,因為 &nbsp; 也是HTML// 2. 頭像(優先使用圖片、沒有圖片使用name)if (res.data.user_pic) {$('.layui-nav-img').attr('src', res.data.user_pic);// 讓圖片顯示、讓文字隱藏$('.layui-nav-img').show();$('.text-avatar').hide();} else {let w = name.substr(0, 1).toUpperCase();// 讓文字頭像顯示,不要用show,因為show方法會讓盒子display: block$('.text-avatar').text(w).css('display', 'inline-block');$('.layui-nav-img').hide();}}},headers: {Authorization: localStorage.getItem('token')}});
}

合并index分支,創建user分支

# 先把index分支的代碼全部提交
# 切換到master
git checkout master# 合并index到master
git merge index# 創建新分支user,并且切換 (用于開發個人中心)
git checkout -b user

用戶基本信息

準備工作

  • 創建HTML文件、css文件、js文件
    • 創建 /user/userinfo.html
    • 創建 /assets/css/user/userinfo.css
    • 創建 /assets/js/user/userinfo.js
  • userinfo.html 中加載所需的css和js文件(layui.css/自己的css、jQuery、layui.all.js、自己的js)
  • index.html 頭部和側邊欄,掛超鏈接,鏈接到 /user/userinfo.html

頁面布局

使用layui的卡片面板來布局

  • layui文檔 --> 頁面元素 --> 面板 --> 卡片面板
  • 內容區里面放表單
<div class="layui-card"><!-- 卡片面板的標題區 --><div class="layui-card-header">修改用戶信息</div><!-- 卡片面板的內容區 --><div class="layui-card-body"><!-- 表單區 --><form class="layui-form" action=""><!-- 第一行:登錄名稱 --><div class="layui-form-item"><label class="layui-form-label">登錄名稱</label><div class="layui-input-block"><input type="text" name="title" required lay-verify="required"autocomplete="off" class="layui-input"></div></div><!-- 第二行:用戶昵稱 --><div class="layui-form-item"><label class="layui-form-label">用戶昵稱</label><div class="layui-input-block"><input type="text" name="title" required lay-verify="required" placeholder="請輸入昵稱"autocomplete="off" class="layui-input"></div></div><!-- 第三行:用戶郵箱 --><div class="layui-form-item"><label class="layui-form-label">用戶郵箱</label><div class="layui-input-block"><input type="text" name="title" required lay-verify="required" placeholder="請輸入郵箱"autocomplete="off" class="layui-input"></div></div><!-- 第四行:按鈕 --><div class="layui-form-item"><div class="layui-input-block"><button class="layui-btn" lay-submit lay-filter="formDemo">提交修改</button><button type="reset" class="layui-btn layui-btn-primary">重置</button></div></div></form></div></div>

CSS樣式:

.layui-card {margin: 20px 20px 0 20px;
}.layui-form {width: 500px;
}

我們需要把 index.css 里面的 iframe 加一個灰色的背景色。

為表單賦值

思路:

  • 發送ajax請求,獲取用戶信息
  • 設置表單各項(每個輸入框)的value值。

具體步驟:

  • 先設置表單各項的name屬性

  • 發送ajax請求

  • 根據表單各項的name屬性,找到每個input,分別設置value值

細節問題:

  • 加一個隱藏域 id <input type="hidden" name="id" />,放到表單里面的任意位置,一會提交表單的時候用
  • 設置賬號readonly,表示該項不能修改
// ------------------   獲取用戶信息,為表單賦值(設置表單各項的默認值) ---------
$.ajax({url: 'http://www.liulongbin.top:3007/my/userinfo',success: function (res) {console.log(res);// 設置表單的四項值(id/username/nickname/email)$('input[name="id"]').val(res.data.id);$('input[name="nickname"]').val(res.data.nickname);$('input[name="username"]').val(res.data.username);$('input[name="email"]').val(res.data.email);},headers: {Authorization: localStorage.getItem('token')}
});

HTML代碼:

<!--form中加一個隱藏域-->
<input type="hidden" name="id"><!-- 設置每個input的name -->
id / username / nickname / email<!-- 設置登錄賬號的readonly屬性 -->
<input readonly type="text" name="username" required lay-verify="required" autocomplete="off" class="layui-input">

使用layui的from模塊快速為表單賦值

  • 為表單設置 lay-filter="user" ,值隨便定義,我這里使用的是user

  • JS代碼中,一行代碼為表單賦值

    let form = layui.form;
    form.val('user', res.data);
    
    • 要求,res.data 這個對象的屬性(key)要和表單各項的name屬性值相同,才能賦值

完成更新用戶信息的功能

  • 注冊表單的提交事件
  • 阻止默認行為
  • 收集表單數據(form.val(‘user’) 或者 使用 $(‘form’).serialize() 都行)
  • 發送ajax請求,完成更新
  • 更新成功之后,提示,并且調用父頁面的 getUserInfo() 從新渲染用戶的頭像
// ------------------   表單提交的時候,完成用戶信息的更新 -----------------// 1. 注冊表單的提交事件$('form').on('submit', function (e) {// 2. 阻止默認行為e.preventDefault();// 3. 收集表單數據let data = form.val('user');// console.log(data); // {id: "900", username: "abcdabcd", nickname: "你好123", email: "232323@qq.comadsf"}// 刪除掉username,因為接口不需要這個參數。不過這個接口測試過,傳過去也沒事// 4. ajax提交數據給接口$.ajax({type: 'POST',url: 'http://www.liulongbin.top:3007/my/userinfo',data: data,headers: {Authorization: localStorage.getItem('token')},success: function (res) {// console.log(res);if (res.status === 0) {// 5. 修改成功,給出提示,調用父頁面的getUserInfo函數,從新渲染index.html layer.msg(res.message);// 調用父頁面的getUserInfo函數,從新渲染index.html window.parent.getUserInfo();}}});});

表單驗證

優化Ajax請求

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

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

相關文章

OpenCV自帶dnn的Example研究(3)— object_detection

這個博客系列&#xff0c;簡單來說&#xff0c;今天我們就是要研究https://docs.opencv.org/master/examples.html下的6個文件&#xff0c;看看在最新的OpenCV中&#xff0c;它們是如何發揮作用的。在配置使用的過程中&#xff0c;需要注意使用較高版本的VS避免編譯器兼容問題&…

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

大事件-03 用戶信息 表單驗證 html中&#xff0c;直接使用layui提供的內置驗證規則 email <input type"text" name"email" required lay-verify"required|email" placeholder"請輸入郵箱" autocomplete"off" class&q…

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 協議最大的特點。本文就主要討論這兩個功能。 數據包重發 數據發送 丟包重發的前提是發送方能夠知道接收方是否成功的接收了消息。所以&#…