跨域脚本攻击 XSS 是最常见、危害最大的网页安全漏洞。XSS:Cross Site Scrit 跨站脚本攻击(为与 CSS 区别,所以在安全领域叫 XSS)。攻击原理是代码被恶意注入到页面中(例如评论),然后其他用户在访问页面时,浏览器执行了代码逻辑。为了防止它们,要采取很多编程措施,非常麻烦。很多人提出,能不能根本上解决问题,浏览器自动禁止外部注入恶意脚本?这就是"网页安全政策"(Content Security Policy,缩写 CSP)的来历。CSP 的实质就是白名单制度,开发者明确告诉客户端,哪些外部资源可以加载和执行,等同于提供白名单。它的实现和执行全部由浏览器完成,开发者只需提
display:inline-block是一种布局方法,它相比于与浮动、定位最大的不同就是其没有父元素的匿名包裹特性,这使得display:inline-block属性的使用非常自由,可与文字,图片混排,可内嵌block属性元素,可以置身于inline水平的元素中。在CSS布局中,如果我们想要将一些元素在同一行显示,其中的一种方法就是把要同行显示的元素设置display属性为inline-block。但是你会发现这些同行显示的inline-block元素之间经常会出现一定的空隙,这就是“换行符/空格间隙问题”。 !DOCTYPE html
html
head
title
怪异模式(quirks mode)是指在计算机领域中,一些网页浏览器为了维持对较旧的网页设计的向后兼容性,而使用的一种技术。怪异模式特点:1.采用的是IE盒模型,即将border和padding包含在了height和width中。在 IE 盒模型中,box width = content width + padding left + padding right + border left + border right,
box height = content height + padding top + padding bottom + border top + border bottom
一,响应式网页设计响应式网页设计( RWD,Responsive Web Design) 这个术语,由伊桑・马科特( Ethan Marcotte )提出。他在AList Apart发表了一篇开创性的文章,将三种已有的开发技巧(弹性网格布局、弹性图片、媒体和媒体查询)整合起来,并命名为响应式网页设计。这个术语还有一堆表示相同意思的其他叫法,如流式设计、弹性布局、塑料布局、流体设计、自适应布局、跨设备设计以及弹性设计。 上面仅列举了其中一部分!不过,正如马科特等人所说,真正的响应式设计方法不仅仅只是根据视口大小改变网页布局。相反,它是要从整体上颠覆我们当前设计网页的方法。以往我们先是针对桌面电
1,DELETE语句执行删除的过程是每次从表中删除一行,并且同时将该行的删除操作作为事务记录在日志中保存以便进行进行回滚操作。TRUNCATE TABLE 则一次性地从表中删除所有的数据并不把单独的删除操作记录记入日志保存,删除行是不能恢复的。并且在删除的过程中不会激活与表有关的删除触发器。执行速度快。2,表和索引所占空间。当表被TRUNCATE 后,这个表和索引所占用的空间会恢复到初始大小,DELETE操作不会减少表或索引所占用的空间。drop语句将表所占用的空间全释放掉。3,Truncate table 表名 速度快,而且效率高,因为: truncate table 在功能上与不带 WHE
商品库存肯定是很有限的,如何控制库存不让出现超买是一个非常重要的问题。事务是控制库存超卖的必要不充分条件。举例:总库存:4个商品请求人:a、购买1个商品 b、购买2个商品 c、购买3个商品程序如下:beginTranse
try{
result = db- query('select amount from s_store where postID = 12345');
if(result- amount 0){
//quantity为请求减掉的库存数量
db- query('update s_store set amount = amount - qua
assert 模块assert模块是Node的内置模块,主要用于断言。如果表达式不符合预期,就抛出一个错误。该模块提供11个方法,但只有少数几个是常用的。assert(value[, message])value any 检查是否为真的输入。message string | Error assert.ok() 的别名。assert.ok(value[, message])如果 value 不是真值,则抛出 AssertionError,并将 message 属性设置为等于 message 参数的值。 如果未定义 message 参数,则会分配默认错误消息。 如果 message 参数
使用 Mocha 和 Node.js自带的assert做单元测试,使用SuperTest做请求接口。Mocha 简介mocha 提供 TDD(测试驱动开发)、BDD (行为驱动开发) 和 exports 风格的接口。BDD是“行为驱动的开发”(Behavior-Driven Development)的简称。BDD认为,不应该针对代码的实现细节写测试,而是要针对行为写测试。BDD测试的是行为,即软件应该怎样运行。BDD接口提供以下方法:describe():测试套件
it():测试用例
before():所有测试用例的统一前置动作
after():所有测试用例的统一后置动作
beforeEach
NPM Package 学习,一个符合CommonJs规范的包,都可以成为一个Npm Package。一,创建一个包创建一个文件夹:good-helloworld添加如下文件:index.jsexports.helloWorld = function () {
return "Hell World!";
}
exports.你好世界 = function () {
return "你好世界!";
}
package.json{
"name": "good-helloworld",
"version": "0.0.1",
"private": false
}
README.
Sequelize 提供了一个方法 Model.bulkCreate,可以只用一次查询插入多条数据。bulkCreate(records, [options]) - Promise. Array. Instance
参数records Array 要创建实例的对象(键/值 对)列表
[options] Object
[options.fields] Array 要插入的字段。默认全部
[options.validate=true] Boolean 插入每条记录前进行验证
[options.hooks=true] Boolean 在执行前/后创建钩子
[options.indi
安装 node-xlsxnpm install node-xlsx --save读取 Excelvar xlsx = require('node-xlsx');
// 解析得到文档中的所有 sheet
var sheets = xlsx.parse('test.xls');
// 遍历 sheet
sheets.forEach(function(sheet){
console.log(sheet['name']);
// 读取每行内容
for(var rowId in sheet['data']){
console.log(rowId);
tags字段是逗号隔开tag id。查询一select
i.id,
i.title,
i.tags,
(select
GROUP_CONCAT(tb_tag.title SEPARATOR ',')
from tb_tag where id in (i.tags)
) as tags_title
from tb_item as i;
结果:查询二select
i.id,
i.title,
i.tags,
(select
GROUP_CONCAT(tb_tag.title SEPARATOR ',')
fro
可选链操作符( ?. )允许读取位于连接对象链深处的属性的值,而不必明确验证链中的每个引用是否有效。?. 操作符的功能类似于 . 链式操作符,不同之处在于,在引用为空(nullish ) (null 或者 undefined) 的情况下不会引起错误,该表达式短路返回值是 undefined。与函数调用一起使用时,如果给定的函数不存在,则返回 undefined。之前:let nestedProp = obj.first && obj.first.second;
使用可选链操作符?.let nestedProp = obj.first?.second;
连用可选链操作符let
.head-section{
width: 100%;
height: 360px;
position: relative;
z-index: -1;
overflow: hidden;
}
.head-section::after{
content: '';
display: block;
width: 160%;
height: 200%;
border-radius: 50%;
position: absolute;
left: 50%;
top: -10
通常异常使用方式:try {
JSON.parse(json);
} catch (e) {
// TODO
}
但是这对于异步编程而言并不一定适应,下面的代码 catch 不会捕捉到异常,并导致程序退出:async function action(){
setTimeout(()= {
throw new Error("发生了错误");
}, 1000);
}
try {
action();
} catch (e){
console.log('catch: ', error.message);
}
异步I/O的实现主要包含两个阶段:提交请求和处理结果。这
当内存中无法一次装下需要处理的数据时,或者一边读取一边处理更加高效时,我们就需要用到数据流。NodeJS中通过各种 Stream 来提供对数据流的操作。官方文档: http://nodejs.org/api/stream.html小文件拷贝fs.writeFileSync(dst, fs.readFileSync(src));
大文件拷贝上边的程序拷贝一些小文件没啥问题,但这种一次性把所有文件内容都读取到内存中后再一次性写入磁盘的方式不适合拷贝大文件,内存会爆仓。对于大文件,我们只能读一点写一点,直到完成拷贝。因此上边的程序需要改造如下。fs.createReadStream(src).pi
最终我选择使用了 sharp https://github.com/lovell/sharp基本用法:var images = require("images");
images("input.jpg") //Load image from file
//加载图像文件
.size(400) //Geometric scaling the image to 400 pixels width
//等比缩放图像到400像素宽
.draw(images("l
Scoped Packages 范围包假如我们有一个项目需要使用 npm init 进行初始化,但是在 npm 注册的包名是唯一的,好名字都被别人起了,怎么办呢?之前很多人都是使用类似 koa-router、vue-cli 中线的方式。 还有类似这样的:@koa/router,这种形式叫做 Scoped Packages 范围包。@somescope/somepackagename每个npm用户可以有自己的 somescope使用的时候大概如下:var router = require("@koa/router");
参考https://nitayneeman.com/posts/under
安装包的时候提示如下:gyp WARN EACCES user "nobody" does not have permission to access the dev dir
或者gyp WARN EACCES user "root" does not have permission to access the dev dir
解决方法:npm install xxxx -g --unsafe-perm
有时候可以先执行:npm cache clean --force
参考:https://javascript.net.cn/article?id=657
这个属性可以取消 pading 和 border 宽度对盒装模型的影响。语法box-sizing: content-box|border-box|inherit;content-box 这是由 CSS2.1 规定的宽度高度行为。宽度和高度分别应用到元素的内容框。在宽度和高度之外绘制元素的内边距和边框。border-box 为元素设定的宽度和高度决定了元素的边框盒。就是说,为元素指定的任何内边距和边框都将在已设定的宽度和高度内进行绘制。通过从已设定的宽度和高度分别减去边框和内边距才能得到内容的宽度和高度。inherit规定应从父元素继承 box-sizing 属性的值。
所有标签