express+mongo
- index
- home
- blogs
- chatroom
- tools
- about
blog using issue
<!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;
}
内容 决定什么是最重要的
布局 优先设计更小的宽度,基础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>
<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>
代码内<使用<代替,>使用>代替,&使用\amp;代替
内联样式显示代码用code
<code>内联代码</code>
<pre>
<header>
<span>文本</span>
</header>
</pre>
<span><var>y</var>=<var>x</var>+<var>z</var></span>
<p><kbd>ctrl + p</kbd>打印</p>
<p><samp>computer output...</samp></p>
<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>
垂直表单(默认)
水平表单
内联表单
向<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>
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"禁用按钮
class="img-rounded"圆角图片,原理border-radius: 6px
class="img-circle"圆形图片,原理border-radius: 50%
class="thumbnail"内边距和灰色边框
class="img-responsive"响应式图片,原理max-width: 100%,height: auto
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"下拉功能
<button>
<span class="glphicon glphicon-*"></span>
</button>
<button style="color:red">
<span class="glphicon glphicon-*"></span>
</button>
<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"分割下拉菜单
class="btn-group"控制多个btn,基本样式按钮组
class="btn-toolbar"控制btn-group,复杂按钮组件
class="btn-group-lg","btn-group-sm","btn-group-xs"控制按钮组中按钮大小
class="btn-group-vertical"垂直排列按钮组
<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"
<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"改变样式
<nav class="nav nav-default" role="navigation">
<div class="container-fluid">
<div class="nav-header">
<a class="nav-brand"></a>
</div>
</div>
</nav>
<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
显示分页,设置ul标签的class="pagination"
分页活动状态,设置li标签的class="active"当前活动分页,class="disabled"禁用分页
分页大小,设置ul标签的class="pagination-lg","pagination-sm"
居中分页,设置ul标签的class="pager"
左右对齐分页,设置ul标签的class="previous","next"
默认标签,设置span标签的class="label"
修改标签样式class="label-default","label-primary","label-success","label-info","label-warning","label-danger"
缩略图展示,增加内边距,鼠标悬停动画显示边框,在图片img标签外嵌套a标签,并设置class=""thumbnail
包含内容的缩略图展示,在a标签外面嵌套div标签,并设置class="thumbnail",h,p标签添加内容
默认警告框,设置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">×</button>
默认进度条,添加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-*"
包含图片,视频,音频
单个多媒体,父元素设置class="media",多媒体元素设置class="media-object",class="pull-left","pull-right控制对齐",文本元素设置class="media-body",文本中标题设置class="media-heading"
多媒体列表,父元素设置class="media-list"
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"
把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"
内容内嵌的容器,设置div标签的class="well"
修改Well大小,class="well-lg","well-sm"
<!DOCTYPE html>文档类型
<html lang="zh-CN">语言属性
<head>
<meta http-equiv="X-UA-Compatibal" content="IE=Edge">IE兼容模式
<meta charset="UTF-8">字符编码
</head>
</html>
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
selector{
-webkit-box-shadow: 0 1px 2px rgba(0,0,0.15);
box-shadow: 0 1px 2px rgba(0,0,0.15);
}
class名称只能包含小写字母和破折号(-);
避免随意的简写;
class名称尽量短;
命名有意义,不要用表现形式;(.red => .import)
基于最近的父class作为前缀;
通用元素设置class;
经常出现的组件,避免使用属性选择器;
选择器尽量短,选择器数目不超过3;
以组件为单位组织;
一致的注释;
一致的空白分割成块;
以组件为单位,而不是页面拆分成多个CSS文件;
soonfy
flex 的核心概念是 容器 和 轴。
容器包括外层的父容器(容器)和内层的子容器(项目),轴包括主轴和交叉轴。
display: 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 ;
参考文章
soonfy
2018-03-29
保留当前页面,跳转到应用内的某个页面,使用wx.navigateBack可以返回到原页面
wx.navigateTo({
url: '/path?name=name&value=value',
success(){},
fail(){},
complete(){}
})
关闭当前页面,跳转到应用内的某个页面
wx.redirectTo({
url: '/path?name=name&value=value',
success(){},
fail(){},
complete(){}
})
关闭所有页面,打开到应用内的某个页面
wx.reLaunch({
url: '/path?name=name&value=value',
success(){},
fail(){},
complete(){}
})
跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面
wx.switchTab({
url: '/path',
success(){},
fail(){},
complete(){}
})
关闭当前页面,返回上一页面或多级页面。可通过 getCurrentPages() 获取当前的页面栈,决定需要返回几层
wx.navigateBack({
delta: 1
})
返回页面栈
onLoad: function(option){
console.log(option.query)
}
soonfy
<span v-text="text"></span>
等价于
<span>{{ text }}</span>
<span v-html="html"></span>
<span v-show="a === b">a === b</span>
<span v-if="a === b">a === b</span>
<span v-else-if="a === c">a ===c</span>
<span v-else>else</span>
v-else
前一个兄弟元素必须有 v-if
或者 v-else-if
v-else-if
前一个兄弟元素必须有 v-if
或者 v-else-if
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>
@
修饰符
event.stopPropagation
event.preventDefault
{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){}
}
:
修饰符
<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
}
}
修饰符
// 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">
<span v-pre><span>
<span v-cloak>{{ text }}<span>
[v-cloak] {
display: none;
}
<span v-once>{{ text }}</span>
参考文章
soonfy
2018-04-04
# 全局安装 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 来进行编译
soonfy
soonfy
2018-04-03
css 居中还有很多,以后慢慢补充
.inline-item {
text-align: center;
}
.block-item {
margin: 0 auto;
}
.container {
text-align: center;
}
.block-item {
display: inline-block;
}
.container {
display: flex;
justify-content: center;
}
.container {
height: 100px;
line-height: 100px;
}
.container {
display: table;
}
.item {
display: table-cell;
vertical-align: middle;
}
.container {
display: flex;
align-items: center;
}
or
.container {
display: flex;
flex-direction: column;
justify-content: center;
}
.container {
position: relative;
}
.item {
position: absolute;
top: 50%;
height: 120px;
margin-top: -60px;
}
.container {
position: relative;
}
.item {
position: absolute;
top: 50%;
transform: translateY(-50%);
}
.container {
position: relative;
}
.item {
width: 400px;
height: 300px;
padding: 20px;
position: absolute;
top: 50%;
left: 50%;
margin: -160px 0 0 -210px;
}
.container {
position: relative;
}
.item {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
.container {
display: flex;
justify-content: center;
align-items: center;
}
参考文章
soonfy
2018-04-03
<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';
<ul>
<li>Fantastic
<li>Great
</ul>
.example {
color: blue;
}
<img src="google.png" alt="Google">
color: #e5e5e5;
不用关闭空标签
<!DOCTYPE html>
<br>
<!DOCTYPE html>
<meta charset="utf-8">
<title>Test</title>
<article>This is only a test.</article>
<a href="recommendations/">All recommendations</a>
<img src="spreadsheet.png" alt="Spreadsheet screenshot.">
分开 html,css,js
不使用实体引用
The currency symbol for the Euro is “€”.
<!DOCTYPE html>
<title>Saving money, saving bytes</title>
<p>Qed.
<link rel="stylesheet" href="https://www.google.com/css/maia.css">
<script src="https://www.google.com/js/gweb/analytics/autotrack.js"></script>
<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>
<md-progress-circular
md-mode="indeterminate"
class="md-accent"
ng-show="ctrl.loading"
md-diameter="35">
</md-progress-circular>
<a class="maia-button maia-button-secondary">Sign in</a>
验证 css
使用有意义的或者通用的 id 或者类名
#gallery {}
#login {}
.video {}
.aux {}
.alt {}
#nav {}
.author {}
#example {}
.error {}
font: 100%/1.6 palatino, georgia, serif;
padding: 0 1em 2em;
margin: 0
margin: .5em
color: #fff
.mani-note {}
name-id: {}
background: fuchsia;
border: 1px solid;
-moz-border-radius: 4px;
-webkit-border-radius: 4px;
border-radius: 4px;
color: black;
text-align: center;
text-indent: 2em;
@media screen, projection {
html {
background: #fff;
color: #444;
}
}
.test {
display: block;
height: 100px;
}
h3 {
font-weight: bold;
}
#video {
margin-top: 1em;
}
h1,
h2,
h3 {
font-weight: normal;
line-height: 1.2;
}
html {
background: #fff;
}
body {
margin: auto;
width: 50%;
}
@import url(https://www.google.com/css/maia.css);
html {
font-family: 'open sans', arial, sans-serif;
}
/* header */
soonfy
选择器 | 例子 | 例子描述 | 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 |
选择器 | 例子 | 例子描述 | 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 |
选择器 | 例子 | 例子描述 | 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 |
选择器 | 例子 | 例子描述 | 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 |
选择器 | 例子 | 例子描述 | css |
---|---|---|---|
element~element | div~p | 选择 div 之后的 p 元素 | 3 |
选择器 | 例子 | 例子描述 | 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 |
选择器 | 例子 | 例子描述 | 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 |
参考文章
soonfy
2018-03-30
ex:
ex:
ex:
内置角色
数据库用户角色: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'
}]
})
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\>
}]
})
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)
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)
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
});
});
}
mongoexport -h host --port port -u sf -p sf -d db -c collection -q '{name: "sf"}' -f name,age --csv -o ~/user.csv
soonfy
model.update({}, {$unset: {attr: 1}}, {multi: true});
soonfy
fork 开源项目
clone 个人项目到本地
git remote -v
查看项目远程连接
git remote add upstream <开源项目地址>
git checkout -b <新分支>
git status/stage/commit/push
提交 PR
New pull request
Create pull request
git学习--GitHub上如何进行PR(Pull Request)操作
github----向开源框架提交pr的过程
soonfy
微信小程序
账号在
设置
,开发设置
中复制AppID(小程序ID)
和AppSecret(小程序密钥)
其中有一步需要
AppID
完成后npm run dev
启动
使用 微信开发工具
判断是否已经授权。getSetting()
未授权,按钮授权并获取用户信息。<button open-type="getUserInfo">授权</button>
已授权直接获取用户信息。getUserInfo()
获取 openid。login()
/sns/jscode2session 获取 openid
WXBizDataCrypt 解密 unionid
BUG反馈
小程序•小故事(4)——获取用户信息
小程序•小故事(6)——微信登录能力优化
小程序登录 - wx.login
soonfy
informational 信息性状态码,接收的请求正在处理;
success 成功状态码,请求正常处理完毕;
200 ok
表示从客户端发来的请求已经被服务器成功处理;
204 not content
表示服务器接收的请求已经成功处理,但返回的报文不包含实体的主体部分;
206 partial content
表示客户端进行范围请求,服务器已经成功处理了这部分 get 请求;
redirection 重定向状态码,需要进行附加操作以完成请求;
301 moved permanently
永久性重定向。表示请求的资源已经被分配了新的 uri,以后使用现在所指的 uri;
302 found
临时性重定向。表示请求的资源已经被分配了新的 uri,用户本次请求使用现在所指的 uri;
303 see other
表示请求的资源已经被分配了新的 uri,使用 get 方法定向请求资源;
304 not modified
表示服务器资源没有发生改变,客户端可以使用缓存;
307 temporary redirect
临时重定向。表示请求的资源已经被分配了新的 uri,必须使用相同的方法请求资源;
client error 客户端错误状态码;
400 bad request
表示请求报文中存在语法错误;
401 unauthorized
表示发送的请求需要有通过 http 验证(basic验证,digest验证)的认证信息,如果之前已经发过请求,表示用户验证失败;
403 forbidden
表示对资源的请求已经被服务器拒绝;未获得系统文件的访问授权,访问权限出现问题(未授权的 ip 地址);
404 not found
表示服务器上找不到请求的资源;
server error 服务器错误状态码;
500 internal server error
表示服务器在处理请求的时候发生错误;
503 service unavailable
表示服务器暂时处于超负载或者正在停机维护;
参考文章
《图解HTTP》
soonfy
2018-03-31
text-indent: 24px;
letter-spacing: 1px;
line-height: 20px;
soonfy
import * as koa from 'koa';
const app = new koa();
app.use((ctx) => {
ctx.body = data;
})
app.listen(3000);
import * as koa from 'koa';
import * as logger from 'koa-logger';
const app = new koa();
app.use(logger(() => {
// ...
}))
app.listen(3000);
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);
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);
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);
import * as koa from 'koa';
import * as serve from 'koa-static';
const app = new koa();
app.use(serve('public'));
app.listen(3000);
import * as koa from 'koa';
import * as cors from 'koa-cors';
const app = new koa();
app.use(cors());
app.listen(3000);
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
css2 媒体查询针对媒体类型(显示器,便捷设备,电视机等)设置不同的样式规则;
css3 取代查找媒体类型,根据设置自适应显示;
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
<link rel="stylesheet" media="screen and (max-width: 768px)" href="small.css" />
<style>
@media screen and (max-width: 768px) {
.info {
display: none;
}
}
</style>
@media screen and (min-width: 576px) and (max-width: 768px) { }
@media screen and (min-height: 420px) and (max-height: 570px) { }
@media screen and (min-device-width: 568px) and (max-device-width: 768px) { }
@media screen and (min-device-height: 420px) and (max-height: 570px) { }
@media screen and (min-aspect: 1/1) { }
@media screen and (device-aspect-ratio: 16/9), screen and (device-aspect-ratio: 16/10) { }
@media all and (color) { }
@media all and (min-color: 4) { }
@media all and (color-index) { }
@media all and (min-color-index: 256) { }
@media all and (monochrome) { }
@media all and (min-monochrome: 8) { }
@media print and (min-resolution: 300dpi) { }
@media screen and (min-resolution: 2dppx) { }
@media all and (orientation: portrait) { }
@media tv and (scan: progressive) { }
@media screen and (grid) and (max-width: 15em) { }
参考文章
soonfy
2018-03-30
设置 enablePullDownRefresh = true
定义 onPullDownRefresh()
处理函数
刷新数据后,wx.stopPullDownRefresh
可以停止当前页面的下拉刷新
设置 onReachBottomDistance = 50
定义 onReachBottom()
处理函数
wx.showLoading()
wx.showToast()
wx.hideToast()
wx.hideLoading()
wx.showNavigationBarLoading()
wx.hideNavigationBarLoading()
soonfy
vue-router
import Vue from 'vue'
import Router from 'vue-router'
Vue.use(Router)
const router = new Router({
routes: [
{
path: '/',
name: name,
component: component,
meta: {
title: title
}
}
]
})
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
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
soonfy
brew install <name>
brew uninstall <name>
brew search <name>
brew list
brew update
brew services start mongodb
soonfy
// 默认配置
nginx
// 配置文件
nginx -c <nginx.conf>
// 快速停止
nginx -s stop
// 优雅停止
nginx -s quit
// 测试
nginx -t
// 测试只输出错误信息
nginx -q
nginx -s reload
soonfy
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
brew install zsh zsh-completions
sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.9/install.sh | bash
nvm ls-remote
nvm install
brew install mongodb
brew services start mongodb
brew install redis
redis-server /usr/local/etc/redis.conf
redis-cli shutdown
ln -sfv /usr/local/opt/redis/*.plist ~/Library/LaunchAgents
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.redis.plist
launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.redis.plist
download instantclient-basic-macos.x64-12.2.0.1.0-2.zip
download instantclient-sdk-macos.x64-12.2.0.1.0-2.zip
unzip, merge, rename instantclient
, move to /opt/oracle/
.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
brew install zmq
PHANTOMJS_CDNURL=https://npm.taobao.org/dist/phantomjs npm i
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
color: #007bff;
color: #6c757d;
color: #28a745;
color: #dc3545;
color: #ffc107;
color: #17a2b8;
color: #f8f9fa;
color: #343a40;
color: #fff;
color: #409eff;
color: #67c23a;
color: #e6a23c;
color: #f56c6c;
color: #909399;
color: #303133;
color: #606266;
color: #909399;
color: #c0c4cc;
color: #dcdfe6;
color: #e4e7ed;
color: #ebeef5;
color: #f2f6fc;
color: #2d8cf0;
color: #5cadff;
color: #2b85e4;
color: #2d8cf0;
color: #19be6b;
color: #ff9900;
color: #ed3f14;
color: #1c2438;
color: #495060;
color: #80848f;
color: #bbbec4;
color: #dddee1;
color: #e9eaec;
color: #f8f8f9;
bootstrap colors
element color
iview color
soonfy
修改
config/index.js
文件中host: '0.0.0.0'
重启服务
局域网通过 ip 打开网页
soonfy
const formatter = (number) => Math.round(number * 100) / 100;
const formatter = (number) => number.toFixed(2);
当最后一位小数是 0 时,数字格式没办法保留,只能使用字符串格式。
soonfy
build 之后静态文件的引用路径
<link href=/static/css/app.bc0c5696b5c73205f3cc049cd051b772.css rel=stylesheet>
这样找不到静态文件,打开页面是空白
config/index.js
中 build
的 assetsPublicPath
属性为 './'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
soonfy
优先级就是分配给指定的 css 声明的一个权重,由 匹配的选择器的数值 决定;
多个 css 声明的优先级相同时,应用最后一个声明;
直接定义的 css 声明覆盖从祖先元素继承的属性;
定义声明中元素的接近程度对优先级没有影响;
类型选择器(div),伪元素(::before);
类选择器(.class),属性选择器([type="text"]),伪类(:hover);
id 选择器(#id);
3 > 2 > 1;
通配符(*),关系选择符(+>~),否定伪类(:not())对优先级没有影响;
否定伪类(:not())内部声明的选择器会影响优先级;
color: red !import;
元素内联样式(style="font-size: 12px;")覆盖外部样式表的任何样式;
!import 规则会覆盖其它任何声明;
互相冲突的 !import 规则应用优先级更高的;
参考文章
soonfy
2018-03-30
npm config ls -l
access
unscoped packages default public
scoped packages default restricted
allow-same-version
default false
always-auth
default false
also
[String] default null
audit
default true
auth-type
[legacy | sso | saml | oauth] default legacy
bin-links
default true
browser
[String] OS X default open, Windows default start, Others default xdg-open
ca
[String | Array | null] default
npm ca certificate
cafile
[path] default null
ca certificate file path
cache
[path] Posix default ~/.npm, Windows default %appData%\npm_cache
cache-lock-stale
[Number] default 60000
cache-lock-retries
[Number] default 10
cache-max
[Number] default infinity, deprecated
cache-min
[Number] default 10, deprecated
cert
[String] default null
cidr
[String | Array | null] default null
color
[Boolean | always] default true
depth
[number] default infinity
npm ls, npm cache ls, outdate depth
description
default true
npm search show description
dev
default false
dry-run
default false
if true, only use install, uninstall, update, dedupe, not use dist-tags, publish, owner
editor
[path] Posix default vi, Windows default notepad
engine-strict
default false
if true, only install compatible current node.js version
force
default false
fetch-retries
[Number] default 2
retry times from registry
fetch-retry-factor
[Number] default 10
fetch-retry-mintimeout
[Number] 10000
fetch-retry-maxtimeout
[Number] 60000
git
[String] default git
git-tag-version
default true
npm version command
global
default false
globalconfig
[path] {prefix}/etc/npmrc
global-style
default false
group
[String | Number] default current process GID
heading
[String] npm
npm debug log start
https-proxy
[url] default null
if-present
default false
ignore-prepublish
default false
if true, ignore prepublish script
ignore-scripts
default false
if true, ignore package.json scripts
init-module
[path] default ~/.npm-init.js
init-author-name
[String] default ''
init-author-email
[email] default ''
init-email-url
[url] default ''
init-license
[license] default ISC
init-version
[version] default 1.0.0
json
default false
npm ls --json, npm search --json
key
[String] default null
legacy-bundling
default false
link
default false
local-address
[IP address] undefined
loglevel
[silent | error | warn | notice | http | timing |info | verbose | silly] default notice
logstream
[stream] process.stderr
logs-max
[number] default 10
max log files
long
default false
npm ls, npm search info
maxsockets
[Number] default 50
max connections
message
[String] default %s
metrics-registry
[String] default registry value
node-options
[String] default null
node-version
[semver] default process.version
no-proxy
[String | Array] default null
offline
default false
onload-script
default false
only
default null
dev, development
prod, production
optional
default true
otp
[Number] default null
package-lock
default true
if false, ignore package-lock.json
package-lock-only
default false
if true, only update package-lock.json
parseable
default false
prefer-offline
default false
prefer-online
default false
prefix
[path]
production
default false
progress
default true
proxy
[url] default null
read-only
default false
npm token create
rebuild-bundling
default true
registry
[url] default
https://registry.npmjs.org/
rollback
default true
save
default true
save-bundle
default false
save-prod
default false
save-dev
default false
save-exact
default false
save-optional
default false
save-prefix
[^ | ~] default ^
^ minor, ~ patch
scope
[String] default ''
script-shell
[path] default null
script-prepend-node-path
[Boolean | auto | warn-only] default warn-only
searchexclude
[String] default ''
searchopts
[String] default ''
searchlimit
[Number] default 20
searchstaleness
[Number] default 900
send-metics
default false
shell
[path] Posix default bash, Windows default cmd
shrinkwrap
default true
sign-git-tag
default true
sso-poll-frequency
[Number] default 500
sso-type
[oauth | saml | none] default oauth
strict-ssl
> default true
tag
[String] default latest
tag-version-prefix
[String] default v
timing
default false
tmp
[path] default /tmp
unicode
unix/mac default true, Windows default false
unsafe-perm
root run false, other true
usage
default false
user
[UID] default nobody
userconfig
[path] ~/.npmrc
umask
default 022
user-agent
[String]
version
default false
versions
default false
viewer
Posix default man, Windows default browser
soonfy
/**
*
* 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
<a href="[email protected]">soonfy</a>
<a href="mailto:[email protected]">soonfy</a>
<a href="tel:[email protected]">soonfy</a>
soonfy
.weui-grid {
width: 33.3333333%;
}
覆盖 .weui-grid 的 width 属性
.weui-grid {
width: 50%;
}
soonfy
> 获取数据
> 添加数据
> 修改数据
> 删除数据
> 小写复数名词,_ 或者 - 分隔
get /users/
get /users/666/
get /users/666/follows/
get /users/666/follows/999/
post /users/
post /users/666/follows/
put /users/666/
put /users/666/follows/999/
delete /users/666/
delete /users/666/follows/999/
soonfy
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 i -D <package>
npm update
npm uni -D <package>
npm i -g <package>
// find outdated packages
npm outdated -g --depth=0
// update package
npm update -g <package>
// update all packages
npm update -g
soonfy
soonfy
修改 config/index.js
文件中 autoOpenBrowser
参数为 true
autoOpenBrowser: true,
soonfy
打开“百度地图生成器”的网址:http://api.map.baidu.com/lbsapi/creatmap/index.html
查找位置
,设置地图
,添加标注
,获取代码
把代码保存成 html 文件
通过 iframe 引入地图
<iframe src="map.html" width="600" height="300" frameborder="0" scrolling="no"></iframe>
soonfy
保证一个类仅有一个实例,并提供一个全局访问;
实例:登录浮框
一个词概括单例模式:标志
// 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
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 包
配置 package.json
"pre-commit": [
"lint"
]
eslint . --ext .js
提示错误 can not find module eslint-configura-standard
eslint 是全局安装,eslint-configura-standard 是本地安装。不能全局启动 eslint 调用,需要写到 package.json 文件中,通过
npm run lint
调用
soonfy
网站
注册 - 登录 - 后台生成token - 前端request(authorization="Bearer "+token)
小程序
授权 - 后台生成token - 前端request(authorization="Bearer "+token)
express
express-jwt
koa
koa-jwt
soonfy
<img src="../assets/logo.png">
<img :src="imgSrc">
data(){
return {
imgSrc: '../assets/logo.png'
}
}
<img :src="imgSrc">
import imgSrc from '@/assets/logo.png'
data(){
return {
imgSrc: imgSrc
}
}
图片放在 static 文件夹
<img :src="imgSrc">
data(){
return {
imgSrc: '../../static/logo.png'
}
}
soonfy
ssh-keygen
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》
soonfy
2018-04-01
const express = require('express');
const app = express();
app.get('/', (req, res) => {
res.send(data);
})
app.listen(3000);
const express = require('express');
const logger = require('morgan');
const app = express();
app.use(logger('dev'));
app.listen(3000);
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);
const express = require('express');
const serve = require('serve-static');
const app = express();
app.use(serve('public'));
app.listen(3000);
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
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.