Giter Club home page Giter Club logo

issue-blog's Introduction

personal website

express+mongo

pages

  1. index
  2. home
  3. blogs
  4. chatroom
  5. tools
  6. about

issue-blog's People

Contributors

soonfy avatar

Watchers

 avatar

issue-blog's Issues

bootstrap 无用笔记

bootstrap

1. bootstrap css

1.1 css概览

  • html5文档类型
<!DOCTYPE html>
<html>
</html>
  • 移动设备优先
<meta name="viewport" content="width=device-width, initial-scale=1.0">
//width适配不同设备,initial-scale加载不会缩放
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable="none">
//maximum-scale最大缩放功能比例,user-scalable禁用缩放功能
  • 响应式图像
<img src="" class="img-responsive" alt="响应式图像" />
//原理
.img-responsive{
  display: inline-block;
  height: auto;
  max-width: 100%;
}
  • 容器
<div class="container">
</div>
//原理
.container{
  padding-right: 15px;
  padding-left: 15px;
  margin-left: auto;
  margin-right: auto;
}

1.2 网格系统

  • 移动设备优先策略

内容 决定什么是最重要的
布局 优先设计更小的宽度,基础css是移动设备优先,媒体查询针对电脑
渐进增强 随着屏幕大小增加而添加元素

  • 网格系统工作原理

行.row必须放置在.container类内,以便获得适当的对其和内边距
使用行.row来创建列.col的水平组
内容必须放置在列.col内,且唯有列.col可以是行.row的子元素
预定义的网格类,.row, .col-xs-4
列.col通过内边距padding来创建列.col之间的间隔
网格系统是指定要横跨的12个可用的列来创建,3个相等的列,使用3个.col-xs-4

  • 媒体查询 基于视口大小,显示或者隐藏内容

min-width限制最小宽度

//超小设备(手机,小于768px)
默认没有媒体查询
//小型设备(平板电脑,768px+)
@media(min-width: @screen-sm-min){}
//中型设备(台式电脑,992px+)
@media(min-width: @screen-md-min){}
//大型设备(大屏幕,1200px+)
@media(min-width: @screen-lg-min){}

max-width限制最大宽度,min-height限制最小高度,max-height限制最大高度

@media(max-width: @screen-xs-max){}
@media(min-width: @screen-sm-min) and (max-width: @screen-sm-max){}
@media(min-width: @screen-md-min) and (max-width: @screen-md-max){}
@media(min-width: @screen-lg-min){}
  • 网格选项
//所有宽度,.col-xs-
//最大宽度768px,.col-sm-
//最大宽度970px,.col-md-
//最大宽度1170px,.col-lg-
//基本网格结构
<div class="container">
  <div class="row">
    <div class="col-xs-6">小型2列</div>
    <div class="col-xs-6">小型2列</div>
  </div>
  <div class="row">
    <div class="col-xs-4">小型3列</div>
    <div class="col-xs-4">小型3列</div>
    <div class="col-xs-4">小型3列</div>
  </div>
</div>
  • 响应式列重置
<div class="container">
  <div class="row">
    <div class="col-xs-6 col-sm-3">超小2列,小型4列</div>
    <div class="col-xs-6 col-sm-3">超小2列,小型4列</div>
    <div class="col-xs-6 col-sm-3">超小2列,小型4列</div>
    <div class="col-xs-6 col-sm-3">超小2列,小型4列</div>
  </div>
</div>
  • 偏移列
<div class="container">
  <div class="row">
    <div class="col-xs-6 col-md-offset-3">偏移3列</div>
  </div>
</div>
  • 嵌套列
<div class="container">
  <div class="row">
    <div class="col-md-3">左列</div>
    <div class="col-md-9">
      <div class="row">
        <div class="col-md-6">右列1</div>
        <div class="col-md-6">右列2</div>
      </div>
    </div>
  </div>
</div>
  • 排序列
<div class="container">
  <div class="row">
    <div class="col-md-3 col-md-push-8">push到右边</div>
    <div class="col-md-9 col-md-pull-4">pull到左边</div>
  </div>
</div>

1.3 排版

  • 标题(h1到h6)
<h1>标题</h1>
  • 副标题
<h1>标题<small>副标题</small></h1>
  • 段落添加强调
<p class="lead">更大更粗,行高更高</p>
  • 文本强调
<small>文本为父文本大小的85%</small>
<strong>文本粗体</strong>
<em>文本斜体</em>
<p class="text-left">文本左对齐</p>
<p class="text-right">文本右对齐</p>
<p class="text-center">文本居中</p>
<p class="text-muted">文本颜色减弱</p>
<p class="text-primary">primary效果</p>
<p class="text-success">success效果</p>
<p class="text-info">info效果</p>
<p class="text-warning">warning效果</p>
<p class="text-danger">danger效果</p>
  • 缩写
<abbr title="完整的文本">缩写</abbr>
<abbr class="initialism" title="完整的文本">小字体缩写</abbr>
  • 地址
<address>
  <span>name</span>
  <span>email</span>
</address>
  • 引用
<blockquote>
  <p>文本</p>
  <small>引用于<cite title="源文本">源文本</cite></small>
  • 列表
<ol>
  <li>有序列表</li>
</ol>
<ul>
  </li>无序列表</li>
</ul>
<ul class="list-unstyled">
  <li>无样式列表</li>
</ul>
<ul class="list-inline">
  <li>内联列表</li>
</ul>
<dl>自定义列表
  <dt>表头</dt>
  <dd>数据</dd>
</dl>
<dl class="dl-horizontal">水平自定义列表
  <dt>表头</dt>
  <dd>数据</dd>
</dl>
  • 排版类
<p class="text-justify">文本对齐,超出屏幕位置自动换行</p>
<p class="text-nowrap">文本对齐,超出屏幕位置不换行</p>
<p class="text-lowercase">文本转换为小写</p>
<p class="text-uppercase">文本转换为大写</p>
<p class="text-capitalize">文本首字母大写</p>
<p class="blockquote-reserve">引用右对齐</p>
<p class="pre-scrollable">pre元素可滚动</p>

1.4 代码

  • 代码内<使用&lt;代替,>使用&gt;代替,&使用\amp;代替

  • 内联样式显示代码用code

<code>内联代码</code>
  • 块状或者多行代码用pre
<pre>
  &lt;header&gt;
    &lt;span&gt;文本&lt;/span&gt;
  &lt;/header&gt;
</pre>
  • 变量赋值
<span><var>y</var>=<var>x</var>+<var>z</var></span>
  • 按键提示
<p><kbd>ctrl + p</kbd>打印</p>
  • 电脑输出
<p><samp>computer output...</samp></p>

1.5 表格

  • 表格元素
<table>表格</table>
<thead>表头<thead>
<tbody>内容</tbody>
<tr>行</tr>
<th>内容</th>
<caption>标题</caption>
  • 表格类

table类

<table class="table">只有横向分割线的基本样式</table>
<table class="table-striped"><tbody>标签内添加斑马线式条纹</table>
<table class="table-bordered">所有表格添加边框</table>
<table class="table-hover">所有表格添加悬浮状态</table>
<table class="table-condensed">表格更紧凑</table>

tr,th,td类

<tr class="active">行处于悬停状态</tr>
<tr class="success">行处于success状态</tr>
<tr class="info">行处于info状态</tr>
<tr class="warning">行处于warning状态</tr>
<tr class="danger">行处于danger状态</tr>

class="table"包含在class="table-responsive"内

<div class="table-responsive">
  <table class="table">
  </table>
</div>

1.6 表单

  • 表单布局
垂直表单(默认)  
水平表单  
内联表单  
  • 垂直表单
向<form>父元素添加role="form"  
标签和控件包含在一个class="form-group"的<div>中  
所有文本元素<input><textarea><select>添加class="form-control"  
  • 水平表单
向<form>父元素添加class="form-horizontal"  
标签和控件包含在一个class="form-group"的<div>中  
标签添加class="control-label"  
  • 内联表单
表单元素都是内联,标签并排  
向<form>父元素添加class="form-inline"  
  • 表单控件
输入框<input>,类型包括text,password,datetime,datetime-local,date,month,time,week,number,email,url,search,tel,color  
文本框<textarea>,改变rows,cols属性  
复选框<checkbox>,单选框<radio>,内联复选框单选框添加class="checkbox-inline",class="radio-inline"  
选择框<select>,允许选择多个添加multiple="multiple"  
标签后跟纯文本,<p>标签添加class="form-control-static"  
  • 表单控件状态
输入框焦点(:focus)  
输入框禁用(disabled)  
字段集<fieldset>禁用(disabled)  
验证状态(class="has-success","has-warning","has-error")  
  • 表单大小
控件高度class="input-lg","input-sm"  
控件宽度class="col-lg-2","col-lg-3","col-lg-4"  
  • 表单帮助文本
<span class="help-block">帮助文本</span>  

1.7 按钮

  • 任何class="btn"默认都是按钮外观,主要用在a,btn,input
class="btn"基本样式  
class="btn-default"默认样式  
class="btn-primary"原始样式  
class="btn-success"成功样式  
class="btn-into"提示样式  
class="btn-warning"警告样式  
class="btn-danger"危险样式  
class="btn-link"链接样式  
class="btn-lg"大按钮  
class="btn-sm"小按钮  
class="btn-xs"超小按钮  
class="btn-block"块级按钮,拉伸父元素100%宽度  
class="active"被点击按钮  
class="disabled"禁用按钮  

1.8 图片

  • 简单样式
class="img-rounded"圆角图片,原理border-radius: 6px  
class="img-circle"圆形图片,原理border-radius: 50%  
class="thumbnail"内边距和灰色边框  
class="img-responsive"响应式图片,原理max-width: 100%,height: auto  

1.9 辅助类

  • 背景
class="bg-primary"原始背景  
class="bg-success"成功背景  
class="bg-info"提示背景  
class="bg-warning"警告背景  
class="bg-danger"危险背景  
class="pull-left"元素浮动到左边  
class="pull-right"元素浮动到右边  
class="center-block"display: block,居中显示  
class="clearfix"清除浮动  
class="show"强制显示  
class="hidden"强制隐藏  
class="sr-only"除屏幕阅读器,其它设备隐藏  
class="sr-only-focusable"结合src-only使用,获得焦点显式  
class="text-hind"将文本内容替换为背景图  
class="close"关闭按钮  
class="caret"下拉功能  

