AJAX 05 axios拦截器、数据管理平台

news2024/11/16 3:13:51

AJAX 学习

  • AJAX 05 黑马头条-数据管理平台
    • 项目准备
    • 业务1:验证码登录
      • bootstrap提示框
      • 实际业务中的验证码登录
      • token
    • 【注】HTML遗落的知识
    • 【注】JS遗漏的知识
    • 业务2:个人信息设置 & axios拦截器
      • axios请求拦截器
      • axios响应拦截器
    • 业务3:发布文章
      • 1. 富文本(wangEditor 插件)
      • 2. 频道列表
      • 3. 封面设置
      • 4. 收集并保存(form-serialize插件)
      • 5、文章列表展示
      • 6、筛选功能
      • 7、分页
      • 8、删除文章
        • 删除最后一条时的问题
      • 9、编辑文章(页面跳转传参)
      • 10、退出登录

AJAX 05 黑马头条-数据管理平台

注册登陆界面:

账号默认在登陆时就完成注册

密码默认只能是246810

API地址:https://apifox.com/apidoc/shared-1b0dd84f-faa8-435d-b355-5a8a329e34a8/api-87683418

功能:

  1. 登录和权限判断
  2. 查看文章内容列表(筛选,分页)
  3. 编辑文章(数据回显)
  4. 删除文章
  5. 发布文章(图片上传,富文本编辑器)

项目准备

技术:

• 基于 Bootstrap 搭建网站标签和样式

• 集成 wangEditor 插件实现富文本编辑器

• 使用原生 JS 完成增删改查等业务

• 基于 axios 与黑马头条线上接口交互

• 使用 axios 拦截器进行权限判断

项目准备: 准备配套的素材代码

包含:html,css,js,静态图片,第三方插件等等

目录管理: 建议这样管理,方便查找

• assets:资源文件夹(图片,字体等)

• lib:资料文件夹(第三方插件,例如:form-serialize)

• page:页面文件夹

• utils:实用程序文件夹(工具插件)

业务1:验证码登录

目标:完成验证码登录,后端设置验证码默认为 246810

原因:因为短信接口不是免费的,防止攻击者恶意盗刷

步骤:

  1. 在 utils/request.js 配置 axios 请求基地址

作用:提取公共前缀地址,配置后 axios 请求时都会 baseURL + url

  1. 收集手机号和验证码数据
  2. 基于 axios 调用验证码登录接口
  3. 使用 Bootstrap 的 Alert 警告框反馈结果给用户

bootstrap提示框

已经写好了一个
在这里插入图片描述

默认是不显示的,加上show类才会显示。加上alert-danger 或者alert-success才会有样式。

在JS中我们有封装一个函数

V:\Web\mycode\AJAX\5-黑马头条-数据管理平台\page\login\index.js

实际业务中的验证码登录

在这里插入图片描述

在这一部分,前端调用了两个接口

token

概念:访问权限的令牌,本质上是一串字符串

创建:正确登录后,由后端签发并返回
在这里插入图片描述

作用:判断是否有登录状态等,控制访问权限

注意:前端只能判断 token 有无,而后端才能判断 token 的有效性
在这里插入图片描述

目标:只有登录状态,才可以访问内容页面

步骤:

  1. 在 utils/auth.js 中判断无 token 令牌字符串,则强制跳转到登录页(手动修改地址栏测试)
  2. 在登录成功后,保存 token 令牌字符串到本地,再跳转到首页(手动修改地址栏测试)

在这里插入图片描述

总结
1. token 的作用?
✓ 判断用户是否有登录状态等
2. token 的注意:
✓ 前端只能判断 token 的有无
✓ 后端通过解密可以提取 token 字符串的原始信息,判断有效性

【注】HTML遗落的知识

1、form表单一定需要name属性才能提交

2、input 默认的值 可以在 value中设置

在这里插入图片描述

3、下拉框 HTML获取不到 文字,只能获取 value属性

4、JS 的引入要有顺序,比如在登陆页面index.js中 我的弹框 是调用alert.js里的函数得到的,那么在主页面引入的时候,上下顺序不可以反
在这里插入图片描述

5、label可以关联form表单元素 :【做法】把label中的for属性 和 表单中的id设置为一样,就能关联
在这里插入图片描述

