Snow的个人博客


  • 首页

  • 归档

桌面全屏js

发表于 2018-12-29

iviewAdmin问题记录

发表于 2018-12-23

与面包屑相关的错误问题

  1. 报错 ... eachof undefined: 这是localstorage里报错的面包屑数组与你的路由不匹配造成的,也就是这个localstrage里保存的数据是之前留下来的。

视频在浏览器中无法播放原因

发表于 2018-12-21

MP4 格式的视频在浏览器中无法播放原因

MP4格式的视频有多种编码格式,其中有一种编码是 H.264 ,这种编码可在浏览器中播放
这是使用格式工厂转换的方法

vuecli3配置less全局变量

发表于 2018-12-18

安装预处理 less、less-loader

npm install -D less-loader less

安装插件style-resources-loader

vue add style-resources-loader
建议使用使用上面这个命令来安装,会省掉很多麻烦。
如果在 vue ui 里安装的话,要先插件安装vue-cli-plugin-style-resources-loader,再去依赖安装style-resources-loader

我这是使用默认配置安装的新项目,只添加了 less、less-loader、style-resources-loader
安装完成之后:
package.json

1
2
3
4
5
6
7
8
9
10
11
12
13
"devDependencies": {
"@vue/cli-plugin-babel": "^3.2.0",
"@vue/cli-plugin-eslint": "^3.2.0",
"@vue/cli-service": "^3.2.0",
"babel-eslint": "^10.0.1",
"eslint": "^5.8.0",
"eslint-plugin-vue": "^5.0.0-0",
"less": "^3.9.0",
"less-loader": "^4.1.0",
"style-resources-loader": "^1.2.1",
"vue-cli-plugin-style-resources-loader": "^0.1.3",
"vue-template-compiler": "^2.5.17"
},

vue.config.js

1
2
3
4
5
6
7
8
9
10
11
const path = require('path') // 自己添加的
module.exports = {
pluginOptions: {
'style-resources-loader': {
preProcessor: 'less',
patterns: [
path.resolve(__dirname, './src/index.less') // 自己添加的, less全局变量所在文件
]
}
}
}

macos10.13.6终端使用代理

发表于 2018-12-18

配置这个代理断断续续弄了好几次,跨度有5、6个月之久,所以好多都记不清了!

列出所有用到的网站

  • 通过ProxyChains让Iterm终端上网
  • socks5代理 https://lvii.gitbooks.io/outman/content/ss.mac.html
  • 安装proxychains-ng,使用socks5https://blog.csdn.net/yjk13703623757/article/details/79055460
  • 添加启动别名https://blog.csdn.net/houzhiwen_yy/article/details/81774657
  • 参考

首先是使用 shadowsocks

安装 shadowsocks 软件以及如何使用网上教程一大堆,我这里就不赘述了,只放上几张关键性图片
shadowsocks
shadowsocks
如何查看shadowsocks代理使用的默认端口:
点击‘编辑自动模式的PAC’,然后会打开文件夹,该文件夹里有一个gfwlist.js文件,文件的开头就是设置的默认端口
shadowsocks

查看 shadowsocks 客户端启用的端口:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ lsof -iTCP -sTCP:LISTEN -n -P
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
rapportd 432 phoenix 3u IPv4 0x3f111c47f0d3082b 0t0 TCP *:49173 (LISTEN)
rapportd 432 phoenix 4u IPv6 0x3f111c47f0d2ac63 0t0 TCP *:49173 (LISTEN)
privoxy 479 phoenix 3u IPv4 0x3f111c47f8e0718b 0t0 TCP *:8118 (LISTEN)
privoxy 479 phoenix 4u IPv4 0x3f111c47f8e07aeb 0t0 TCP 127.0.0.1:8118 (LISTEN)
mysqld 711 phoenix 23u IPv4 0x3f111c47f9ada18b 0t0 TCP 127.0.0.1:3306 (LISTEN)
com.docke 771 phoenix 19u IPv4 0x3f111c47f9079aeb 0t0 TCP *:10103 (LISTEN)
com.docke 771 phoenix 20u IPv6 0x3f111c47f0d2c363 0t0 TCP [::1]:10103 (LISTEN)
Adobe\x20 793 phoenix 13u IPv4 0x3f111c47f9e3caeb 0t0 TCP 127.0.0.1:15292 (LISTEN)
Adobe\x20 793 phoenix 37u IPv4 0x3f111c47f6f2318b 0t0 TCP 127.0.0.1:15393 (LISTEN)
node 903 phoenix 15u IPv4 0x3f111c47f85cfecb 0t0 TCP 127.0.0.1:49379 (LISTEN)
node 903 phoenix 21u IPv4 0x3f111c47f7e4982b 0t0 TCP 127.0.0.1:49388 (LISTEN)
Shadowsoc 10604 phoenix 4u IPv4 0x3f111c47fd29aaeb 0t0 TCP *:1080 (LISTEN) ## 我的socks5 端口
Shadowsoc 10604 phoenix 7u IPv4 0x3f111c47fa93f18b 0t0 TCP *:8090 (LISTEN)
node 13139 phoenix 24u IPv4 0x3f111c47f6f2444b 0t0 TCP *:8080 (LISTEN)

