自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(101)
  • 收藏
  • 关注

原创 网站扫码登录时怎么一回事?

说说你认识的浏览器安全XSSxss的 本质是恶意代码未经过滤,与网站正常的代码混在一起;浏览器无法分辨哪些脚本是可信的,导致恶意脚本被执行。XSS 分类存储型 XSS攻击者将恶意代码提交到目标网站的数据库,用户打开网站的时候从数据库取出,拼接在 HTML 中返回给浏览器,恶意代码窃取用户信息并发到攻击者的网站。反射型 XSS攻击者构造出特殊的 URL,其中包含恶意代码,目标网站将恶意代码从URL取出,拼接成html返回给浏览器,恶意代码窃取用户信息并发到攻击者的网站。由于需要用户主动打开恶意的

2021-09-24 21:18:14 738

原创 和我一起解刨基于Vue2.0+Vuex+element-ui的后台管理(三)之如何由进行动态路由分配

Target&StepThree——如何由进行动态路由分配我是基于原项目进行修改的,可以Start我的仓库,相关笔记和代码都会实时更新的。点击这里本项目路由是动态的,因为我们项目用户可以进行添加页面,这样页面不断的迭代更新,前端每次都要提交代码给后端,着实有点麻烦,所以我们可以提供根据用户的动态路由表进行动态渲染页面。这里的路由分为两种,constantRoutes 和 asyncRoutes。constantRoutes: 代表那些不需要动态判断权限的路由,如登录页、404、等通用页面

2021-05-08 16:14:39 253

原创 和我一起解刨基于Vue2.0+Vuex+element-ui的后台管理(二)之如何和后端进行联调

Target&StepTwo——和后端进行联调(二)我是基于原项目进行修改的,可以Start我的仓库,相关笔记和代码都会实时更新的。点击这里????????????环境变量​ .env、.env.development和.env.development三个文件,文件名解释分别如下:.env 全局默认配置文件,不论什么环境都会加载合并。并且修改配置文件需要重启项目才能生效。.env.development 开发环境加载的配置文件.env.production 生产环境加载的

2021-05-08 16:05:44 332

原创 和我一起解刨基于Vue2.0+Vuex+element-ui的后台管理(一)之理清登录流程和权限校验

Target——搞懂登录流程和权限效验流程是怎么对接的,改哪里的代码原作者代码仓库官方文档手摸手,带你用vue撸后台 系列一(基础篇)手摸手,带你用vue撸后台 系列二(登录权限篇)一开始看这个项目,我很懵逼,总的来说就是不同用户登录拥有不用的页面访问权限。那么这个如何实现呢?用户有不同的路由表,为什么有角色?这么想吧,如果说要批量修改用户的权限表不是很麻烦吗,如果用户与权限表之间有个角色作为中间衔接对于刚刚的问题,只要修改角色对应的权限就好啦!这个看是不是很清晰了那么对于这个项目,它

2021-05-05 14:29:21 396 5

原创 mac安装mongoDB,解决/data/db问题

安装首先为实现brew安装,对于brew可以自己去找安装教程(现在只支持社区版),进行下载并且按照官网建立了是三个文件最重要的一点来了,网上都说建立一个存放数据库文件的地方,mkdir -p /data/db这里我们得知道/data/db是什么意思?是在根目录下创建!你可以通过pwd查看当前目录,有些同学就是创建错地方了,那么我们直接可以 cd / ,再创建/data/db,可是老报错mkdir: data: Read-only file system还好mongodb有制定加载

2021-05-02 14:26:58 959

原创 白话讲讲EventEmitter的实现