这里的意思是,不管是 点击了“封面”这个label元素,还是点击了 “+”加号这个 label元素,都会触发input 这个元素选择,(而且这个元素选择是被隐藏的)

6、清空表单

const form = document.querySelector('form')
form.reset()
只能清空表单元素

【注】JS遗漏的知识

1、classList进行add和remove 的时候不可以加点

document.querySelector('.place').classList.add('hide')

比如上文,hide是类名,前面不能加点

2、当点击 一个元素的时候,想要触发另一个元素的事件怎么办

——直接调用 该元素的事件函数

document.querySelector('.rounded').addEventListener('click', () =>{
  document.querySelector('.img-file').click()
})

3、删除对象data中的id属性

delete data.id

业务2:个人信息设置 & axios拦截器

需求:设置用户昵称

语法:axios 可以在 headers 选项传递请求头参数
在这里插入图片描述

总结:

  1. 什么是 axios 请求拦截器?

✓ 发起请求之前,调用的一个函数,对请求参数进行额外的设置

  1. axios 请求拦截器,什么时候使用?

✓ 有公共配置和设置时,统一设置在请求拦截器中

axios请求拦截器

尚硅谷

https://www.bilibili.com/video/BV1wr4y1K7tq?p=10&vd_source=ceab44fb5c1365a19cb488ab650bab03

因为在功能模块 个人信息渲染页面/所有频道渲染页面/文章列表,都需要用户资料。所以设置一个请求拦截器,每次都在请求头header处携带上token

这是一个请求拦截器,config是本次请求的配置参数

// 这个JS文件 每个页面都引入了
axios.interceptors.request.use(function (config) {
  // 在发送请求之前做些什么
  console.log('===请求拦截器===');
  console.log(config);
  // 统一携带token令牌字符串在请求头上
  const token = localStorage.getItem('token')
  token && (config.headers.Authorization = `Bearer ${token}`)
  console.log(config);
  console.log('===请求拦截器===');
  return config
}, function (error) {
  // 对请求错误做些什么
  return Promise.reject(error)
})

axios响应拦截器

axios 响应拦截器:响应回到 then/catch 之前,触发的拦截函数,对响应结果统一处理

例如:身份验证失败,统一判断并做处理
在这里插入图片描述


axios.interceptors.response.use(function (response) {
  // 2xx 范围内的状态码都会触发该函数。
  return response;
}, function (error) {
  // 超出 2xx 范围的状态码都会触发该函数。
  // 对响应错误做点什么,例如:判断响应状态为 401 代表身份验证失败
  console.dir(error);
  if (error?.response?.status === 401) {
    alert('登录状态过期,请重新登录')
    localStorage.clear()//清空本地缓存
    window.location.href = '../login/index.html'// 回到登陆页面
  }
  return Promise.reject(error);
});
总结
1. 什么是 axios 响应拦截器?
✓ 响应回到 then/catch 之前,触发的拦截函数,对响应结果统一处理
2. axios 响应拦截器,什么时候触发成功/失败的回调函数?
✓ 状态为 2xx 触发成功回调,其他则触发失败的回调函数

通过响应拦截器优化服务器相应效果
在这里插入图片描述

axios.interceptors.response.use(function (response) {
  // 2xx 范围内的状态码都会触发该函数。
  const result = response.data
  return result;
}, function (error) {
  // 略
});

业务3:发布文章

1. 富文本(wangEditor 插件)

富文本:带样式,多格式的文本,在前端一般使用标签配合内联样式实现

富文本编辑器:用于编写富文本内容的容器
在这里插入图片描述

目标:发布文章页,富文本编辑器的集成

使用:wangEditor 插件

步骤:参考文档

https://www.wangeditor.com/v5/getting-started.html

  1. 引入 CSS 定义样式
  2. 定义 HTML 结构
  3. 引入 JS 创建编辑器
  4. 监听内容改变,保存在隐藏文本域(便于后期收集)
  <link rel="stylesheet" href="https://cdn.bootcdn.net/ajax/libs/wangeditor5/5.1.23/css/style.min.css">
  <script src="https://cdn.bootcdn.net/ajax/libs/wangeditor5/5.1.23/index.min.js"></script>

2. 频道列表