到这里你的浏览器应该已经能够访问 https://www.google.com 了,但是终端里还不能使用代理
检查方法是:在终端执行这个命令 $ curl cip.cc,得到这样子的结果:

1
2
3
4
5
6
7
8
9
IP	: 122.233.242.233
地址 : 中国 浙江 杭州
运营商 : 电信

数据二 : 浙江省杭州市 | 电信

数据三 : 中国浙江省杭州市 | 电信

URL : http://www.cip.cc/122.233.242.233

安装 proxychains-ng 来实现终端使用代理

$ brew install proxychains-ng
安装好后我的配置文件在 /usr/local/etc/proxychains.conf
需要再配置文件里配置如下项目:

1
2
3
4
5
6
7
8
9
strict_chain
proxy_dns
remote_dns_subnet 224
tcp_read_time_out 15000
tcp_connect_time_out 8000
localnet 127.0.0.0/255.0.0.0

[ProxyList]
socks5 127.0.0.1 1080 # 这是上面查看到的 socks5 端口

启动与关闭终端代理

启动代理:
export all_proxy=socks5://127.0.0.1:1080
关闭代理:
unset all_proxy

启动代理后再执行命令$ curl cip.cc,得到这样子的结果:

1
2
3
4
5
6
7
8
9
IP	: 45.124.137.39
地址 : 日本 长野县 长野市
运营商 : tsukaeru.net

数据二 : 日本

数据三 : 日本长野县

URL : http://www.cip.cc/45.124.137.39

这说明终端使用代理成功了

为启动/关闭代理命令添加别名

启动/关闭代理的命令太长,每次都要敲这么长的命令太麻烦了,可以配置别名来方便使用
在.bash_profile文件里添加两行代码: 编辑文件vi ~/.bash_profile

1
2
3
# proxy list 
alias proxy=’export all_proxy=socks5://127.0.0.1:1080’ #1080为HTTP监听端口号
alias unproxy=’unset all_proxy’

使用配置文件生效

1
source ~/.bash_profile

js实现浏览器全屏与退出

发表于 2018-12-17

兼容 Firefox、Chrome、IE

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
function fullScreen () {
var el = document.documentElement;
var rfs = el.requestFullScreen || el.webkitRequestFullScreen ||
el.mozRequestFullScreen || el.msRequestFullScreen;
if (typeof rfs != "undefined" && rfs) {
rfs.call(el);
} else if (typeof window.ActiveXObject != "undefined") {
//for IE,这里其实就是模拟了按下键盘的F11,使浏览器全屏
var wscript = new ActiveXObject("WScript.Shell");
if (wscript != null) {
wscript.SendKeys("{F11}");
}
}
}

function exitFullScreen () {
var el = document;
var cfs = el.cancelFullScreen || el.webkitCancelFullScreen ||
el.mozCancelFullScreen || el.exitFullScreen;
if (typeof cfs != "undefined" && cfs) {
cfs.call(el);
} else if (typeof window.ActiveXObject != "undefined") {
//for IE,这里和fullScreen相同,模拟按下F11键退出全屏
var wscript = new ActiveXObject("WScript.Shell");
if (wscript != null) {
wscript.SendKeys("{F11}");
}
}
}

$('#fullScreen').click(function () {
fullScreen();
$(this).hide(0);
$('#exitFullScreen').show(0);
})
$('#exitFullScreen').click(function () {
exitFullScreen();
$(this).hide(0);
$('#fullScreen').show(0);
})

uni-app小白入门

发表于 2018-12-10

先撸一遍uni-app 官网。这个网站也不错 uni-app从入门到精通
下面是个人笔记,大部分是从官网上摘抄的重点