2. 布局组件

2.1 字体图标

  • 在Web项目中使用的图标字体
<button>
  <span class="glphicon glphicon-*"></span>
</button>
  • 通过设置父类属性来控制图标字体
<button style="color:red">
  <span class="glphicon glphicon-*"></span>
</button>

2.2 下拉菜单

  • 以列表格式显式链接的上下文菜单
<span class="caret">指示下拉菜单</span>
class="dropdown"向下弹出的下拉菜单  
class="dropup"向上弹出的下拉菜单  
class="dropdown-menu"下拉菜单  
class="dropdown-menu-right"右对齐下拉菜单右  
class="pull-right"右对齐下拉菜单  
class="dropdown-header"下拉菜单标题  
class="disabled"禁用下拉菜单  
class="divider"分割下拉菜单  

2.3 按钮组

  • 多个按钮排列对齐,可嵌套使用
class="btn-group"控制多个btn,基本样式按钮组  
class="btn-toolbar"控制btn-group,复杂按钮组件  
class="btn-group-lg","btn-group-sm","btn-group-xs"控制按钮组中按钮大小  
class="btn-group-vertical"垂直排列按钮组  

2.4 按钮下拉菜单

  • 在class="btn-group"中放置按钮和下拉菜单
  • 分隔按钮下拉菜单,用2个button分隔
  • class="btn-lg","btn-sm","btn-xs"设置按钮下拉菜单大小
  • 在class="btn-group"中添加class="dropup"设置按钮上拉菜单

2.5 基本输入框组

  • 基于文本输入框添加前后缀
<div class="input-group">
  <span class="input-group-addon">前缀</span>
  <input type="text" class="form-control" />
  <span class="input-group-addon">后缀</span>
</div>
  • class="input-group-lg","input-group-sm","input-group-xs"控制输入框组大小

  • 单选框(type="radio"),复选框(type="checkbox")可以作为输入框组的前后缀

  • 按钮(button)作为输入框组前后缀,修改class="input-group-btn"

  • 下拉菜单(dropdown)作为输入框组前后缀,修改class="input-group-btn"

2.6 导航元素

  • 标签导航,添加class="nav nav-tabs"的无序列表
<ul class="nav nav-tabs">
  <li></li>
  <li></li>
</ul>
  • 胶囊导航,修改class="nav nav-pills"

  • 垂直胶囊导航,添加class="nav nav-pills nav-stacked"

  • 两端对齐的导航,添加class="nav nav-pills nav-justified"

  • 禁用链接,同时取消链接的hover状态,修改class="disabled",只会改变外观样式,不能阻止a标签功能

  • 标签导航包含下拉菜单,li标签添加class="dropdown",其子ul标签添加class="dropdowm-menu"

  • 胶囊导航包含下拉菜单,修改class="nav nav-pills"

  • 内容随着标签导航的切换而更改,class="nav nav-tab"设置标签导航,class="tab-content"存放内容,class="tab-pane"内容定位",data-toggle="tab"改变样式

  • 内容随着胶囊导航的切换而更改,class="nav nav-pill"设置标签导航,class="pill-content"存放内容,class="pill-pane"内容定位",data-toggle="pill"改变样式

2.7 导航栏

  • 默认导航栏,nav标签添加class="nav nav-default",设置role="navigation"增强访问性
<nav class="nav nav-default" role="navigation">
  <div class="container-fluid">
    <div class="nav-header">
      <a class="nav-brand"></a>
    </div>
  </div>
</nav>
  • 响应式导航栏,折叠内容包含在class="collapse navbar-collapse",折叠按钮添加class="data-toggle",并且添加属性data-toggle="collapse",data-target="折叠内容id"
<button type="button">
  <span class="src-only">三个class="iconv-bar"创建汉堡按钮</span>
  <span class="icon-barr"></span>
  <span class="icon-barr"></span>
  <span class="icon-barr"></span>
</button>
  • 导航栏表单,添加form标签,设置class="navbar-form"

  • 导航栏按钮,添加button标签,设置class="navbar-btn"

  • 导航栏文本,添加p标签,设置class="navbar-text"

  • 导航栏字体图标,添加span标签,设置class="glyphicon glyphicon-*"

  • 组件对齐方式,class="navbar-left"左对齐,class="navbar-right"右对齐

  • 导航栏固定到顶部,设置class="navbar-fixed-top",同时设置body50pxpadding

  • 导航栏固定到底部,设置class="navbar-fixed-bottom"

  • 导航栏在顶部跟随页面滚动,设置class="navbar-static-top",不需要设置body50pxpadding

  • 倒置的导航栏,白底黑字,设置class="navbar-inverse",同时设置body50pxpadding

2.8 面包屑导航

  • 基于网站层次的导航,设置ol标签的class="breadcrumb"

2.9 分页

  • 显示分页,设置ul标签的class="pagination"

  • 分页活动状态,设置li标签的class="active"当前活动分页,class="disabled"禁用分页

  • 分页大小,设置ul标签的class="pagination-lg","pagination-sm"

  • 居中分页,设置ul标签的class="pager"

  • 左右对齐分页,设置ul标签的class="previous","next"

2.10 标签

  • 默认标签,设置span标签的class="label"

  • 修改标签样式class="label-default","label-primary","label-success","label-info","label-warning","label-danger"

2.11 徽章

  • 突出显示,设置span标签的class="badge"

2.12 超大屏幕

  • 用于登录页面,增加标题大小,设置div标签的class="junbotron"

2.13 页面标题

  • 多个标题,适当增加边距,设置div标签的class="page-header"

2.14 缩略图

  • 缩略图展示,增加内边距,鼠标悬停动画显示边框,在图片img标签外嵌套a标签,并设置class=""thumbnail

  • 包含内容的缩略图展示,在a标签外面嵌套div标签,并设置class="thumbnail",h,p标签添加内容

2.15 警告

  • 默认警告框,设置div标签的class="alert"

  • 修改警告框样式,设置div标签的class="alert-success","alert-info","alert-warning","alert-danger"

  • 可取消的警告框,div标签的class="alert-dismissable",添加button标签

<button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button>
  • 警告框中链接,设置a标签的class="alert-link"

2.16 进度条

  • 默认进度条,添加div标签,class="progress",内部嵌套div标签,class="progress-bar",并设置style="60%"

  • 修改进度条样式,设置class="progress-bar-success","progress-bar-info","progress-bar-warning","progress-bar-danger"

  • 条纹进度条,设置class="progress-striped"

  • 动画进度条,设置class="progress-striped active"

  • 堆叠进度条,内嵌多个div标签,class="progress-bar-*"

2.17 多媒体对象

  • 包含图片,视频,音频

  • 单个多媒体,父元素设置class="media",多媒体元素设置class="media-object",class="pull-left","pull-right控制对齐",文本元素设置class="media-body",文本中标题设置class="media-heading"

  • 多媒体列表,父元素设置class="media-list"

2.18 列表组

  • ul标签设置class="list-group",li标签设置class="list-group-item"

  • 列表组添加徽章,li标签添加span标签,设置class="badge"

  • 列表组链接,div标签设置class="list-group",a标签设置class="list-group-item"

  • 列表组添加自定义内容,在a标签中嵌套h标签,设置class="list-group-item-heading",p标签设置class="list-group-item-text"

2.19 面板

  • 把DOM组件插入到一个盒子,设置div标签的class="panel panel-default"

  • 面板标题,class="panel-heading添加标题",class="panel-title"设置h标签

  • 面板脚注,class="panel-footer"

  • 修改面板样式,class="panel-primary","panel-success","panel-info","panel-warning","panel-danger"

  • 包含表格的面板,设置class="panel-body",内部嵌套table标签,class="table"

  • 包含列表组的面板,内部嵌套ul标签,class="list-group"

2.20 Well

  • 内容内嵌的容器,设置div标签的class="well"

  • 修改Well大小,class="well-lg","well-sm"

3. HTML规范

  • 两个空格代表制表符
  • 标签嵌套缩进
  • 属性定义使用双引号,不使用单引号
  • 自闭合标签末尾不加斜线
  • 结束标签不能省略
  • 最少的标签,最小的复杂度
  • 标签属性的顺序,class-id/name-data-src/for/type/href-title/alt-aria/role
  • 布尔值属性,disabled/checked不赋值
  • 少用js生成标签
<!DOCTYPE html>文档类型
<html lang="zh-CN">语言属性
<head>
  <meta http-equiv="X-UA-Compatibal" content="IE=Edge">IE兼容模式
  <meta charset="UTF-8">字符编码
</head>
</html>

