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.mzph.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运行时-使用Runtime向Category中添加属性以及运行时介绍

前言 了解OC的都应该知道&#xff0c;在一般情况下&#xff0c;我们是不能向Category中添加属性的&#xff0c;只能添加方法&#xff0c;但有些情况向&#xff0c;我们确实需要向Category中添加属性&#xff0c;而且很多系统的API也有一些在Category添加属性的情况&#xff0c;…

Git图形化管理工具

Git图形化管理工具 注意&#xff1a;必须在创建的仓库中进行右键打开 复制这段内容后打开百度网盘App&#xff0c;操作更方便哦。 链接&#xff1a;https://pan.baidu.com/s/1eXIk01LXSmzmXvYfw3MnEA 提取码&#xff1a;J166 --来自百度网盘超级会员V5的分享 分类 sourceTr…

TCP/IP(一):数据链路层

背景 这一系列的文章主要是为一般的、非专业开发岗位(如移动端)的工程师准备&#xff0c;一方面可以对网络的基本知识有基本的了解&#xff0c;另一方面不至于面试中被问到相关问题时束手无策。知识以 TCP/IP 协议簇为主&#xff0c;也会有应用层和数据链路层的简单介绍。 文…

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();/…

TCP/IP(五):TCP 协议详解

上一节 中讲过&#xff0c;TCP 协议是面向有连接的协议&#xff0c;它具有丢包重发和流量控制的功能&#xff0c;这是它区别于 UDP 协议最大的特点。本文就主要讨论这两个功能。 数据包重发 数据发送 丢包重发的前提是发送方能够知道接收方是否成功的接收了消息。所以&#…

TCP/IP(六):HTTP 与 HTTPS 简介

本文是准备面试过程中网络部分总结整理的最后一篇文章&#xff0c;主要介绍以下知识&#xff1a; HTTP 协议概述POST 请求和 GET 请求Cookie 和 Session数据传输时的加密HTTPS 简介 HTTP 协议 在 OSI 七层模型中&#xff0c;HTTP 协议位于最顶层的应用层中。通过浏览器访问网…

Node — 第三天

模块化 什么是模块化 模块化是指解决一个复杂问题时&#xff0c;自顶向下逐层把系统划分成若干模块的过程。 对于整个系统来说&#xff0c;模块是可组合、分解和更换的单元。 生活中的模块化 编程中的模块化 编程领域中的模块化&#xff0c;就是遵守固定的规则&#xff0c;…

FireDAC 中文字段过滤问题

当使用 FireDAC Filter 过滤数据的时候&#xff0c;通常这样写&#xff1a; FDMemTable.Filtered : False; FDMemTable1.Filter : 姓名 string(edtFilter.Text).QuotedString; FDMemTable.Filtered : True; 将会报错&#xff1a;[FireDAC][Stan][Eval]-107. Invalid characte…

Express — 使用步骤

Express Express 介绍安装搭建服务器的步骤express提供的新方法GET接口 获取GET中的请求参数 POST接口 获取POST请求提交的数据 中间件原理中间件语法中间件初体验&#xff08;设置响应头&#xff09;中间件开放静态资源中间件接收POST请求体中间件返回404页面 express 介绍 E…

大模型工具_Langchain-Chatchat

https://github.com/chatchat-space/Langchain-Chatchat 原Langchain-ChatGLM 1 功能 整体功能&#xff0c;想解决什么问题 基于 Langchain 与 ChatGLM 等LLM模型&#xff0c;搭建一套针对中文场景与开源模型&#xff0c;界面友好、可离线运行的知识库问答解决方案。 当前解决…

iOS 键盘风格详解UIKeyboardType

一、键盘风格 UIKit框架支持8种风格键盘。 [java] view plaincopy print?typedef enum { UIKeyboardTypeDefault, // 默认键盘&#xff1a;支持所有字符 UIKeyboardTypeASCIICapable, // 支持ASCII的默认键盘 UIKeyboardTypeNu…