目录结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
┌─components            uni-app组件目录
│ └─comp-a.vue 可复用的a组件
├─hybrid 存放本地网页的目录,详见
├─platforms 存放各平台专用页面的目录,详见
├─pages 业务页面文件存放的目录
│ ├─index
│ │ └─index.vue index页面
│ └─list
│ └─list.vue list页面
├─static 存放应用引用静态资源(如图片、视频等)的地方,注意:静态资源只能存放于此
├─main.js Vue初始化入口文件
├─App.vue 应用配置,用来配置App全局样式以及监听 应用生命周期
├─manifest.json 配置应用名称、appid、logo、版本等打包信息,详见
└─pages.json 配置页面路由、导航条、选项卡等页面类信息,详见

Tips:

  • static 目录下的 js 文件不会被编译,如果里面有 es6 的代码,不经过转换直接运行,在手机设备上会报错。
  • css、less/scss 等资源同样不要放在 static 目录下,建议这些公用的资源放在 common 目录下。

什么是‘nvue’,以及如何使用

在官网中的在uni-app中使用Weex可看到相关内容
Weex的文件的后缀名为 .nvue (native vue), uni-app中 .nvue 只会编译到 5+App 端。

如何使用 vuex

相关文档可看官网如何使用vuex

uni-app 内置了 vuex 我们不用安装vuex,直接使用即可

  1. 首先在项目根目录下新建一个目录store
  2. 在store文件夹下新建文件index.js

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    //store/index.js
    import Vue from 'vue'
    import Vuex from 'vuex'
    Vue.use(Vuex)
    const store = new Vuex.Store({
    state: {...},
    mutations: {...},
    actions: {...}
    })

    export default store
  3. 在项目根目录下的main.js里引用

    1
    2
    3
    4
    5
    6
    7
    //main.js
    ...
    import store from './store'
    Vue.prototype.$store = store //这行是必须的
    const app = new Vue({
    store,...
    })
  4. 使用

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    ...

    //test.vue 使用时:
    import {mapState,mapMutations} from 'vuex'

    ...
    computed: {
    ...mapState(['userName'])
    },

    methods:{
    ...mapMutations(['changeLogo']),
    }

定制主题

配置一个主题文件,我这里使用 less 来写样式,这样可以用变量来设置颜色,然后在每个页面都引入这个文件来使用其中定义的颜色(不会导致这个主题文件在应用中出现多次),但是这样没法让用户切换主题

使用插槽slot

#####在uni-app中使用插槽与在vue中几乎一样,但是在使用具名插槽时有一点区别:请看例子
定义一个组件m-button, 与vue没有区别:

1
2
3
4
5
6
7
8
9
10
11
<template>
<view class="btn-wrap" :class="{'default': defaultAcitve}">
<slot> <!-- 默认插槽 -->
<view>
{{text}}
</view>
</slot>
<slot name="icon"></slot> <!-- 具名插槽 icon -->
<slot name="text"></slot> <!-- 具名插槽 text -->
</view>
</template>

使用具名插槽有区别

1
2
3
4
5
6
7
8
9
<m-button>
<view class="mine-btn">
<image class="image" src="../../static/images/contact.png" mode=""></image> 来自默认插槽
</view>
<template slot="icon">
<image class="image" src="../../static/images/contact.png" mode=""></image>
</template>
<text slot="text">来自text插槽</text>
</m-button>

注意事项:

  1. 在uni-app中使用默认插槽与在vue中使用默认插槽没有区别。在使用具名插槽时,添加slot属性的那个元素是不会被插入插槽的。也就是说上面的 ‘来自text插槽’ 。
  2. 在循环中使用组件时,插槽里的变量无法生效,但不含变量的内容可以正常使用
  3. 使用默认插槽时,被插入内容不要用 <template></template> 标签包裹

坑

  1. 对 text 标签的行高只能比默认的高,没法设置的比默认值跟小。解决办法是在text的父标签(如view)中设置行高
  2. 组件的样式会被编译到引用它的那个页面中去,所以组件的样式可能会污染页面。解决办法是在组件最外层元素上添加一个唯一的class名(也可是id),然后其他类名就都是在这个类名之下了,也就构成了为选择器,就不会选中组件以外的元素了。
  3. 暂不支持在组件上使用 Class 与 Style 来设置样式
  4. data()定义变量需要注意,变量不能重名,包括对象的健值。如下,articles.title 得到的结果是 ‘首页’。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    title: '首页',
    articles: [
    {
    title: '法律文章标题',
    content: '法律文章内容,河南省高院审理案件时,故意忽略关键证据,导致被告被误判。经我方评查后,上诉成功。'
    },
    {
    title: '法律文章标题',
    content: '法律文章内容,河南省高院审理案件时,故意忽略关键证据,导致被告被误判。经我方评查后,上诉成功。'
    }
    }