4. CSS规范

  • 两个空格代替制表符
  • 选择器分组,单个选择器单独占一行
  • 左大括号前加一个空格
  • 右大括号单独占一行
  • 每条声明语句的冒号后跟一个空格
  • 每条声明语句单独占一行
  • 每条声明语句后跟分号
  • 逗号分割的属性值,逗号后跟一个空格
  • rgb(),rgba(),hsl(),hsla(),rect()属性中逗号后不跟一个空格
  • 对于属性值,省略小于1的小数前面的0(0.5 => .5)
  • 十六进制全部小写简写(#FFFFFF => #fff)
  • 选择器中的属性添加双引号(input[type="text"])
  • 属性值为0不带单位(0px => 0)
  • 属性声明顺序position-box model-typographic-visual
position{
  position, top, right, bottom, left, z-index
}
box model{
  display, float, width, height
}
typographic{
  font, line-height, color, text-align
}
visual{
  background-color, border, border-radius
}
opacity
  • 不使用import,使用多个link,Sass将CSS文件编译成一个,Rails的CSS合并功能
  • 带前缀的属性,属性值在垂直方向对齐
selector{
  -webkit-box-shadow: 0 1px 2px rgba(0,0,0.15);
          box-shadow: 0 1px 2px rgba(0,0,0.15);
}
  • 单行规则放在一行
  • 尽量少用简写属性(padding, margin)
  • class命名
class名称只能包含小写字母和破折号(-);
避免随意的简写;
class名称尽量短;
命名有意义,不要用表现形式;(.red => .import)
基于最近的父class作为前缀;
  • 选择器
通用元素设置class;
经常出现的组件,避免使用属性选择器;
选择器尽量短,选择器数目不超过3;
  • 代码组织
以组件为单位组织;
一致的注释;
一致的空白分割成块;
以组件为单位,而不是页面拆分成多个CSS文件;

soonfy

flex

flex

flex 的核心概念是 容器

容器包括外层的父容器(容器)和内层的子容器(项目),轴包括主轴和交叉轴。

display: flex;

flex 属性

12 个相关属性,webkit 内核的浏览器加上 -webkit 前缀

justify-content, align-items, flex, align-self

flex-direction, flex-wrap, flex-flow, align-content

flex-grow, flex-shrink, flex-basis, order

容器属性

justify-content: 定义容器中的项目在主轴上的对齐方式,默认是 flex-start;

align-items: 定义容器中的项目在交叉轴的对齐方式,默认是 stretch;

flex-direction: 定义容器主轴的方向,项目在容器中的排列方式,默认是 row;

flex-wrap: 定义项目宽度超过容器是否换行,默认是 nowrap;

flex-flow: 是 flex-direction, flex-wrap 的简写,默认是 row nowrap ;

align-content: 定义容器多根主轴的对齐方式,默认是 stretch;

项目属性

flex: 是 flex-grow, flex-shrink, flex-basis 的简写,默认是 0 1 auto ;

align-self: 定义项目本身在容器中交叉轴的对齐方式,覆盖容器的 align-items 属性;

flex-grow: 定义项目在容器主轴上的放大比例,项目宽度小于容器会放大比例,默认是 0 ;

flex-shrink: 定义项目在容器主轴的缩小比例,项目宽度超过容器会缩小比例,默认是 1 ;

flex-basis: 定义项目在容器主轴的初始宽度,默认是 auto ;

order: 定义项目在容器主轴的顺序, order 越小越靠前,默认是 0 ;

参考文章

Flex 布局教程:语法篇

一劳永逸的搞定 flex 布局

soonfy
2018-03-29

mpvue 路由 导航

导航

navigateTo

保留当前页面,跳转到应用内的某个页面,使用wx.navigateBack可以返回到原页面

wx.navigateTo({
  url: '/path?name=name&value=value',
  success(){},
  fail(){},
  complete(){}
})

redirectTo

关闭当前页面,跳转到应用内的某个页面

wx.redirectTo({
  url: '/path?name=name&value=value',
  success(){},
  fail(){},
  complete(){}
})

reLaunch

关闭所有页面,打开到应用内的某个页面

wx.reLaunch({
  url: '/path?name=name&value=value',
  success(){},
  fail(){},
  complete(){}
})

switchTab

跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面

wx.switchTab({
  url: '/path',
  success(){},
  fail(){},
  complete(){}
})

navigateBack

关闭当前页面,返回上一页面或多级页面。可通过 getCurrentPages() 获取当前的页面栈,决定需要返回几层

wx.navigateBack({
  delta: 1
})

comment

  1. wx.navigateTo 和 wx.redirectTo 不允许跳转到 tabbar 页面,只能用 wx.switchTab 跳转到 tabbar 页面
  2. wx.switchTab 只能打开 tabBar 页面
  3. wx.reLaunch 可以打开任意页面

路由

getCurrentPages()

返回页面栈

onLoad(), onShow()

onLoad: function(option){
  console.log(option.query)
}

soonfy

vue 指令

vue 指令

  1. v-text
    更新元素的 textContent
<span v-text="text"></span>
等价于
<span>{{ text }}</span>
  1. v-html
    更新元素的 innerHTML
<span v-html="html"></span>
  1. v-show
    根据表达式真假切换元素的 display 属性
<span v-show="a === b">a === b</span>
  1. v-if
    根据表达式真假是否渲染元素,切换时元素及它的数据绑定,组件被销毁并重建
<span v-if="a === b">a === b</span>
<span v-else-if="a === c">a ===c</span>
<span v-else>else</span>
  1. v-else
    前一个兄弟元素必须有 v-if 或者 v-else-if

  2. v-else-if
    前一个兄弟元素必须有 v-if 或者 v-else-if

  3. v-for
    基于源数据多次渲染

<span v-for="item in items" :key="item.key">{{ item.text }}</span>
或者
<span v-for="(item, index) in items" :key="item.key">{{ item.text }}</span>
或者
<span v-for="(val, key, index) in object" :key="key">{{ val }}</span>
  1. v-on
    绑定事件监听。缩写是 @
    修饰符
  • .stop 调用 event.stopPropagation
  • .prevent 调用 event.preventDefault
  • .capture 添加事件监听使用 capture 模式
  • .self 事件是由事件监听绑定的元素触发才执行
  • .{keyCode | keyAlias} 事件是由特定按键触发才执行
  • .native 监听组件根元素的原生事件
  • .once 触发只执行一次事件处理
  • .left 点击鼠标左键才执行
  • .right 点击鼠标右键才执行
  • .middle 点击鼠标中键才执行
  • .passive 以 {passive: true} 模式添加事件监听
<span v-on:click="handler">click</span>
<span v-on="{click: handler}">click</span>
<span @click="handler">click</span>
<span @click.stop.prevent.once="handler"></span>
<span @keyup.enter="pressenter">press enter</span>
<span @keyup.13="pressenter">press enter</span>

methods: {
  handler(event){},
  pressenter(event){}
}
  1. v-bind
    动态绑定特性。缩写是 :
    修饰符
  • .prop 绑定 DOM 属性
  • .camel 将 kabab-case 转换为 camelCase
  • .sync 更新父组件绑定值的 v-on 事件监听
<span v-bind:name="name"></span>
<span :name="name"></span>
<span :class="[class1, class2]"></span>
<span :class="{classname: expression}"></span>
<span :class="classobj"></span>
<span :style="{fontSize: size + 'px'}"></span>
<span :style="[style1, style2]"></span>
data() {
  return {
    expression: true,
    classobj: {
      classname: expression
    },
    size: 12
  }
}
  1. v-model
    监听表单交互并更新数据
    修饰符
  • .lazy 取代 input 的 change 事件
  • .number 输入的字符转换为数字
  • .trim 过滤输入字符的首尾空格
// input, text=string
<input v-model="text">
// textarea, textline=string
<textarea v-model="textline">
// checkbox, checks=array
<input type="checkbox" value="A" v-model="checks"></input>
<input type="checkbox" value="B" v-model="checks"></input>
// radio, radio=A || B
<input type="radio" value="A" v-model="radio">
<input type="radio" value="B" v-model="radio">
// select, selected=A || B
<select v-model="selected">
  <option>A</option>
  <option>B</option>
</select>
// multi select, selected=array
<select v-model="selected" multi>
  <option>A</option>
  <option>B</option>
</select>
<input v-model.lazy.number.trim="number">
  1. v-pre
    编译跳过这个标签及其子标签,跳过没有指令的标签会加快编译
<span v-pre><span>
  1. v-cloak
    搭配 display 编译结束才显示
<span v-cloak>{{ text }}<span>
[v-cloak] {
  display: none;
}
  1. v-once
    只渲染元素,组件一次。数据变化不更新视图
<span v-once>{{ text }}</span>

参考文章

vue api

soonfy
2018-04-04

使用 mpvue 快速搭建一个小程序项目

初始化

# 全局安装 vue-cli
npm install --global vue-cli

# 创建一个基于 mpvue-quickstart 模板的新项目
vue init mpvue/mpvue-quickstart my-project

# 安装依赖
cd my-project
npm install

# 启动构建
npm run dev

问题

新增的页面需要重新 npm run dev 来进行编译

参考文章

mpvue quickstart

soonfy

css 居中

css 居中

css 居中还有很多,以后慢慢补充

水平居中

  1. 内联元素(文本)水平居中
.inline-item {
  text-align: center;
}
  1. 块级元素水平居中
.block-item {
  margin: 0 auto;
}
  1. 多个块级元素水平居中
  • text-align + display
.container {
  text-align: center;
}
.block-item {
  display: inline-block;
}
  • flex
.container {
  display: flex;
  justify-content: center;
}

垂直居中

  1. 单行内联元素(文本)垂直居中
.container {
  height: 100px;
  line-height: 100px;
}
  1. 多行元素垂直居中
  • table
.container {
  display: table;
}
.item {
  display: table-cell;
  vertical-align: middle;
}
  • flex
.container {
  display: flex;
  align-items: center;
}
or
.container {
  display: flex;
  flex-direction: column;
  justify-content: center;
}
  1. 块级元素垂直居中
  • 固定高度的块级元素垂直居中
.container {
  position: relative;
}
.item {
  position: absolute;
  top: 50%;
  height: 120px;
  margin-top: -60px;
}
  • 未知高度的块级元素垂直居中
.container {
  position: relative;
}
.item {
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
}

水平垂直居中

  1. 固定宽度和高度的元素水平垂直居中
.container {
  position: relative;
}
.item {
  width: 400px;
  height: 300px;
  padding: 20px;
  position: absolute;
  top: 50%;
  left: 50%;
  margin: -160px 0 0 -210px;
}
  1. 未知高度和宽度的元素水平垂直居中
.container {
  position: relative;
}
.item {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
}
  1. flex 布局
.container {
  display: flex;
  justify-content: center;
  align-items: center;
}

参考文章

这15种CSS居中的方式,你都用过哪几种?

soonfy
2018-04-03

html/css code style

通用规则

协议

  1. 使用 https 协议
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>
@import 'https://fonts.googleapis.com/css?family=Open+Sans';

风格

  1. 使用 2 个空格缩进
<ul>
  <li>Fantastic
  <li>Great
</ul>
.example {
  color: blue;
}
  1. 全部使用小写
<img src="google.png" alt="Google">
color: #e5e5e5;
  1. 移除末尾空格

基本信息

  1. 编码采用 UTF-8 (no BOM)
  2. 注释
  3. TODO

html

风格

  1. document type 使用 html5

    不用关闭空标签

<!DOCTYPE html>
<br>
  1. 验证 html 标签
<!DOCTYPE html>
<meta charset="utf-8">
<title>Test</title>
<article>This is only a test.</article>
  1. 语义化标签
<a href="recommendations/">All recommendations</a>
  1. 多媒体元素添加替代文本
<img src="spreadsheet.png" alt="Spreadsheet screenshot.">
  1. 分开 html,css,js

  2. 不使用实体引用

The currency symbol for the Euro is “€”.
  1. 省略选择性标签
<!DOCTYPE html>
<title>Saving money, saving bytes</title>
<p>Qed.
  1. 省略 type 属性
<link rel="stylesheet" href="https://www.google.com/css/maia.css">
<script src="https://www.google.com/js/gweb/analytics/autotrack.js"></script>

格式

  1. 块级元素,列表,表格缩进单独使用一行
<blockquote>
  <p><em>Space</em>, the final frontier.</p>
</blockquote>
<ul>
  <li>Moe
  <li>Larry
  <li>Curly
</ul>
<table>
  <thead>
    <tr>
      <th scope="col">Income
      <th scope="col">Taxes
  <tbody>
    <tr>
      <td>$ 5.00
      <td>$ 4.50
</table>
  1. 断行缩进 4 个字符
<md-progress-circular
    md-mode="indeterminate"
    class="md-accent"
    ng-show="ctrl.loading"
    md-diameter="35">
</md-progress-circular>
  1. 双引号包含属性值
<a class="maia-button maia-button-secondary">Sign in</a>

css

风格

  1. 验证 css

  2. 使用有意义的或者通用的 id 或者类名

#gallery {}
#login {}
.video {}
.aux {}
.alt {}
  1. id 或者类名要短而有意义
#nav {}
.author {}
  1. 不要把 id 或者类与元素混合使用
#example {}
.error {}
  1. 尽量使用速记属性
font: 100%/1.6 palatino, georgia, serif;
padding: 0 1em 2em;
  1. 属性值 0 后不使用单位
margin: 0
  1. 省略前置 0
margin: .5em
  1. 尽量使用 3 个字符的 16 进制
color: #fff
  1. 有意义的前缀
.mani-note {}
  1. 属性名用连字符分隔
name-id: {}
  1. 避免使用用户代理的 css hacks

格式

  1. 字母声明顺序
background: fuchsia;
border: 1px solid;
-moz-border-radius: 4px;
-webkit-border-radius: 4px;
border-radius: 4px;
color: black;
text-align: center;
text-indent: 2em;
  1. 缩进块级内容
@media screen, projection {

  html {
    background: #fff;
    color: #444;
  }

}
  1. 每条声明最后添加分号
.test {
  display: block;
  height: 100px;
}
  1. 声明冒号后添加空格
h3 {
  font-weight: bold;
}
  1. 选择器和声明之间添加空格
#video {
  margin-top: 1em;
}
  1. 每个选择器单独占一行