在这里插入图片描述

3. 封面设置

在这里插入图片描述

label可以关联form表单元素 :【做法】把label中的for属性 和 表单中的id设置为一样,就能关联

在这里插入图片描述

这里的意思是,不管是 点击了“封面”这个label元素,还是点击了 “+”加号这个 label元素,都会触发input 这个元素选择,(而且这个元素选择是被隐藏的)

刚开始 <img class="rounded">这个标签是被隐藏的,因为没有选择图片。它和<label for="img" class="place">+</label>的关系是,当有图片之后,让label隐藏,让img显示
在这里插入图片描述

通过我们的定义的 show hide类 就可以实现<img class="rounded">

<label for="img" class="place">+</label>的切换
在这里插入图片描述

代码实战:
在这里插入图片描述

// 文件选择对象; <input type="file" name="" id="">

document.querySelector('.img-file').addEventListener('change',
async e => {
  // 选择文件并保存在 FormData
  const file = e.target.files[0] // 文件对象
  const fd = new FormData()
  fd.append('image', file)

  // 单独上传图片并得到图片 URL 网址
  const res = await axios({
    url: '/v1_0/upload',
    method: 'POST',
    data: fd
  })

  const imgUrl = res.data.url
  document.querySelector('.rounded').src = imgUrl
  // 隐藏加号
  document.querySelector('.place').classList.add('hide')
  // 显示图片
  document.querySelector('.rounded').classList.add('show')
  
})

但是此时有一个问题,当 <img class="rounded">显示之后,我想切换图片,但是无法触发了,因为<label for="img" class="place">+</label>被隐藏了。

所以当点击img时,用 JS 的方式触发文件选择元素 的click 事件

document.querySelector('.rounded').addEventListener('click', () =>{
  document.querySelector('.img-file').click()
})

4. 收集并保存(form-serialize插件)

在这里插入图片描述

5、文章列表展示

目标1:获取文章列表并展示

1.1 准备查询参数对象

1.2 获取文章列表数据

1.3 展示到指定的标签结构中

在这里插入图片描述

6、筛选功能

在这里插入图片描述

注意这里 的实现是 先绑定,而不是等到点击按钮之后再绑定

document.querySelectorAll('.form-check-input').forEach(item => {
  item.addEventListener('change',e => {
    aObj.staus = e.target.value
  })
})

document.querySelector('.form-select').addEventListener('change',
e => {
  console.log(e.target.value);
})

document.querySelector('.sel-btn').addEventListener('click',
e => {
  getAllArticle()
})

7、分页

在这里插入图片描述

/**
 * 目标3:分页功能
 *  3.1 保存并设置文章总条数
 *  3.2 点击下一页,做临界值判断,并切换页码参数并请求最新数据
 *  3.3 点击上一页,做临界值判断,并切换页码参数并请求最新数据
 */

// 文章总条数
let totalCount = 0

// 点击下一页,做临界值判断
document.querySelector('.next').addEventListener('click',e => {
  if(aObj.page < Math.ceil(totalCount / aObj.per_page)) {
    aObj.page++
    getAllArticle()
    document.querySelector('.page-now').innerHTML = `${aObj.page}`
  }
})
// 点击下一页
document.querySelector('.last').addEventListener('click',e => {
  if(aObj.page > 1) {
    aObj.page--
    getAllArticle()
    document.querySelector('.page-now').innerHTML = `${aObj.page}`
  }
})

8、删除文章

在这里插入图片描述

点击删除图标,删除该篇文章

要使用事件委托,文章是使用模板字符串动态添加的,所以将文章ID 绑定在父元素TD上。一个编辑一个删除都需要文章ID 在这里插入图片描述

删除最后一条时的问题

在这里插入图片描述

9、编辑文章(页面跳转传参)

在这里插入图片描述


// 点击编辑 获取文章ID 跳转到发布文章页面传递ID
document.querySelector('.art-list').addEventListener('click', async e => {
  if(e.target.classList.contains('edit')) {
    const aID = e.target.parentNode.dataset.id
    // ..回到父级的父级
    location.href = `../publish/index.html?id=${aID}`
  }
})

跨页面传参

async 和 awiat就近原则

10、退出登录

在这里插入图片描述