flex布局学习

发表于 2018-12-06

介绍

   布局的传统解决方案:基于盒状模型,依赖 display 属性 + position属性 + float属性。它对于那些特殊布局非常不方便,比如,垂直居中就不容易实现。
   2009年,W3C 提出了一种新的方案—-Flex 布局,可以简便、完整、响应式地实现各种页面布局。目前,它已经得到了所有浏览器的支持,这意味着,现在就能很安全地使用这项功能。
   Flex 是 Flexible Box 的缩写,意为”弹性布局”,用来为盒状模型提供最大的灵活性。

使用flex布局

  任何一个容器都可以使用display属性指定为 Flex 布局。设为 Flex 布局以后,子元素的float、clear和vertical-align属性将失效。

1
2
3
.box{
display: flex; // 块级元素
}

行内元素使用Flex布局为:

1
2
3
.box{
display: inline-flex; // 行内元素
}

注:阮一峰大神在Flex布局教程上说“Webkit 内核的浏览器,必须加上-webkit前缀。”,写这篇博客时测试不加前缀也是可以的

基本概念

采用 Flex 布局的元素,称为 Flex 容器(flex container),简称”容器”。它的所有子元素自动成为容器成员,称为 Flex 项目(flex item),简称”项目”。

容器的属性

以下6个属性设置在容器上。

1
2
3
4
5
6
flex-direction // 决定主轴的方向(即项目的排列方向)。
flex-wrap // 如果一条轴线排不下,如何换行。
flex-flow // 上面两个的简写
justify-content // 项目在主轴上的对齐方式。
align-items // 项目在交叉轴上如何对齐。
align-content // 多根轴线的对齐方式。

flex-direction属性决定项目(子元素)的排列方向。

1
2
3
4
row(默认值):排列方向为水平方向,起点在左端。
row-reverse:排列方向为水平方向,起点在右端,第一个元素在最右端(即有倒叙效果)。
column:排列方向为垂直方向,起点在上沿。
column-reverse:排列方向为垂直方向,起点在下沿,第一个元素在最下沿(即有倒叙效果)。

使用例子

1
2
3
4
.box {
display: flex;
flex-direction: row-reverse;
}

flex-wrap属性决定项目(子元素)如果在一条轴线排不下,如何换行。

1
2
3
nowrap(默认):不换行(可能会溢出)
wrap:换行,第一行在上方 (默认在换行后容器会自动增高)
wrap-reverse:换行,第一行在下方
1
2
3
4
5
.box {
display: flex;
flex-direction: row;
flex-wrap:wrap-reverse;
}

flex-flow属性是flex-direction属性和flex-wrap属性的简写形式,默认值为row nowrap。

1
2
3
4
.box {
display: flex;
flex-flow: row wrap-reverse;
}

justify-content属性定义了项目在主轴上的对齐方式。

1
2
3
4
5
flex-start(默认值):左对齐,项目之间没有间隔
flex-end:右对齐,项目之间没有间隔
center: 居中,项目之间没有间隔
space-between:两端对齐,项目之间的间隔都相等。
space-around:每个项目两侧的间隔相等。所以,项目之间的间隔比项目与边框的间隔大一倍。

注意:如果flex-direction为column,容器得设置高度justify-content才能看到效果

align-items属性定义项目在交叉轴上如何对齐。

项目(子元素)高度不一样时如何对齐

1
2
3
4
5
flex-start:交叉轴的起点对齐,(row时,顶部对齐)。
flex-end:交叉轴的终点对齐,(row时,底部对齐)。
center:交叉轴的中点对齐,(row时,居中对齐,也在容器的中间)。
baseline: 项目的第一行文字的基线对齐。
stretch(默认值):如果项目未设置高度或设为auto,将占满整个容器的高度。

1
2
3
4
5
6
.box {
display: flex;
flex-flow: row wrap;
justify-content: space-between;
align-items: baseline;
}

align-content属性定义了多根轴线的对齐方式。如果项目只有一根轴线,该属性不起作用。

有多行项目(子元素)时,行的排列方式。

1
2
3
4
5
6
flex-start:与交叉轴的起点对齐。
flex-end:与交叉轴的终点对齐。
center:与交叉轴的中点对齐。
space-between:与交叉轴两端对齐,轴线之间的间隔平均分布。
space-around:每根轴线两侧的间隔都相等。所以,轴线之间的间隔比轴线与边框的间隔大一倍。
stretch(默认值):轴线占满整个交叉轴。

