【ajax第四天】JWT访问控制、axios拦截器配置、echarts图表、Git操作及事件循环练习

83 阅读8分钟

JWT访问控制

本质:一个字符串
获取:服务器给的,我们只需要了解即可
作用:鉴定用户权限
分类:
1.页面访问控制 
  本地存储有token,允许访问;没有则不允许访问
2.接口访问控制 
  token有效,允许调用;token无效(过期/被篡改),不允许调用   

axios拦截器配置

1:请求拦截器:
   作用:在请求到达服务器之前做一些统一的处理;比如说统一设置接口文档要求的请求头(token等) 
2:响应拦截器
   作用:在响应到达.then/.catch之前对响应做一些统一的处理;比如说统一处理token失效、数据剥离(将axios包裹的对象减少一层)

echarts图表

前提步骤:
  1. 下包+导包
  2. 准备一个定义了宽高的DOM容器
核心步骤:
  1. 初始化echarts实例对象
     const myChart = echarts.init(dom元素)
  2. 指定图表的配置项和数据: 可以影响图表的内容
     const option = {...}
  3. 显示图表
     myChart.setOption(option)

工作中使用echarts步骤
   1. 找示例(原则:找最类似的,找最简单的)
   2. 整合示例到自己代码中(echarts前提+核心五步骤)
   3. 调设置(查文档->慢慢调)

Git版本控制

Git基础概念

什么是Git

Git是一个分布式版本控制系统。功能:
1. 记录文件的变化
2. 查看记录信息
3. 将文件切换到记录时的状态

终端打开位置

1. 如果是配置全局,随便在哪开
2. 如果是写项目的时候,必须在项目的根目录中的空白位置开启终端

配置用户信息 (安装完Git后只需要配置一次即可)

1.配置用户名和邮箱
git config --global user.name "用户名"
git config --global user.email "邮箱"
2.查看配置项
git config --list

每次 Git 提交时都会使用这些信息作为开发者标识

Git本地操作

初始化本地仓库

作用:保存代码的变化
命令: git init
变化:多一个.git文件夹,这个.git文件夹就是Git的本地库(版本库)

忽略文件及检查文件状态

为什么要忽略文件?因为有些文件不希望提交到版本库中,比如说自动生成的文件(.vscode)
忽略文件:创建.gitignore文件 并在里面写需要被忽略文件名
工作中通常不需要我们配置.gitignore (因为默认就设置好了)

**检查文件状态(想用就用,通常想检查文件状态的时候用)
命令: git status

文件的三种状态:
1. 红色: 工作区的修改 
2. 绿色: 暂存区的修改 -> git add . 
3. nothing to commit:(版本库的修改 -> git commit -m "" )或者 刚创建项目文件夹的时候

记录每次更新到仓库

什么时候需要记录?(想记录就记录,但是工作中一般完成一个小功能做记录)
1. 当初始化仓库后,分为工作区、暂存区、版本库
2. 把工作区代码提交到暂存区
   git add .
3. 把暂存区代码提交到版本库
   git commit -m "信息"   

查看及切换历史版本

1.查看历史版本
git log --oneline (查看简略信息:查看的是当前记录及之前的)
git log           (查看详细信息)
git reflog        (查看完整历史版本)
2.切换历史版本 git reset --hard 版本号(在历史记录最左边黄色字)
3.清屏 clear

Git分支

分支操作

1. 查看分支
   git branch (查看本地所有分支)
   git branch -a  (查看远程所有分支)
2. 切换分支
   git checkout 分支名
3. 创建分支(①新分支内有所在分支的提交记录/内容 ②创建的新分支不会自动切换指针)
   git branch 新分支名
4. 合并分支  
   步骤:①切换到要合并的分支去 git checkout 分支名 
        ②合并要被合并的分支   git merge 要被合并的分支名
5. 删除分支
   git branch -d 要被删除的分支名 (只能删除已被合并的分支)
   git branch -D 要被删除的分支名  (可以删除未被合并的分支)
6. 创建及切换分支
   git checkout -b 新分支名

分支合并冲突

原因:不同分支+相同文件+相同位置+不同修改;在合并的时候一定会产生冲突(CONFLICT)

如何解决冲突?

根据VSCODE提示,手动修改冲突的文件
解决完后一定要记得记录

Git远程操作

操作远程仓库

作用:本次仓库备份;多人协作

1.新建仓库和推送 (把本地仓库上传到远程做备份)
  ①:准备一个本地仓库
  ②:远程(Gitee)新建一个空的Git仓库
  ③: git remote add origin 远程仓库地址
  ④: git push -u origin 分支名 (本地有几个分支就推送几次)

2.开发及推送
  正常开发记录 add+commit
  命令: git push
  什么时候进行推送:想推就推,但是一般来说工作中完成了一个大功能做推送
  