// 3.1 绑定点击事件
document.querySelector('.quit').addEventListener('click', e => {
  // 3.2 清空本地缓存,跳转到登录页面
  localStorage.clear()
  location.href = '../login/index.html'
})

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1518087.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网络架构层_服务器上下行宽带

网络架构层_服务器上下行宽带 解释一 云服务器ECS网络带宽的概念、计费、安全及使用限制_云服务器 ECS(ECS)-阿里云帮助中心 网络带宽是指在单位时间&#xff08;一般指的是1秒钟&#xff09;内能传输的数据量&#xff0c;带宽数值越大表示传输能力越强&#xff0c;即在单位…

mysql 主从延迟分析

一、如何分析主从延迟 分析主从延迟一般会采集以下三类信息。 从库服务器的负载情况 为什么要首先查看服务器的负载情况呢&#xff1f;因为软件层面的所有操作都需要系统资源来支撑。 常见的系统资源有四类&#xff1a;CPU、内存、IO、网络。对于主从延迟&#xff0c;一般会…

提前十分钟!有方法论的人和没有方法论的人,谁更从容?弱者不应被错误引导——早读(逆天打工人爬取热门微信文章解读)

熬夜不熬夜&#xff0c;取决于你的生活态度 引言Python 代码第一篇 人民日报 提前十分钟&#xff0c;人生大不同第二篇 人民日报 来啦 新闻早班车要闻社会政策 结尾 君子如潜龙&#xff0c;藏器待时发 紧握时间的脉搏&#xff0c;提前规划十分钟 既显对他人的敬意&#xff0c;亦…

并发编程之创建线程的几种方式以及运行的详细解析

3.1 创建和运行线程 方法一&#xff0c;直接使用 Thread // 创建线程对象 Thread t new Thread() {public void run() {// 要执行的任务} }; // 启动线程 t.start(); 例如&#xff1a; // 构造方法的参数是给线程指定名字&#xff0c;推荐 Thread t1 new Thread("t1…

04- 基于SpringAMQP封装RabbitMQ,消息队列的Work模型和发布订阅模型

SpringAMQP 概述 使用RabbitMQ原生API在代码中设置连接MQ的参数比较繁琐,我们更希望把连接参数写在yml文件中来简化开发 SpringAMQP是基于AMQP协议定义的一套API规范,将RabbitMQ封装成一套模板用来发送和接收消息 AMQP(Advanced Message Queuing Portocol)是用于在应用程序…

go语言基础笔记

1.基本类型 1.1. 基本类型 bool int: int8, int16, int32(rune), int64 uint: uint8(byte), uint16, uint32, uint64 float32, float64 string 复数&#xff1a;complex64, complex128 复数有实部和虚部&#xff0c;complex64的实部和虚部为32位&#xff0c;complex128的实部…

某赛通电子文档安全管理系统 DecryptApplication 任意文件读取漏洞(2024年3月发布)

漏洞简介 某赛通电子文档安全管理系统 DecryptApplication 接口处任意文件读取漏洞&#xff0c;未经身份验证的攻击者利用此漏洞获取系统内部敏感文件信息&#xff0c;导致系统处于极不安全的状态。 漏洞等级高危影响版本*漏洞类型任意文件读取影响范围>1W 产品简介 …

案例分析篇06:数据库设计相关28个考点(17~22)(2024年软考高级系统架构设计师冲刺知识点总结系列文章)

专栏系列文章推荐: 2024高级系统架构设计师备考资料(高频考点&真题&经验)https://blog.csdn.net/seeker1994/category_12593400.html 【历年案例分析真题考点汇总】与【专栏文章案例分析高频考点目录】(2024年软考高级系统架构设计师冲刺知识点总结-案例分析篇-…

Jmeter入参问题小记

表单入参的时候&#xff0c;这个地方需要勾选&#xff0c;如果不☑️选的话&#xff0c;会提示errorMsg":"Required String parameter code is not present",

Leet code 三步问题

解题思路&#xff1a;动态规划 先观察 1级台阶 1种方法 2级台阶 2种方法 3级台阶 4种方法 4级台阶 7种方法 5级台阶 13种方法 可以看出规律 从3级台阶后 每级台阶需要从前三层台阶和相加 注意&#xff1a;后面值会过大 需要在相加之后就模运算1000000007 代码如下 clas…