项目(子元素)的属性

以下6个属性设置在项目上。

1
2
3
4
5
6
order
flex-grow
flex-shrink
flex-basis
flex
align-self

order属性定义项目的排列顺序。数值越小,排列越靠前,默认为0。

1
2
3
.border.blue {
order: 1;
}

flex-grow属性定义项目的放大比例,默认为0,即如果存在剩余空间,也不放大。

没有空间时就不再放大。该空间是在没有放大时就决定的

1
2
3
.item {
flex-grow: <number>; /* default 0 */
}

如果所有项目的flex-grow属性都为1,则它们将等分剩余空间(如果有的话)。如果一个项目的flex-grow属性为2,其他项目都为1,则前者占据的剩余空间将比其他项多一倍。

flex-shrink属性定义了项目的缩小比例,默认为1,即如果空间不足,该项目将缩小。

1
2
3
.item {
flex-shrink: <number>; /* default 1 */
}

注意:缩小只能针对width属性,如果设置padding过大则可能没法缩小了

flex-basis属性定义了在分配多余空间之前,项目占据的主轴空间(main size)。浏览器根据这个属性,计算主轴是否有多余空间。它的默认值为auto,即项目的本来大小。

flex属性是flex-grow, flex-shrink 和 flex-basis的简写,默认值为0 1 auto。后两个属性可选。

1
2
3
.item {
flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]
}

该属性有两个快捷值:auto (1 1 auto) 和 none (0 0 auto)。
建议优先使用这个属性,而不是单独写三个分离的属性,因为浏览器会推算相关值。

align-self属性允许单个项目有与其他项目不一样的对齐方式,可覆盖align-items属性。默认值为auto,表示继承父元素的align-items属性,如果没有父元素,则等同于stretch。

1
2
3
.item {
align-self: auto | flex-start | flex-end | center | baseline | stretch;
}

该属性可能取6个值,除了auto,其他都与align-items属性完全一致。

div凹陷效果

发表于 2018-12-06

使用box-shadow

box-shadow

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
.box-shadow {
float:left;
position:relative;
box-shadow:0 10px 5px rgba(0,0,0,.3);
}
.box-shadow:after {
position:absolute;
bottom:-29px;
left:0;
overflow:hidden;
background:#fff;
width:100%;
height:15px;
content:'';
border-radius:50%;
box-shadow:0 -10px 5px #fff;
}

<div class="box-shadow">CSS3将开启“少图”web新时代</div>

使用border

border-inset

1
2
3
4
5
6
7
8
9
10
.border-inset {
width: 300px;
margin: 0 auto;

border-width: 3px;
border: inset;
box-shadow: inset 0 -1px 0 rgba( 255, 255, 250, 0.6), inset 0 -2px 0 rgba( 0, 0, 0, 0.1);
}

<div class="border-inset">CSS3将开启“少图”web新时代</div>

vue添加时间格式化过滤器

发表于 2018-11-15

来自:https://blog.csdn.net/genius_yym/article/details/77530602

函数封装

我这里将下面的函数保存到src/libs/filters/formatDate.js文件里

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// 这个函数 网上  随处可见,我也是应用了别人的。
export function formatDate(date, fmt) {
if (/(y+)/.test(fmt)) {
fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length));
}
let o = {
'M+': date.getMonth() + 1,
'd+': date.getDate(),
'h+': date.getHours(),
'm+': date.getMinutes(),
's+': date.getSeconds()
};
for (let k in o) {
if (new RegExp(`(${k})`).test(fmt)) {
let str = o[k] + '';
fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? str : padLeftZero(str));
}
}
return fmt;
};

function padLeftZero(str) {
return ('00' + str).substr(str.length);
}

在组件里通过过滤器使用

  1. 引用:

    1
    import { formatDate } from '@/libs/filters/formatDate.js'
  2. 添加过滤器

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    export default {
    name: 'userinfo',
    components: {
    avatar
    },
    // 过滤器
    filters: {
    formatDate(time) {
    var date = new Date(time);
    return formatDate(date, 'yyyy-MM-dd');
    }
    }
    }
  3. 使用

    1
    2
    3
    ...
    <p class="userinfo time">{{$store.state.user.userCreatedAt | formatDate}}</p>
    ...
  4. 在js代码里当成普通函数使用

    1
    let nowDate = formatDate(new Date(), 'yyyy-MM-dd hh:mm')
12…4
Snow Liu

Snow Liu

36 日志
9 标签
© 2018 Snow Liu
由 Hexo 强力驱动
|
主题 — NexT.Pisces v5.1.4