3. 克隆
  什么时候克隆?刚进入公司/换电脑的时候,此时因为电脑中没有项目,所以需要从远处克隆一份
  命令: git clone 远程仓库地址
  
4. 拉取(想拉就拉,拉取会把远程仓库的代码合并到本地)
  命令: git pull
  注意:一定要先拉再推
  
5. 配置SSH
   原因:ssh比https更加安全,工作中常用
   配置步骤是固定的
   好处:不用再输密码;没有warning(警告)

使用 vscode 简化命令操作

可以简化Git常用操作

使用:左侧第三个分叉的图标

1. 记录
   + - 对应add .
   √(注意:点√前需要输入提交的信息)   对应commit -m "信息" 
2. 分支
   查看->外观->状态栏 底部可以查看当前分支及切换分支
   其余都在 ... -> 分支 中
3. 推送代码到远程
   同步更改(会自动先拉再推)

事件循环面试题

选择题

点击在线答题

参考答案:DBDDC DBCDB

代码题

判断下列代码的输出顺序:

setTimeout(() => {
    console.log(1);
    new Promise((resolve, reject) => {
        resolve(2);
    }).then((res) => {
        console.log(res);
        // 3比5先进入宏队列
        setTimeout(() => {
            console.log(3);
        }, 1000);
    });
}, 0);
console.log(4);
setTimeout(() => {
    console.log(5);
}, 5000);
console.log(6);

代码一输出结果:4 6 1 2 3 5

new Promise((resolve, reject) => {
    console.log(1);
    new Promise((resolve, reject) => {
        console.log(2);
        setTimeout(() => {
            console.log(3);
        }, 0);
        console.log(4);
    });
    console.log(5);
});
setTimeout(() => {
    console.log(6);
}, 1000);
console.log(7);

代码二输出结果:1 2 4 5 7 3 6

<script>
    console.log(1);
    // 后于第二个script脚本进入宏任务队列
    setTimeout(() => {
        console.log(2);
    }, 0);
    console.log(3);
</script>
<script>
    console.log(4);
    // 后于第一个定时器进入宏任务队列
    setTimeout(() => {
        console.log(5);
    }, 0);
    console.log(6);
</script>

代码三输出结果:1 3 4 6 2 5

console.log(1);
async function fnOne() {
    console.log(2);
    await fnTwo(); // await会阻塞后面代码的执行
    console.log(3); // 这里要等到await拿到结果,进入微任务队列,然后等待被执行,相当于then
}
async function fnTwo() {
    console.log(4);
}
fnOne();
setTimeout(() => {
    console.log(5);
}, 2000);
let p = new Promise((resolve, reject) => {
    console.log(6);
    resolve();
    console.log(7);
});
// 8比5先进入宏任务队列,所以先执行
setTimeout(() => {
    console.log(8);
}, 0);
p.then(() => {
    console.log(9);
});
console.log(10);
// output: 1 2 4(3进入微任务队列)6 7 10(同步代码执行完毕)3 9(微任务执行完毕) 8 5

代码四输出结果:1 2 4 6 7 10 3 9 8 5

代码四执行过程:1 2 4(3进入微任务队列)6 7 10(同步代码执行完毕)3 9(微任务执行完毕) 8 5

// addEventListener注册的两个相同事件先后执行
// 点击事件是宏任务,在触发点击后进入宏任务队列
document.body.addEventListener("click", () => {
    let p = new Promise((resolve) => resolve(1));
    p.then((result) => console.log(result));
    console.log(2);
});
// 微任务>宏任务,只要有微任务,任何宏任务都不会被执行
// 所以先执行上一个点击事件中的微任务then,再执行第二个点击事件
document.body.addEventListener("click", () => {
    let p = new Promise((resolve) => resolve(3));
    p.then((result) => console.log(result));
    console.log(4);
});

代码五输出结果:2 1 4 3

事件循环机制总结:

  • JS代码的执行顺序是:同步代码 > 微任务 > 宏任务
  • Promise 中的代码是同步执行的,then 回调和 catch 回调是异步的(微任务)
  • script 标签本身也是一个宏任务,在网页加载时就会进入宏任务队列

async/await 梳理:

  • await 关键字只能在 async 函数内部使用
  • await 会阻塞代码的执行,等待 Promise 对象返回成功/失败的结果,然后将后面的代码放入微任务队列中(阻塞的范围限制在 async 函数中)
  • await 只能获取 Promise 成功的结果,如果想要获取失败的结果,只能在外层使用 try...catch 捕获
  • await 后面一般跟一个 Promise 对象,如果后面是一个值,会直接把值当做 Promise 对象的成功结果
  • async 的书写位置:修饰箭头函数时,写在小括号前面;修饰普通函数时,写在 function 前面

今日回顾

ajax第四天.png