白话讲讲EventEmitter的实现首先我们要知道什么是EventEmitter?简单来说就是对事件触发与事件监听器功能的封装。EventEmitter有什么API是需要我们去实现的on 对事件进行监听emit进行触发once是指只监听一次alloff是关掉所有消息队列中的监听off关掉相应的监听事件怎么实现构造函数首先定义一个存放消息队列的对象,每个消息队列都有一个名字eventname,这个消息队列可以承载多个事件对象每个事件对象有两个属性:listener(存放回调函数

2021-04-28 00:06:25 296

原创 三大门派var,const,let之间的纠纷

三大门派var,const,let之间的纠纷let,const是属于块级作用域的,而var是属于全局作用域的对于这三大门派,我们可以从以下四点进行分析学习作用域规则重复声明/重复赋值变量提升(hoisted)暂时死区(TDZ)var的缺陷是什么?var 存在变量提升,那么接下来的这段会发生什么? function fun2(){ let f3 = 3 const f4 = 4 //Uncaught ReferenceError:

2021-04-25 22:08:36 133

原创 位运算

领略位运算之美在阅读之前先补充一下计算机的二进制运算逻辑运算:与,或,非,异或运算 XOR与运算符号为&,运算规律是:真真为真,真假为假,假假为假或运算符号为|,运算规律是:真真为真,真假为真,假假为假非运算符为~,取反的逻辑,运算规律:二进制位若为1,取反后为0。若为0,取反后为1异或运算XOR一个值与自身的运算,总是为 false。x ^ x = 0一个值与 0 的运算,总是等于其本身。x ^ 0 = x正数、负数的表示对于负数的表示

2021-04-25 22:07:44 207 1

原创 异步编程--Promise->Generator->Async/Await->异步生成器

Promise[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-luKEmslp-1616849620183)(/Users/macos/Desktop/note/images/手写Prmoise.png)]主要API和属性Promise 构造函数: Promise (excutor) {}同步函数,是个执行器,会立即执行Promise.prototype.then 方法: (onResolved, onRejected) => {}根据状态去执行不一样的

2021-03-27 20:55:38 219

原创 递归,迭代在链表中的运用

82_删除链表中的重复节点283_删除链表中的重复节点1这两道题的不同点是,82要求删除重复的节点,83式要求保留自身,删除与自身相同的节点。递归对于82题递归结束的条件是与当前节点不同的下一个节点,将重复节点的下一个不一样节点进行递归class Solution(object): def deleteDuplicates(self, head): if not head or not head.next: return h...

2021-03-26 22:45:39 163

原创 面向对象编程

函数的另一种形式利用对象收编变量利用点语法来使用对象的方法新创建的对象继承方法将方法放入函数对象中检测类链式调用给函数都添加一个方法封装

2021-03-26 09:53:23 58

原创 JS中继承的那些事

JS 实现继承的几种方式

2021-03-21 10:27:54 65

原创 leetcode——逆波兰表达式求值,pyhon3负数运算需要注意的点

150. 逆波兰表达式求值首先要知道数字在python3的运用负数用isdigit()无法判断是数字/是保留小数,//是保留整数,但是是往小的保留这里就要考虑负数的取整问题解决办法:try-except ,或者字符串截取lstrip(’-’)解决判断负数是数字的问题。使用 int() 函数,解决负数取整问题代码思路对逆波兰表达式求值的过程是:如果遇到数字就进栈;如果遇到操作符,就从栈顶弹出两个数字分别为 num2(栈顶)、num1(栈中的第二个元素);计算 num1 运算 num

2021-03-21 10:02:57 399

原创 Python3--反转链表之迭代,递归,穿针引线(头插法)

递归法反转链表1class Solution(object): def reverseList(self, head): """ :type head: ListNode :rtype: ListNode """ # 递归终止条件是当前为空,或者下一个节点为空 if(head==None or head.next==None): return head # 这里的cur就是最后一个节点 cur = self.reverseList(head.next) #

2021-03-18 14:06:05 207

原创 Vue2.0以上配置sass及Eslint检查

Vue2.0以上配置sass全局安装sass(我不知道为什么node-sass安装一直不行,所以还是安装sass就行,一样的)npm i sass --save-dev指定sass-loader的版本,如果你用npm i sass-loader--save-dev,就会安装到最新版本,新的版本是5.x会太高,应该要指定版本安装写卸载 npm uninstall sass-loader再重新下载npm i sass-loader@7.3.1 --save-dev最后看一下我脚手架的packag

2021-03-18 09:32:31 620

原创 如何让浏览器认识ES6语法,利用babel

JS模板规范之ES6直接暴露export let school = 'jimei'export function m1(params) { console.log('m1-----')}按需暴露function m3(params) { console.log('m3------'+params)}function mm3(params) { console.log('mm3--')}export {m3}3.默认暴露export default{ jj:

2021-03-11 11:48:35 473

原创 复习回溯算法,深刻体会动态规划

什么是动态规划?了解一下再做题通过判断每一个字串是否是回文的基础上来判断父串是否是回文,这也就是动态规划的思想——将一个问题拆成几个子问题,分别求解这些子问题,即可推断出大问题的解。131分割回文这道题主要通过先进行判断是否是回文,记录其状态,实现记忆化,本身和回文中间只有一位字符串(比如‘aba’)即是回文,还有一种情况就是在里面是回文的情况下外面也是回文(’aaabaaa‘)为什么要动态规划实现记忆法通过记录字符串的状态,然后下面回溯在进行剪枝的时候可以减少不必要的剪枝 if dp[i

2021-03-09 23:05:40 86

原创 重新炒一炒Promise(上)

创建未决的 Promise此构造器接受单个参数:一个被称为执行器(executor )的函数,包含初始化 Promise 的代码。该执行器会被传递两个名为 resolve()与 reject() 的函数作为参数。resolve() 函数在执行器成功结束时被调用,用于示意该Promise 已经准备好被决议( resolved ),而 reject() 函数则表明执行器的操作已失败。作业调度( job scheduling )执行器会在 readFile() 被调用时立即运行。当 resolve(

2021-03-09 15:10:54 73

原创 Leetcode——单调栈的认识及运用(下一个更大元素 II等)

对于栈的认识一开始我只停留在先进先出,对于它的运用我并没有过多的思考,知道这两天的刷到才知道我也知道一个概念,那么这个先进先出有什么可以运用,现在的理解是单调递增或者单调递减,可以与栈顶元素比较,比如是单调递增的栈,如果当前元素比栈顶元素小,也就是说是整个栈元素的最小值,就会将栈顶元素弹出,当前元素为栈顶元素,以此类推。对于这道题,首先要思考我们为什么要用单调栈,是用单调递增还是递减,题目是求的是循环数组的第一个比它大的值,也就是说当前元素比栈顶元素大就行,为什么要用单调栈呢?考虑比较次数,比如对于数组

2021-03-06 12:10:48 220 2

原创 异步编程中对Generator和thunk函数的认识

什么是Generator 如何定义Generator 是一个带星号的“函数”(它并不是真正的函数,下面的代码会为你验证),可以配合 yield 关键字来暂停或者执行函数。function* gen() { console.log("enter"); let a = yield 1; let b = yield (function () {return 2})(); return 3;}var g = gen() // 阻塞住,不会执行任何语句con

2021-03-02 11:17:59 201

原创 python heapq模块解决经典 TopK 问题

官网Leetcode

2021-03-02 09:06:37 217

原创 JavaScript ——十大经典排序算法汇总(整理中)

冒泡排序(Bubble Sort)冒泡排序是一次比较两个元素,如果顺序是错误的就把它们交换过来。走访数列的工作会重复地进行,直到不需要再交换,也就是说该数列已经排序完成。// 冒泡排序(已优化)const bubbleSorted2 = arr=>{ const length = arr.length if(length <=1){ return } for (let i = 0;i<length-1;i++){ let

2021-02-26 19:41:01 240 2

原创 Python中切片这把好利器——解决托普利茨矩阵

766. 托普利茨矩阵直接遍历的话时间复杂度回比较高,利用切片可以遍历一次class Solution: def isToeplitzMatrix(self, matrix: List[List[int]]) -> bool: for i in range(len(matrix) - 1): if matrix[i][:-1] != matrix[i + 1][1:]: return False ret

2021-02-22 11:52:34 79

原创 JS模块化规范之commonjs,AMD

什么是commonjsCommonJs 是一种 JavaScript 语言的模块化规范,它通常会在服务端的 Nodejs 上使用。commonjs服务端应用module.exports = value(只能使用一个)module.exports = function(){}exports.XXX(可以定义多个)npm initcommonjs浏览器利用插件Browserify进行打包,因为浏览器不认识nodejs语法全局安装 npm install browserify -g局部(

2021-02-21 22:47:33 230

原创 Webpack 4.0以上,css压缩使用postcss-loader用法的变动及eslintrc在代码分割是使用import需要.eslintrc的配置

postcss-loader在插件中的配置修改为注意环境是开发环境 MiniCssExtractPlugin.loader, 'css-loader', { loader:"postcss-loader", options:{ postcssOptions:{ plugins:[ [ "postcss-preset-env", { ...

2021-02-21 14:31:56 146

原创 Leetcode——滑动窗口实现求最大最小值,Pyhthon利用第三方sortedcontainers和队列实现

因为题目返回最长连续子数组的长度,,是该子数组中的任意两个元素之间的绝对差必须小于或者等于 limit 。可以转化为是在这个连续子数组的最大最小值相减不超过limit滑动窗口 + 单调队列思路:在实际代码中,我们使用一个单调递增的队列 queMin 维护最小值,一个单调递减的队列 queMax 维护最大值。这样我们只需要计算两个队列的队首的差值,即可知道当前窗口是否满足条件。每次右指针移动都需要获取序列的长度对于右指针所指的新元素,判断是否要更新queMin,queMax的第一位元素(最小值,最

2021-02-21 14:23:24 510 1

原创 浏览器的页面循环系统

消息队列和事件循环为什么需要事件循环?想在线程运行过程中,能接收并执行新的任务,就需要采用事件循环机制。每个渲染进程都有一个主线程,并且主线程非常繁忙,既要处理 DOM,又要计算样式,还要处理布局,同时还需要处理 JavaScript 任务以及各种输入事件。要让这么多不同类型的任务在主线程中有条不紊地执行,这就需要一个系统来统筹调度这些任务。事件循环基于两个基本准则一个处理一个事件一个任务开始后直到运行完成,不会被其他任务中断全局来看,图13.1 展示了在一次迭代中, 事件循环将首先检

2021-02-15 17:16:47 201

原创 Leetcode——BFS在树和图结构中的运用

pythons模板BFS 使用队列,把每个还没有搜索到的点依次放入队列,然后再弹出队列的头部元素当做当前遍历点。BFS 总共有两个模板:如果不需要确定当前遍历到了哪一层,BFS 模板如下。while queue 不空: cur = queue.pop() for 节点 in cur的所有相邻节点: if 该节点有效且未访问过: queue.push(该节点)但是用 BFS 来求最短路径的话,以上这个框架还需要稍微修改一下。如果用上面这种写法

2021-02-15 14:52:02 87

原创 浏览器中的JavaScript的执行机制

目录JavaScript代码执行的顺序是什么呢?在了解JavaScript的执行机制之前我们先来了解一下变量提升,变量提升是什么?为什么需要?编译阶段说到这里我们来学习一下执行上下文JavaScript中使用什么方法跟踪执行上下文?​讲到这里需要补充什么是栈?当栈中容量不足,会发生什么?那为什么会出现这个问题呢?接下来我们来理解一下JavaScript的变量类型——var缺陷所以ES6 是如何解决变量提升带来的缺陷——ES6 引入了 let 和 const 关键字,从

2021-02-10 23:26:41 194 1

原创 了解导航流程——从输入URL戴页面展示,这中间发生了什么

​​​​​​判断用户输入url回车(没有考虑搜索情况) 浏览器进程检查url,从本地缓存中查找是否有缓存文件,有直接响应码200返回,若没有进行网络请求,组装协议,构成完整的url 浏览器进程通过进程间通信(IPC)把url发送给网络进程 网络进程解析 url,通过IP地址发送给服务器 网络进行接收服务器响应数据,解析响应头,判断是用什么格式来解析响应体,并转发给浏览器进程 浏览器进程url进行检查,是否是同一个站点,进行渲染准备 渲染进程准备好以后,浏览器进程向渲染进程发出“提交.

2021-02-06 22:35:41 121 2

原创 JS 闭包难点剖析

目录JavaScript 中的作用域是什么意思?全局作用域函数作用域块级作用域闭包会在哪些场景中使用?闭包产生的原因作用域链通过定时器循环输出自增的数字通过 JS 的代码如何实现?这是为什么呢利用 IIFE使用 ES6 中的 let定时器传入第三个参数JavaScript 中的作用域是什么意思?JavaScript 的作用域通俗来讲,就是指变量能够被访问到的范围,在 JavaScript 中作用域也分为好几种,ES5 之前只有全局作用域和函数作用域两种

2021-02-03 22:50:40 159

原创 JS关于函数上下文this的理解

当调用函数时,除了传入在函数定义中显式声明的参数之外,同时还传入两隐式参数∶ arguments 与 this。arguments 参数是传入函数的所有参数的集合。具有 length 属性,表示传入参数的个数,通过 arguments 参数还可获取那些与函数形参不匹配的考在非严格模式下,arguments 对象是函数参数的别名,修改 arguments 对象会修改函数实参,可以通过严格模式避免修改函数实参。 this表示函数上下文,即与函数调用相关联的对象。函数的定义方式和调用方式决定了 this 的

2021-02-03 21:38:54 277

原创 JS手写new,call,apply,bind每一步注释写得清清楚楚

new//创建一个对象//将构造函数的作用域给新对象//执行构造函数中的代码//返回新对象function _new(context,...args){ if(typeof context != 'function'){ throw 'context must be a function' } //实例对象 let obj = new Object() //实例对象的 __proto__属性 指向构造函数的原生对象 obj.__proto__ = Object.

2021-02-02 22:51:59 241 1

原创 Vue中mustache的探秘

什么是模板引擎,平时使用Vue写循环的时候用v-for那么溜却从来没有想过为什么mustache基本使用 mustache的底层核心机理 那么什么是tokens?tokens是一个JS的嵌套数组,说白了,就是mustache库底层重点要做两个事情: ① 将模板字符串编译为tokens形式 ② 将tokens结合数据,解析为dom字符串板字符串的JS表示带你手写实现mustache库将模板字符串变为简单版tokensn首先可以看到每一行的第一列都有.

2021-02-01 22:53:52 796

原创 Leetcode——633. 平方数之和

class Solution: def judgeSquareSum(self, c: int) -> bool: if c == 1 or c== 0 : return True left = 0 right = int(math.sqrt(c)) print(right) while left <= right : if left * left + right * r..

2021-02-01 16:14:49 65

原创 Leetcode有向图无向图,一题多解,并查优先队列都给我冲

并查集778. 水位上升的泳池中游泳class Solution(object): def swimInWater(self, grid): """ :type grid: List[List[int]] :rtype: int """ N = len(grid) nodes = [None] * (N * N) for i in range(N): fo

2021-02-01 16:04:15 263

原创 Leetcode——前缀和

题目直通车运用数学思想左边的和 = 总和 - 当前索引的值-右边的和题目要求两边相等,也就是 左边的和 = 右边的和因此公式变成 左边的和 + 左边的和(右边的和) +当前索引的值 = 总和class Solution: def pivotIndex(self, nums: List[int]) -> int: if not nums: return -1 total = 0 for j in range(len(nums)):

2021-01-28 21:18:36 115 2

原创 Leectcode——滑动窗口

76. 最小覆盖子串滑动窗口的思想:用i,j表示滑动窗口的左边界和右边界,通过改变i,j来扩展和收缩滑动窗口,可以想象成一个窗口在字符串上游走,当这个窗口包含的元素满足条件,即包含字符串T的所有元素,记录下这个滑动窗口的长度j-i+1,这些长度中的最小值就是要求的结果。import collectionsdef minWindow(s: str, t: str) -> str: need = collections.defaultdict(int) for i in t:

2021-01-28 20:09:23 123

原创 初识Javascript设计模式之发布-订阅模式到分析Vue之数据响应式原理

目录环境搭建在开始分析代码之前先了解一下JavaScript的设计模式之发布-订阅模式,观察者模式什么是发布-订阅模式代码分析大致分为三部分:让数据变成响应式、依赖收集 和 派发更新。让数据变成响应式什么是数据响应式?Object.defineProperty()中间调用层(调度中心):Observer类——递归侦测对象全部属性observe是干什么的?defineReactive函数如何观测数组?——数组的响应式处理依赖收集此...

2021-01-28 12:06:13 353

原创 Python序列复习

学习

2021-01-26 13:43:52 124

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除