h1,
h2,
h3 {
  font-weight: normal;
  line-height: 1.2;
}
  1. 每条规则占一行,声明之间添加一个空行
html {
  background: #fff;
}

body {
  margin: auto;
  width: 50%;
}
  1. 规则中使用单引号,url 中不使用引号
@import url(https://www.google.com/css/maia.css);

html {
  font-family: 'open sans', arial, sans-serif;
}

基本信息

  1. 注释
/* header */

参考

google html/css style

soonfy

css 选择器

基本选择器

选择器 例子 例子描述 css
element div 选择所有 div 元素 1
.class .info 选择 class="info" 的所有元素 1
#id #info 选择 id="info" 的所有元素 1
* * 选择所有元素 2

组合选择器

选择器 例子 例子描述 css
element,element div,p 选择 div 元素和 p 元素 1
element element div p 选择是 div 元素后代的 p 元素 1
element>element div>p 选择是 div 元素子元素 p 2
element+element div+p 选择紧跟在 div 元素之后同级的 p 元素 2

属性选择器(css2)

选择器 例子 例子描述 css
[attribute] [name] 选择具有 name 属性的元素 2
[attribute=value] [name=index] 选择 name="index" 的元素 2
[attribute~=value] [name~=index] 选择 name 属性包含单词 index 的元素 2
[attribute|=value] [name|=index] 选择 name 属性以 index 开头的元素 2

伪类选择器(css2)

选择器 例子 例子描述 css
element:link a:link 选择未被访问的 a 元素 1
element:visited a:visited 选择已被访问的 a 元素 1
element:hover a:hover 选择鼠标悬浮的 a 元素 1
element:active a:active 选择活动的 a 元素 1
element:focus input:focus 选择获得焦点的 input 元素 2
element:lang(value) p:lang(en) 选择 lang="en" 的 p 元素 2
element:first-child div:first-child 选择属于父元素的第一个子元素 div 2

伪元素(css2)

选择器 例子 例子描述 css
element:first-line p:first-line 选择 p 元素的第一行 1
element:first-letter p:first-letter 选择 p 元素的第一个字符 1
element:before p:before 在 p 元素之前插入内容 2
element:after p:after 在 p 元素之后插入内容 2

同级元素(css3)

选择器 例子 例子描述 css
element~element div~p 选择 div 之后的 p 元素 3

属性选择器(css3)

选择器 例子 例子描述 css
element[attribute^=value] p[class^=info] 选择 class 属性以 info 开头的 p 元素 3
element[attribute$=value] p[class$=info] 选择 class 属性以 info 结尾的 p 元素 3
element[attribute*=value] p[class*=info] 选择 class 属性包含 info 的 p 元素 3

表单伪类(css3)

选择器 例子 例子描述 css
element:enabled input:enabled 选择启用的 input 元素 3
element:disabled input:disabled 选择禁用的 input 元素 3
element:checked radio:checked 选择被选中的 radio 元素 3
element::selection p::selection 选择当前被选取的 p 元素部分 3
element:in-range input:in-range 选择输入值在区间内的 input 元素 3
element:out-of-range input:out-of-range 选择输入值在区间外的 input 元素 3
element:read-write input:read-write 选择可读写的 input 元素 3
element:read-only input:read-only 选择只读(readonly)的 input 元素 3
element:valid input:valid 选择输入值合法的 input 元素 3
element:invalid input:invalid 选择输入值不合法的 input 元素 3
element:optional input:optional 选择可选输入的 input 元素 3
element:required input:required 选择必须输入(required)的 input 元素 3

结构伪元素

选择器 例子 例子描述 css
:root :root 选择文档的 root 根元素 3
:empty p:empty 选择没有子元素的 p 元素 3
element:nth-child(n) p:nth-child(2) 选择父元素的第 2 个子元素是 p 元素的当前 p 元素 3
element:nth-last-child(n) p:nth-last-child(2) 选择父元素的倒数第 2 个子元素是 p 元素的当前 p 元素 3
element:nth-of-type(n) p:nth-of-type(2) 选择属于父元素的第 2 个 p 子元素 3
element:nth-last-of-type(n) p:nth-last-of-type(2) 选择属于父元素的倒数第 2 个 p 子元素 3
element:last-child p:last-child 选择父元素的最后一个子元素是 p 元素的当前 p 元素 3
element:first-of-type p:first-of-type 选择属于父元素的第一个 p 子元素 3
element:last-of-type p:last-of-type 选择属于父元素的最后一个 p 子元素 3
element:only-child p:only-child 选择父元素的唯一子元素是 p 元素的当前 p 元素 3
element:only-of-type p:only-of-type 选择属于父元素的唯一 p 子元素 3

否定伪类

选择器 例子 例子描述 css
element:not() :not(p) 选择非 p 元素 3

锚点伪类

选择器 例子 例子描述 css
:target .info:target 选择 class="info" 中活动的锚点 3

参考文章

css选择器笔记

css选择器

soonfy
2018-03-30

ubuntu 使用 mongodb

1. install/start/stop/restart/remove

1.1 install mongodb 3.2

  • sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv EA312927 导入mongo公钥
  • echo "deb http://repo.mongodb.org/apt/ubuntu trusty/mongodb-org/3.2 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.2.list 添加mongo源
  • sudo apt-get update 更新软件列表
  • sudo apt-get install -y mongodb-org 强制安装

1.2 start mongodb

  • sudo service mongod start

1.3 stop mongodb

  • sudo service mongod stop

1.4 restart mongodb

  • sudo service mongod restart

1.5 remove mongodb

  • sudo apt-get purge mongodb-org 使用purge选项彻底删除文件,mongodb-org 如果不对 就填写自己安装的mongodb具体的文件名和版本
  • sudo rm -r /var/log/mongodb 删除数据库和日志
  • sudo rm -r /var/lib/mongodb
  • sudo apt-get autoremove 清除配置
  • sudo apt-get clean 清除文件

2. set mongodb start itself

2.1 make new folder to store mongodb data, and new file to store mongodb log

ex:

  • folder: /home/soonfy/mongodb/mongodb_data/
  • file: /home/soonfy/mongodb/mongodb.log

2.2 at path /etc/mongod.conf set mongod config

  • filepath and log

ex:

  • sudo gedit /etc/mongod.conf
  • dbpath='/home/soonfy/mongodb/mongodb_data/'
  • logpath='/home/soonfy/mongodb/mongodb.log'

2.3 at path /etc/rc.local add code before last line(exit 0)

ex:

  • /usr/bin/mongod -dbpath=/home/soonfy/mongodb/mongodb_data/ --fork --port 27017 --logpath=/home/soonfy/mongodb/mongodb.log --logappend --auth &

3. mongodb handle

  • show dbs list dbs
  • use db => show collections list collections
  • use db => db.<collection name>.find({}) list documents
  • use db => db.<collection name>.remove({}) remove documents
  • use db => db.<collection name>.drop() delete collection
  • use db => db.dropDatabase() delete db
  • mongodump -d <db name> -o <dump file path> dump db
  • mongorestore -d <db name> <restore file path> restore db
  • mongoexport -d <db name> -c <collection name> -o <export file name> export collection
  • mongoimport -d <db name> -c <collection name> <import file name> import collection
  • mongo -h <host name>:<port>/<db name> -u <user name> -p <user password> connect server db
  • mongoimport -h <host name>:<port>/ -u <user name> -p <user password> -d <db name> -c <collection name> <import file name> import collection to server db

4. mongodb auth

4.1 create root user

  • close --auth 关闭认证
  • create root user 新建超级用户,设置用户名,密码,角色,数据库

内置角色
数据库用户角色:read,readWrite
数据库管理角色:dbAdmin,dbOwner,userAdmin
集群管理角色:clusterAdmin,clusterManager,clusterMonitor,hostManager
备份回复角色:backup,restore
所有数据库角色:readAnyDatabase,readWriteAnyDatabase,userAdminAnyDatabase,dbAdminAnyDatabase
超级用户角色:root
内部角色:_system

use admin
db.createUser({
    user: <root user name>,
    pwd: <root user password>,
    roles: [{
      role: 'root',
      db: 'admin'
    }]
})

4.2 create common user

  • open --auth 开启认证
  • create common user 新建普通用户
use admin
db.auth(<user name>, <user password>)
use <db name>
db.createUser({
    user: <common user name>,
    pwd: <common user password>,
    roles: [{
      role: 'readWrite',
      db: <db name\>
    }]
})

5. node use mongodb

5.1 node connect mongodb

  • set mongodb url
mongodb_url = 'mongodb://<common user name>:<common user password>@localhost:27017/<db name>'

ex:
db name: DBTest, user name: DBUser, user password: DBPwd
url = mongodb://DBUser:DBPwd@localhost:27017/DBTest
mongoose.connect(url)

5.2 node connect mongodbs

  • mongoose.createConnction()

ex:
fdburl = 'mongodb://localhost/fdb'
sdburl = 'mongodb://localhost/sdb'
connect db in models
first connection
let fcon = mongoose.createConnction(fdburl)
fcon.model(fcollection, collectionSchema)
second connection
let scon = mongoose.createConnction(sdburl)
scon.model(scollection, collectionSchema)

5.3 node mongo debug

  • insert debug in development
if (app.get('env') === 'development') {
  mongoose.set('debug', true)   //debug
  app.use(function(err, req, res, next) {
    res.status(err.status || 500);
    res.render('error', {
      message: err.message,
      error: err
    });
  });
}

6. mongoexport

  • mongo export csv
mongoexport -h host --port port -u sf -p sf -d db -c collection -q '{name: "sf"}' -f name,age --csv -o ~/user.csv

soonfy

mongodb 删除属性

mongodb 删除属性

model.update({}, {$unset: {attr: 1}}, {multi: true});

soonfy

egg

初始化项目 egg-init

npm i egg-init -g
egg-init -h
egg-init --type simple <file path>

soonfy

微信小程序认证授权

微信公众平台 注册 微信小程序账号

设置开发设置中复制AppID(小程序ID)AppSecret(小程序密钥)

使用 mpvue 搭建开发项目

其中有一步需要 AppID
完成后 npm run dev 启动

打开项目

使用 微信开发工具

认证授权逻辑

  1. 判断是否已经授权。getSetting()

  2. 未授权,按钮授权并获取用户信息。<button open-type="getUserInfo">授权</button>

  3. 已授权直接获取用户信息。getUserInfo()

  4. 获取 openid。login()

/sns/jscode2session 获取 openid

  1. 获取 unionid。

WXBizDataCrypt 解密 unionid

参考文章

BUG反馈
小程序•小故事(4)——获取用户信息
小程序•小故事(6)——微信登录能力优化
小程序登录 - wx.login

soonfy

http 状态码

http 状态码

1XX

informational 信息性状态码,接收的请求正在处理;

2XX

success 成功状态码,请求正常处理完毕;

  1. 200 ok
    表示从客户端发来的请求已经被服务器成功处理;

  2. 204 not content
    表示服务器接收的请求已经成功处理,但返回的报文不包含实体的主体部分;

  3. 206 partial content
    表示客户端进行范围请求,服务器已经成功处理了这部分 get 请求;

3XX

redirection 重定向状态码,需要进行附加操作以完成请求;

  1. 301 moved permanently
    永久性重定向。表示请求的资源已经被分配了新的 uri,以后使用现在所指的 uri;

  2. 302 found
    临时性重定向。表示请求的资源已经被分配了新的 uri,用户本次请求使用现在所指的 uri;

  3. 303 see other
    表示请求的资源已经被分配了新的 uri,使用 get 方法定向请求资源;

  4. 304 not modified
    表示服务器资源没有发生改变,客户端可以使用缓存;

  5. 307 temporary redirect
    临时重定向。表示请求的资源已经被分配了新的 uri,必须使用相同的方法请求资源;

4XX

client error 客户端错误状态码;

  1. 400 bad request
    表示请求报文中存在语法错误;

  2. 401 unauthorized
    表示发送的请求需要有通过 http 验证(basic验证,digest验证)的认证信息,如果之前已经发过请求,表示用户验证失败;

  3. 403 forbidden
    表示对资源的请求已经被服务器拒绝;未获得系统文件的访问授权,访问权限出现问题(未授权的 ip 地址);

  4. 404 not found
    表示服务器上找不到请求的资源;

5XX

server error 服务器错误状态码;

  1. 500 internal server error
    表示服务器在处理请求的时候发生错误;

  2. 503 service unavailable
    表示服务器暂时处于超负载或者正在停机维护;

参考文章

《图解HTTP》

HTTP response codes

soonfy
2018-03-31

文本处理

首行缩进

text-indent: 24px;

字符间距

letter-spacing: 1px;

行间距

line-height: 20px;

soonfy

koa 中间件

koa middleware

koa

import * as koa from 'koa';
const app = new koa();
app.use((ctx) => {
  ctx.body = data;
})
app.listen(3000);

koa-logger

import * as koa from 'koa';
import * as logger from 'koa-logger';
const app = new koa();
app.use(logger(() => {
  // ...
}))
app.listen(3000);

koa-router

import * as koa from 'koa';
import * as Router from 'koa-router ';
const app = new koa();
let router = new Router({
  prefix: '/admin'
});
router.get('/', async (ctx, next) => {
  // ...
})
app.use(router.routes());
app.use(router.allowedMethods());
app.listen(3000);

koa-bodyparser

import * as koa from 'koa';
import * as bodyParser from 'koa-bodyparser';
const app = new koa();
app.use(bodyParser());
app.use(async (ctx) => {
  ctx.body = ctx.request.body;
})
app.listen(3000);

koa-ejs

import * as koa from 'koa';
import * as render from 'koa-ejs';
import * as path from 'path';
const app = new koa();
render(app, {
  root: path.join(__dirname, 'view'),
  viewExt: 'ejs',
  cache: false,
  debug: true
})
app.use(async (ctx) => {
  ctx.render('admin', adminData);
})
app.listen(3000);

koa-static

import * as koa from 'koa';
import * as serve from 'koa-static';
const app = new koa();
app.use(serve('public'));
app.listen(3000);

koa-cors

import * as koa from 'koa';
import * as cors from 'koa-cors';
const app = new koa();
app.use(cors());
app.listen(3000);
  • Access-Control-Allow-Origin = *
  • Access-Control-Allow-Methods = 'GET, PUT, POST, DELETE, OPTIONS'
  • Access-Control-Allow-Headers = 'x-requested-with, accept, origin, content-type'
  • Content-Type = 'application/json;charset=utf-8'

soonfy
2018-03-31

数组排序

给定数组

arr = [{
  name: '小明',
  age: 3
}, {
  name: '小华',
  age: 1
}, {
  name: '小光',
  age: 2
}, {
  name: '小红',
  age: 4
}]

按照数字从小到大

arr = arr.sort((a, b) => a.age - b.age)

按照特定顺序排序

小红,小华,小光,小明

order = ['小红', '小华', '小光', '小明']
arr = arr.sort((a, b) => order.indexOf(a.name) - order.indexOf(b.name))

soonfy

css 媒体查询

媒体查询

css2

css2 媒体查询针对媒体类型(显示器,便捷设备,电视机等)设置不同的样式规则;

css3

css3 取代查找媒体类型,根据设置自适应显示;

  1. viewport(视窗)的宽度与高度;
  2. 设备的宽度与高度;
  3. 朝向(智能手机横屏,竖屏);
  4. 分辨率;

伪范式

media_query_list
<media_query> [, <media_query>]

media_query
[only | not]? <media_type> [and <expression>]
expression [and <expression>]

media_type
all, screen, print, speech

expression
( <media_feature> [: value]? )

media_feature
width, min-width, max-width,
height, min-height, max-height,
device-width, min-device-width, max-device-width,
device-height, min-device-height, max-device-height,
aspect-ratio, min-aspect-ratio, max-aspect-ratio,
device-aspect-ratio, min-device-aspect-ratio, max-device-max-ratio,
color, min-color, max-color,
color-index, min-color-index, max-color-index,
monochrome, min-monochrome, max-monochrome,
resolution, min-resolution, max-resolution,
orientation, scan, grid

实例

  1. link 元素中的 css 媒体查询;
<link rel="stylesheet" media="screen and (max-width: 768px)" href="small.css" />
  1. 样式表中的 css 媒体查询;
<style>
  @media screen and (max-width: 768px) {
    .info {
      display: none;
    }
  }
</style>

逻辑操作符

  1. and 合并多个媒体属性或者合并媒体属性与媒体类型;
  2. not 应用于整个媒体查询,最后否定查询结果;
  3. only 用于指定某种特定的媒体类型;
  4. ,逗号分隔媒体查询,并列媒体查询,每个媒体查询都是独立的;

媒体类型 media_type

  1. all 所有设备;
  2. screen 显示器,电脑屏幕,平板电脑,智能手机;
  3. print 用于打印机,打印预览;
  4. speech 屏幕阅读器等语音设备;

媒体功能 media_feature

  1. width 宽度
    定义输出设备渲染区域的宽度(可视区域的宽度,打印机纸盒的宽度);
    接受 min, max 前缀
@media screen and (min-width: 576px) and (max-width: 768px) { }
  1. height 高度
    定义输出设备渲染区域的高度(可视区域的高度,打印机纸盒的高度);
    接受 min,max 前缀
@media screen and (min-height: 420px) and (max-height: 570px) { }
  1. device-width 设备宽度
    定义输出设备的宽度(整个屏幕或者页的高度);
    接受 min,max 前缀
@media screen and (min-device-width: 568px) and (max-device-width: 768px) { }
  1. device-height 设备高度
    定义输出设备的高度(整个屏幕或者页的高度);
    接受 min,max 前缀
@media screen and (min-device-height: 420px) and (max-height: 570px) { }
  1. aspect-ratio 宽高比
    定义输出设备渲染区域的宽高比。包含以 / 分隔的两个正整数,代表水平像素和垂直像素;
    接受 min,max 前缀
@media screen and (min-aspect: 1/1) { }
  1. device-aspect-ratio 设备宽高比
    定义输出设备的宽高比。包含以 / 分隔的两个正整数,代表水平像素和垂直像素;
    接受 min,max 前缀
@media screen and (device-aspect-ratio: 16/9), screen and (device-aspect-ratio: 16/10) { }
  1. color 颜色
    定义输出设备每个像素单元的比特值。如果不支持输出颜色,值为0;
    接受 min,max 前缀
@media all and (color) { }
@media all and (min-color: 4) { }
  1. color-index 颜色索引
    定义输出设备中颜色查询表中的条目数量;
    接受 min,max 前缀
@media all and (color-index) { }
@media all and (min-color-index: 256) { }
  1. monochrome 黑白
    定义黑白(灰度)设备每个像素的比特值。如果不是黑白设备,值为0;
    接受 min,max 前缀
@media all and (monochrome) { }
@media all and (min-monochrome: 8) { }
  1. resolution 分辨率
    定义输出设备的分辨率(像素密度)。分辨率使用每英寸(dpi)或者每厘米(dpcm);
    接受 min,max 前缀
@media print and (min-resolution: 300dpi) { }
@media screen and (min-resolution: 2dppx) { }
  1. orientation 方向
    定义设备处于横屏模式(高度大于宽度)还是竖屏模式(宽度大于高度);
    landscape 横屏模式,portrait 竖屏模式;
    不接受 min,max 前缀
@media all and (orientation: portrait) { }
  1. scan 扫描
    定义电视输出设备的扫描过程;
    progressive 顺序方式,interlace 逆序方式;
    不接受 min,max 前缀
@media tv and (scan: progressive) { }
  1. grid 网格
    定义输出设备是网格设备还是位图设备;网格设备值为1,否则为0;
    不接受 min,max 前缀
@media screen and (grid) and (max-width: 15em) { }

参考文章

css媒体查询

soonfy
2018-03-30

微信小程序上拉刷新,下滑更多

上拉刷新

  1. 设置 enablePullDownRefresh = true

  2. 定义 onPullDownRefresh() 处理函数

  3. 刷新数据后,wx.stopPullDownRefresh 可以停止当前页面的下拉刷新

下滑更多

  1. 设置 onReachBottomDistance = 50

  2. 定义 onReachBottom() 处理函数

UI

  1. 变更弹出框状态
wx.showLoading()
wx.showToast()
wx.hideToast()
wx.hideLoading()
  1. 变更导航条状态
wx.showNavigationBarLoading()
wx.hideNavigationBarLoading()

soonfy

vue-router 动态设置页面 title

动态 title

  1. 引入 vue-router
import Vue from 'vue'
import Router from 'vue-router'
Vue.use(Router)
  1. 配置 router
const router = new Router({
  routes: [
    {
      path: '/',
      name: name,
      component: component,
      meta: {
        title: title
      }
    }
  ]
})
  1. 定义钩子,暴露出去
router.beforeEach((to, from, next) => {
  if (to.meta.title) {
    document.title = to.meta.title
  }
  next()
})
export default router

参考文章

使用 vue-router 设置每个页面的 title
vue-router 动态设置页面 title

soonfy

mpvue 中 this 的指向

指向 vue 实例(正确)

wx.login({
  success: () => {
    wx.getUserInfo({
      success: (res) => {
        this.userInfo = res.userInfo
         // this 指向 vue 实例
      }
    })
  }
})

指向当前函数(错误)

wx.login({
  success () {
    wx.getUserInfo({
      success (res) {
        this.userInfo = res.userInfo
         // this 指向 success 函数
      }
    })
  }
})

soonfy

mpvue 生命周期

vue 生命周期

  • beforeCreate
  • created
  • beforeMount
  • mounted
  • beforeUpdate
  • updated
  • activated
  • deactivated
  • beforeDestroy
  • destroyed

小程序生命周期

  1. app 部分
  • onLaunch
  • onShow
  • onHide
  1. page 部分
  • onLoad
  • onShow
  • onReady
  • onHide
  • onUnload
  • onPullDownRefresh
  • onReachBottom
  • onShareAppMessage
  • onPageScroll
  • onTabItemTap

图示

mpvue 生命周期

参考文章

mpvue

soonfy

brew

brew

  1. 安装
brew install <name>
  1. 卸载
brew uninstall <name>
  1. 查找
brew search <name>
  1. 列举已安装
brew list
  1. 更新brew
brew update
  1. 安装 mongodb 启动服务
brew services start mongodb

soonfy

小程序限制

1. 不能操作 DOM

2. 代码包上限 2048kb

3. 数据传输上限 1048576B = 1MB(setData 方法)

nginx 常用指令

启动

// 默认配置
nginx
// 配置文件
nginx -c <nginx.conf>

停止

// 快速停止
nginx -s stop
// 优雅停止
nginx -s quit

测试

// 测试
nginx -t
// 测试只输出错误信息
nginx -q

重新加载配置

nginx -s reload

soonfy

mac init environment

mac init environment

install brew

brew

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

install iTerm2

iTerm2

install oh-my-zsh

zsh
oh-my-zsh

brew install zsh zsh-completions
sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"

install node

node
nvm

curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.9/install.sh | bash
nvm ls-remote
nvm install

install mongodb

brew install mongodb
brew services start mongodb

install redis

  1. install
brew install redis
  1. start
redis-server /usr/local/etc/redis.conf
  1. stop
redis-cli shutdown
  1. autostart
ln -sfv /usr/local/opt/redis/*.plist ~/Library/LaunchAgents
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.redis.plist
  1. stop autostart
launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.redis.plist

install node-oracledb

Instant Client

  1. install
download instantclient-basic-macos.x64-12.2.0.1.0-2.zip
download instantclient-sdk-macos.x64-12.2.0.1.0-2.zip
  1. unzip, merge, rename instantclient, move to /opt/oracle/

  2. .zshrc append export path

export OCI_LIB_DIR=/opt/oracle/instantclient
export OCI_INC_DIR=/opt/oracle/instantclient/sdk/include
export ORACLE_HOME=/opt/oracle/instantclient
export DYLD_LIBRARY_PATH=/opt/oracle/instantclient
export LD_LIBRARY_PATH=/opt/oracle/instantclient
export ARCH=x86_64

install zmq

brew install zmq

install vscode

vscode

install chrome

chrome

install phantomjs

PHANTOMJS_CDNURL=https://npm.taobao.org/dist/phantomjs npm i

install pkg-config

pkg-config

curl http://pkgconfig.freedesktop.org/releases/pkg-config-0.29.2.tar.gz -o pkg-config-0.29.2.tar.gz

tar -xf pkg-config-0.29.2.tar.gzcd pkg-config-0.29.2

sudo ./configure --with-internal-glib
sudo make
sudo make install

soonfy

css colors

bootstrap

  1. primary
color: #007bff;
  1. secondary
color: #6c757d;
  1. success
color: #28a745;
  1. danger
color: #dc3545;
  1. warning
color: #ffc107;
  1. info
color: #17a2b8;
  1. light
color: #f8f9fa;
  1. dark
color: #343a40;
  1. white
color: #fff;

element

  1. blue
color: #409eff;
  1. success
color: #67c23a;
  1. warning
color: #e6a23c;
  1. danger
color: #f56c6c;
  1. info
color: #909399;
  1. font
color: #303133;
color: #606266;
color: #909399;
color: #c0c4cc;
  1. border
color: #dcdfe6;
color: #e4e7ed;
color: #ebeef5;
color: #f2f6fc;

iview

  1. primary
color: #2d8cf0;
  1. light primary
color: #5cadff;
  1. dark primary
color: #2b85e4;
  1. info
color: #2d8cf0;
  1. success
color: #19be6b;
  1. warning
color: #ff9900;
  1. error
color: #ed3f14;
  1. title
color: #1c2438;
  1. content
color: #495060;
  1. sub color
color: #80848f;
  1. disabled
color: #bbbec4;
  1. border
color: #dddee1;
  1. divider
color: #e9eaec;
  1. background color
color: #f8f8f9;

参考

bootstrap colors
element color
iview color

soonfy

js 保留 2 位小数

保留 2 位小数

const formatter = (number) => Math.round(number * 100) / 100;

强制保留 2 位小数

const formatter = (number) => number.toFixed(2);

当最后一位小数是 0 时,数字格式没办法保留,只能使用字符串格式。

soonfy

vue-cli 生产环境 build 找不到 静态文件

默认配置

build 之后静态文件的引用路径

<link href=/static/css/app.bc0c5696b5c73205f3cc049cd051b772.css rel=stylesheet>

这样找不到静态文件,打开页面是空白

修改 config/index.jsbuildassetsPublicPath 属性为 './'

build: {
    // Template for index.html
    index: path.resolve(__dirname, '../dist/index.html'),

    // Paths
    assetsRoot: path.resolve(__dirname, '../dist'),
    assetsSubDirectory: 'static',
    assetsPublicPath: './',
}

build之后静态文件的引用路径

<link href=./static/css/app.bc0c5696b5c73205f3cc049cd051b772.css rel=stylesheet>

soonfy

css 优先级

样式表优先级

优先级就是分配给指定的 css 声明的一个权重,由 匹配的选择器的数值 决定;
多个 css 声明的优先级相同时,应用最后一个声明;
直接定义的 css 声明覆盖从祖先元素继承的属性;
定义声明中元素的接近程度对优先级没有影响;

选择器类型

  1. 类型选择器(div),伪元素(::before);

  2. 类选择器(.class),属性选择器([type="text"]),伪类(:hover);

  3. id 选择器(#id);

3 > 2 > 1;
通配符(*),关系选择符(+>~),否定伪类(:not())对优先级没有影响;
否定伪类(:not())内部声明的选择器会影响优先级;

特殊优先级

color: red !import;

元素内联样式(style="font-size: 12px;")覆盖外部样式表的任何样式;
!import 规则会覆盖其它任何声明;
互相冲突的 !import 规则应用优先级更高的;

参考文章

优先级 - mdn

soonfy
2018-03-30

npm config

list config

npm config ls -l

set config

  1. access

    unscoped packages default public
    scoped packages default restricted

  2. allow-same-version

    default false

  3. always-auth

    default false

  4. also

    [String] default null

  5. audit

    default true

  6. auth-type

    [legacy | sso | saml | oauth] default legacy

  7. bin-links

    default true

  8. browser

    [String] OS X default open, Windows default start, Others default xdg-open

  9. ca

    [String | Array | null] default npm ca certificate

  10. cafile

    [path] default null
    ca certificate file path

  11. cache

    [path] Posix default ~/.npm, Windows default %appData%\npm_cache

  12. cache-lock-stale

    [Number] default 60000

  13. cache-lock-retries

    [Number] default 10

  14. cache-max

    [Number] default infinity, deprecated

  15. cache-min

    [Number] default 10, deprecated

  16. cert

    [String] default null

  17. cidr

    [String | Array | null] default null

  18. color

    [Boolean | always] default true

  19. depth

    [number] default infinity
    npm ls, npm cache ls, outdate depth

  20. description

    default true
    npm search show description

  21. dev

    default false

  22. dry-run

    default false
    if true, only use install, uninstall, update, dedupe, not use dist-tags, publish, owner

  23. editor

    [path] Posix default vi, Windows default notepad

  24. engine-strict

    default false
    if true, only install compatible current node.js version

  25. force

    default false

  26. fetch-retries

    [Number] default 2
    retry times from registry

  27. fetch-retry-factor

    [Number] default 10

  28. fetch-retry-mintimeout

    [Number] 10000

  29. fetch-retry-maxtimeout

    [Number] 60000

  30. git

    [String] default git

  31. git-tag-version

    default true
    npm version command

  32. global

    default false

  33. globalconfig

    [path] {prefix}/etc/npmrc

  34. global-style

    default false

  35. group

    [String | Number] default current process GID

  36. heading

    [String] npm
    npm debug log start

  37. https-proxy

    [url] default null

  38. if-present

    default false

  39. ignore-prepublish

    default false
    if true, ignore prepublish script

  40. ignore-scripts

    default false
    if true, ignore package.json scripts

  41. init-module

    [path] default ~/.npm-init.js

  42. init-author-name

    [String] default ''

  43. init-author-email

    [email] default ''

  44. init-email-url

    [url] default ''

  45. init-license

    [license] default ISC

  46. init-version

    [version] default 1.0.0

  47. json

    default false
    npm ls --json, npm search --json

  48. key

    [String] default null

  49. legacy-bundling

    default false

  50. link

    default false

  51. local-address

    [IP address] undefined

  52. loglevel

    [silent | error | warn | notice | http | timing |info | verbose | silly] default notice

  53. logstream

    [stream] process.stderr

  54. logs-max

    [number] default 10
    max log files

  55. long

    default false
    npm ls, npm search info

  56. maxsockets

    [Number] default 50
    max connections

  57. message

    [String] default %s

  58. metrics-registry

    [String] default registry value

  59. node-options

    [String] default null

  60. node-version

    [semver] default process.version

  61. no-proxy

    [String | Array] default null

  62. offline

    default false

  63. onload-script

    default false

  64. only

    default null
    dev, development
    prod, production

  65. optional

    default true

  66. otp

    [Number] default null

  67. package-lock

    default true
    if false, ignore package-lock.json

  68. package-lock-only

    default false
    if true, only update package-lock.json

  69. parseable

    default false

  70. prefer-offline

    default false

  71. prefer-online

    default false

  72. prefix

    [path]

  73. production

    default false

  74. progress

    default true

  75. proxy

    [url] default null

  76. read-only

    default false
    npm token create

  77. rebuild-bundling

    default true

  78. registry

    [url] default https://registry.npmjs.org/

  79. rollback

    default true

  80. save

    default true

  81. save-bundle

    default false

  82. save-prod

    default false

  83. save-dev

    default false

  84. save-exact

    default false

  85. save-optional

    default false

  86. save-prefix

    [^ | ~] default ^
    ^ minor, ~ patch

  87. scope

    [String] default ''

  88. script-shell

    [path] default null

  89. script-prepend-node-path

    [Boolean | auto | warn-only] default warn-only

  90. searchexclude

    [String] default ''

  91. searchopts

    [String] default ''

  92. searchlimit

    [Number] default 20

  93. searchstaleness

    [Number] default 900

  94. send-metics

    default false

  95. shell

    [path] Posix default bash, Windows default cmd

  96. shrinkwrap

    default true

  97. sign-git-tag

    default true

  98. sso-poll-frequency

    [Number] default 500

  99. sso-type

    [oauth | saml | none] default oauth

  100. strict-ssl
    > default true

  101. tag

    [String] default latest

  102. tag-version-prefix

    [String] default v

  103. timing

    default false

  104. tmp

    [path] default /tmp

  105. unicode

    unix/mac default true, Windows default false

  106. unsafe-perm

    root run false, other true

  107. usage

    default false

  108. user

    [UID] default nobody

  109. userconfig

    [path] ~/.npmrc

  110. umask

    default 022

  111. user-agent

    [String]

  112. version

    default false

  113. versions

    default false

  114. viewer

    Posix default man, Windows default browser

soonfy

gruntfile 配置

配置文件

/**
  *
  * gruntfile配置模板
  * written by soonfy
  *
  * grunt-contrib-uglify压缩js文件
  * grunt-contrib-cssmin压缩css文件
  * grunt-nodemon重启程序
  * grunt-contrib-watch重启任务
  * grunt-concurrent并发控制
  *
*/

module.exports = function (grunt) {

  // 初始化插件
  grunt.initConfig({
    //读取package.json
    pkg: grunt.file.readJSON('package.json'),

    //初始化压缩js文件插件
    uglify: {
      options: {
        banner: '/*! <%= pkg.name %> <%= grunt.template.today("yyyy-mm-dd") %> */\n'              //添加头标
      },
      //声明任务
      build: {
        options: {
          mangle: false,                                      //不混淆变量名
          // preserveComments: 'all',                 //不删除注释
          report: 'min',                                        //输出压缩率
          footer: '\n/*! <%= pkg.name %> 最后修改于: <%= grunt.template.today("yyyy-mm-dd") %> */'         //尾标
        },
        files: [{
          expand: true,                                         //expand设置为true,启动下列参数
          cwd: 'controllers',                                 //所有src指定的匹配都是相对此路径
          src: ['*.js', '../public/javascripts/*.js'],                                         //源文件匹配格式
          dest: 'zip_files/js',                      //目标文件存放路径
          ext: '.min.js'
        }]
      }
    },
    //初始化压缩css文件插件
    cssmin: {
      options: {
        banner: '/*! <%= pkg.name %> <%= grunt.template.today("yyyy-mm-dd") %> */\n'              //添加头标
      },
      build: {
        files: [{
          expand: true,
          cwd: 'public/stylesheets',
          src: '*.css',
          dest: 'zip_files/cs',
          ext: '.min.css'
        }]
      }
    },
    //初始化重启程序插件
    nodemon: {
      dev: {
        script: 'bin/www',                                //重启程序文件
        options: {
          args: [],                                               //传递到script的参数
          nodeArgs: ['--debug'],                          //打开debug服务器
          ignore: ['README.md', 'node_modules/**','zip_files/**'],           //忽略文件
          ext: 'js',                                              //监测文件类型
          watch: ['./'],
          delay: 1000,                                        //延迟重启
          env: {                                                  //重启的环境设置
            PORT: '3000'
          },
          cwd: __dirname                                  //当前活动路径
        }
      }
    },
    //初始化重启任务插件
    watch: {
      //监测js文件
      script: {
        options: {
          livereload: true
        },
        files: 'controllers/*.js',
        tasks: ['uglify']
      },
      //监测css文件
      css: {
        options: {
          livereload: true
        },
        files: 'public/stylesheets/*.css',
        tasks: ['cssmin']
      },
      //检测html文件
      html: {
        options: {
          livereload: true
        },
        files: 'views/*.jade',
        tasks: []
      }
    },
    //初始化并发任务插件
    concurrent: {
      //声明任务
      target: {
        tasks: ['nodemon', 'watch'],                    //并发任务
        options: {
          logConcurrentOutput: true                   //并发输出日志
        }
      }
    }
  });

  //加载插件
  grunt.loadNpmTasks('grunt-contrib-uglify');
  grunt.loadNpmTasks('grunt-contrib-cssmin');
  grunt.loadNpmTasks('grunt-nodemon');
  grunt.loadNpmTasks('grunt-contrib-watch');
  grunt.loadNpmTasks('grunt-concurrent');

  //注册任务
  grunt.registerTask('default', ['uglify:build', 'cssmin:build', 'concurrent:target']);
};

soonfy

weui grid

默认九宫格

.weui-grid {
  width: 33.3333333%;
}

转换为N宫格

覆盖 .weui-grid 的 width 属性

.weui-grid {
  width: 50%;
}

soonfy

RESTful 格式化

请求

get

> 获取数据

post

> 添加数据

put

> 修改数据

delete

> 删除数据

url

> 小写复数名词,_ 或者 - 分隔
  1. 获取用户列表
get /users/
  1. 获取某个用户
get /users/666/
  1. 获取某个用户的关注列表
get /users/666/follows/
  1. 获取某个用户的某个关注
get /users/666/follows/999/
  1. 添加某个用户
post /users/
  1. 添加某个用户的某个关注
post /users/666/follows/
  1. 修改某个用户
put /users/666/
  1. 修改某个用户的某个关注
put /users/666/follows/999/
  1. 删除某个用户
delete /users/666/
  1. 删除某个用户的某个关注
delete /users/666/follows/999/

status code

HTTP Status Codes

参考

REST API

soonfy

js 小数百分比转换

小数转百分比

const toPercent = (point) => {
    let percent = Number(point * 100).toFixed(2);
    percent += '%';
    return percent;
}

百分比转小数

const toPoint = (percent) => {
    let point = percent.replace('%', '');
    point = point / 100 - 0;
    return point;
}

soonfy

npm

install local packages

npm i -D <package>

update local packages

npm update

uninstall local packages

npm uni -D <package>

install global packages

npm i -g <package>

update global packages

// find outdated packages
npm outdated -g --depth=0
// update package
npm update -g <package>
// update all packages
npm update -g

soonfy

html 插入百度地图

调用百度地图

  1. 打开“百度地图生成器”的网址:http://api.map.baidu.com/lbsapi/creatmap/index.html

  2. 查找位置设置地图添加标注获取代码

  3. 把代码保存成 html 文件

  4. 通过 iframe 引入地图

<iframe src="map.html" width="600" height="300" frameborder="0" scrolling="no"></iframe>

参考文章

html 插入地图的方法

soonfy

javascript 设计模式系列(一)单例模式

单例模式

保证一个类仅有一个实例,并提供一个全局访问;
实例:登录浮框
一个词概括单例模式:标志

  • 标准的单例模式
  // define
  let Singleton = function (name) {
    this.name = name;
    this.instance = null;
  };
  Singleton.prototype.log = function () {
    console.log(this.name);
  };
  Singleton.getInstance = function (name) {
    if (!this.instance) {
      this.instance = new Singleton(name);
    }
    return this.instance;
  };
  // use
  console.log('标准的单例模式');
  let a = Singleton.getInstance('a');
  let b = Singleton.getInstance('b');
  console.log(a.name);  // a
  a.log();  // a
  console.log(b.name);  // a
  b.log();  // a
  console.log(a === b);  // true
  • 通过闭包保存标志
  // define
  let Singleton = function (name) {
    this.name = name;
  }
  Singleton.prototype.log = function () {
    console.log(this.name);
  };
  Singleton.getInstance = (function () {
    let instance = null;
    return function (name) {
      if (!instance) {
        instance = new Singleton(name);
      }
      return instance;
    }
  })();
  // use
  console.log('通过闭包保存标志');
  let a = Singleton.getInstance('a');
  let b = Singleton.getInstance('b');
  console.log(a.name);  // a
  a.log();  // a
  console.log(b.name);  // a
  b.log();  // a
  console.log(a === b);  // true
  • 透明的单例模式
  // define
  let CreateSingleton = (function () {
    let instance = null;
    let CreateSingleton = function (name) {
      if (instance) {
        return instance;
      }
      this.name = name;
      return instance = this;
    };
    CreateSingleton.prototype.log = function () {
      console.log(this.name);
    }
    return CreateSingleton;
  })();
  // use
  console.log('透明的单例模式');
  let a = new CreateSingleton('a');
  let b = new CreateSingleton('b');
  console.log(a.name);  // a
  a.log();  // a
  console.log(b.name);  // a
  b.log();  // a
  console.log(a === b);  // true
  • 使用代理实现单例模式
  // define
  let CreateSingleton = function(name){
    this.name = name;
  };
  CreateSingleton.prototype.log = function () {
    console.log(this.name);
  }
  let ProxySingleton = (function(){
    let instance = null;
    return function(name){
      if(!instance){
        instance = new CreateSingleton(name);
      }
      return instance;
    }
  })()
  // use
  console.log('使用代理实现单例模式');
  let a = new ProxySingleton('a');
  let b = new ProxySingleton('b');
  console.log(a.name);  // a
  a.log();  // a
  console.log(b.name);  // a
  b.log();  // a
  console.log(a === b);  // a
  • 通用惰性单例实现登录浮框
// define
  let createLogin = function () {
    let div = document.createElement('div');
    div.innerHTML = '登录框';
    div.style.display = 'none';
    document.body.appendChild(div);
    let div = {};
    return div;
  }
  let getSingleton = function (fn) {
    let instance = null;
    return function () {
      return instance || (instance = fn.apply(this, arguments));
    }
  }
  let createSingleLogin = getSingleton(createLogin);
  // use
  console.log('通用惰性单例实现登录浮框');
  document.getElementById('login').onclick = function(){
    let loginDiv = createSingleLogin();
    loginDiv.style.display = 'block';
  }

参考文章

《JavaScript 设计模式与开发实践》

soonfy
2018-04-03

eslint 配置

安装

npm install -g eslint

初始化

eslint --init

定制配置

.eslintrc.js

module.exports = {
    "root": true,
    "extends": "standard",
    "env": {
        "node": true,
        "browser": true,
        "mocha": true
    },
    "rules": {
        "no-console": "off",
        "indent": [ "error", 2 ],
        "quotes": [ "error", "single" ],
        // allow async-await
        'generator-star-spacing': 0,
        // allow debugger during development
        'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0
    }
};

.eslintignore

/node_modules/

.editorconfig

root = true

[*]
charset = utf-8
indent_style = space
indent_size = 2
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true

启动脚本

配置 package.json

"script": {
  "lint": "eslint . --ext .js"
}

pre-commit 钩子

安装 pre-commit 包
配置 package.json

"pre-commit": [
  "lint"
]

错误

  1. 终端直接执行 eslint . --ext .js 提示错误 can not find module eslint-configura-standard

eslint 是全局安装,eslint-configura-standard 是本地安装。不能全局启动 eslint 调用,需要写到 package.json 文件中,通过 npm run lint 调用

soonfy

node jwt

流程

  1. 网站
    注册 - 登录 - 后台生成token - 前端request(authorization="Bearer "+token)

  2. 小程序
    授权 - 后台生成token - 前端request(authorization="Bearer "+token)

插件

jsonwebtoken

  1. express
    express-jwt

  2. koa
    koa-jwt

soonfy

vue 引入图片

html

<img src="../assets/logo.png">

data + v-bind

<img :src="imgSrc">
data(){
  return {
    imgSrc: '../assets/logo.png'
  }
}

data + v-bind + import

<img :src="imgSrc">
import imgSrc from '@/assets/logo.png'
data(){
  return {
    imgSrc: imgSrc
  }
}

data + v-bind + static

图片放在 static 文件夹

<img :src="imgSrc">
data(){
  return {
    imgSrc: '../../static/logo.png'
  }
}

参考文章

Vue.js中的图片引用路径

soonfy

git

生成 ssh key

ssh-keygen

clone private git

error
no matching host key type found. Their offer: ssh-dss

fix
在 .ssh 目录下 vim config 新建文件添加如下两行
Host git.XX.XX.com
HostKeyAlgorithms +ssh-dss
第一行的 XX.XX 根据项目中 ssh 链接从 @ 后到 : 前的域名

soonfy

http 首部字段

http 首部字段

通用首部字段 请求报文和响应报文都使用的首部;
请求首部字段 客户端向服务器发送请求报文使用的首部;
响应首部字段 服务器向客户端发送响应报文使用的首部;
实体首部字段 请求报文和响应报文的实体部分使用的首部;

通用首部字段

  1. Cache-Control 控制缓存的行为
  2. Connection 逐跳首部,连接的管理
  3. Date 创建报文的日期时间
  4. Pragma 报文指令
  5. Trailer 报文末端的首部一览
  6. Upgrade 升级为其它协议
  7. Via 代理服务器的相关信息
  8. Warning 错误通知

请求首部字段

  1. Accept 用户代理可处理的媒体类型
  2. Accept-Charset 优先的字符集
  3. Accept-Encoding 优先的内容编码
  4. Accept-Language 优先的语言(自然语言)
  5. Authorization Web认证信息
  6. Expect 期待服务器的待定行为
  7. From 用户的电子邮箱地址
  8. Host 请求资源所在的服务器
  9. If-Match 比较实体标记(ETag)
  10. If-Modified-Since 比较资源的更新时间
  11. If-None-Match 比较实体标记(与 If-Match 相反)
  12. if-Range 资源未更新时发送实体 Byte 的范围请求
  13. If-Unmodified-Since 比较资源的更新时间(与 If-Modified-Since 相反)
  14. Max-Forwards 最大传输逐跳数
  15. Proxy-Authorization 代理服务器要求客户端的认证信息
  16. Range 实体的字节范围请求
  17. Referer 对请求中 uri 的原始获取方
  18. TE 传输编码的优先级
  19. User-Agent http 客户端程序的信息

响应首部字段

  1. Accept-Ranges 是否接受字节范围请求
  2. Age 推算资源创建经过的时间
  3. ETag 资源的匹配信息
  4. Location 客户端重定向指定的 uri
  5. Proxy-Authenticate 代理服务器对客户端的认证信息
  6. Retry-After 对再次发起请求的时机要求
  7. Server http 服务器的安装信息
  8. Vary 代理服务器缓存的管理信息
  9. WWW-Authenticate 服务器对客户端的认证信息

实体首部字段

  1. Allow 资源可支持的 http 方法
  2. Content-Encoding 实体主体使用的编码方式
  3. Content-Language 实体主体使用的语言
  4. Content-Length 实体主体的字节大小
  5. Content-Location 替代对应资源的 uri
  6. Content-MD5 实体主体的报文摘要
  7. Content-Range 实体主体的位置信息
  8. Content-Type 实体主体的媒体类型
  9. Expires 实体主体的过期时间
  10. Last-Modified 资源的最后修改时间

参考文章

《图解http》

soonfy
2018-04-01

express 中间件

express middleware

express

const express = require('express');
const app = express();
app.get('/', (req, res) => {
  res.send(data);
})
app.listen(3000);

morgan

const express = require('express');
const logger = require('morgan');
const app = express();
app.use(logger('dev'));
app.listen(3000);

body-parser

const express = require('express');
const bodyParser = require('body-parser');
const app = express();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
  extended: false
}))
app.post('/admin', (req, res) => {
  res.send(req.body);
})
app.listen(3000);

serve-static

const express = require('express');
const serve = require('serve-static');
const app = express();
app.use(serve('public'));
app.listen(3000);

cookie-parser

const express = require('express');
const cookieParser = require('cookie-parser');
const app = express();
app.use(cookieParser('soonfy'));
app.get('/', (req, res) => {
  res.send(req.cookies);
})
app.listen(3000);

soonfy
2018-03-31

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.