.NET高级面试指南专题十八【 外观模式模式介绍,提供了简化的接口,隐藏系统的复杂性】

介绍&#xff1a; 外观模式是一种结构设计模式&#xff0c;它提供了一个统一的接口&#xff0c;用于访问子系统中的一组接口。外观模式定义了一个高层接口&#xff0c;使得子系统更容易使用。 原理&#xff1a; 外观类&#xff08;Facade Class&#xff09;&#xff1a;提供了一…

C++面试问题收集

0 持续更新中 目录 0 持续更新中 1 C语言相关 1.1 malloc/free和new/delete区别 1.2 内存泄漏 1.3 堆区和栈区的区别 1.4 宏定义和const的区别 1.5 多态 1.6 类中的静态成员变量 2 操作系统相关 2.1 进程和&#xff08;用户&#xff09;线程的区别 2.2 系统调用 2.3…

【论文阅读】MoCoGAN: Decomposing Motion and Content for Video Generation

MoCoGAN: Decomposing Motion and Content for Video Generation 引用&#xff1a; Tulyakov S, Liu M Y, Yang X, et al. Mocogan: Decomposing motion and content for video generation[C]//Proceedings of the IEEE conference on computer vision and pattern recognitio…

【Java基础】IO流(二)字符集知识

目录 字符集知识 1、GBK字符集 2、Unicode字符集&#xff08;万国码&#xff09; 3、乱码 4、Java中编码和解码的方法 字符集知识 字符&#xff08;Character&#xff09;&#xff1a;在计算机和电信技术中&#xff0c;一个字符是一个单位的字形、类字形单位或符号的基本信…

最详细数据仓库项目实现:从0到1的电商数仓建设(采集部分)

1、数据库和数据仓库的区别&#xff1a; 数据仓库就是data warehouse&#xff0c;数据小卖店&#xff0c;相当于是对数据加工&#xff0c;计算然后对外提供服务&#xff0c;而不是单纯的存储 2、数据流转过程中数据仓库中的数据源部分 数据源部分的数据**不是只同步数据库当…

YOLOv8改进 | 图像去雾 | 特征融合注意网络FFA-Net增强YOLOv8对于模糊图片检测能力(北大和北航联合提出)

一、本文介绍 本文给大家带来的改进机制是由北大和北航联合提出的FFA-net: Feature Fusion Attention Network for Single Image Dehazing图像增强去雾网络,该网络的主要思想是利用特征融合注意力网络(Feature Fusion Attention Network)直接恢复无雾图像,FFA-Net通过特征…

海格里斯HEGERLS托盘搬运机器人四向车引领三维空间集群设备柔性运维

随着市场的不断迅猛发展变化&#xff0c;在物流仓储中&#xff0c;无论是国内还是海外&#xff0c;都对托盘式解决方案需求量很大。顾名思义&#xff0c;托盘式解决方案简单理解就是将产品放置在托盘上进行存储、搬运和拣选。 面对托盘式方案需求&#xff0c;行业中常见的方案是…

Wechaty 企业微信机器人报:return ‘port‘ in address

1.使用的依赖&#xff1a; "file-box": "^1.5.5", "qrcode": "^1.5.3", "install": "^0.13.0", "grpc/grpc-js": "^1.10.1","juzi/wechaty": "^1.0.65", "juzi/wec…

学习使用js获取当前ip地址的方法,使用第三方API获取ip地址

学习使用js获取当前ip地址的方法,使用第三方API获取ip地址 使用 DNS 查询使用第三方 API 使用 DNS 查询 DNS 是一种用于解析主机名为 IP 地址的系统。可以使用 JavaScript DNS 查询来获取本机IP地址。下面是如何使用 JavaScript 进行DNS查询的示例代码。 <p class"loc…

csp模拟题(201604-2,俄罗斯方块模拟下坠)

题目 问题描述 俄罗斯方块是俄罗斯人阿列克谢帕基特诺夫发明的一款休闲游戏。   游戏在一个15行10列的方格图上进行&#xff0c;方格图上的每一个格子可能已经放置了方块&#xff0c;或者没有放置方块。每一轮&#xff0c;都会有一个新的由4个小方块组成的板块从方格图的上方…