0%

安装vmware

安装centos7,配置共享目录

安装vmtools

1
2
3
4
5
6
7
8
yum -y install perl gcc gcc-c++ make cmake kernel kernel-headers kernel-devel net-tools  # 安装依赖包
mkdir -p /mnt/cdrom # 创建CD-ROM挂载目录
mount -t auto /dev/cdrom /mnt/cdrom # 将CD-ROM挂载到指定目录
cp /mnt/cdrom/VMwareTools-10.0.5-3228253.tar.gz /home # 拷贝安装包到home目录
umount /dev/cdrom # 解除挂载
tar -zxvf VMwareTools-10.0.5-3228253.tar.gz # 解压安装包
cd vmware-tools-distrib/ # 进入安装包目录
./vmware-install.pl # 安装

配置目录映射,实现虚拟机与客户机文件同步

1
2
3
4
5
6
yum install open-vm-tools open-vm-tools-desktop                                          # 安装工具
vmware-hgfsclient # 查看共享的目录
vmhgfs-fuse .host:/ /mnt/hgfs # 挂载目录
vi /etc/fstab # 开机自动挂载
.host:/ /mnt/hgfs fuse.vmhgfs-fuse allow_other,defaults 0 0
mount -a # 测试配置是否正确

安装宝塔面板

1
yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh

新建shell脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash
DB_USER="root" # mysql用户名
DB_PASS="root" # mysql密码
DB_HOST="127.0.0.1" # mysql主机地址
DB_PORT="3306" # mysql端口
DB_NAME="test" # mysql需要备份的数据库名称
BACK_DIR="/home/backup/mysql" # 备份文件存放的位置
BACK_FILE=${DB_NAME}_`date +%Y%m%d`.sql # 备份文件名称
BIN_DIR="/usr/bin"
# 备份
${BIN_DIR}/mysqldump --opt -u${DB_USER} -p${DB_PASS} -h${DB_HOST} -P${DB_PORT} ${DB_NAME} > ${BACK_DIR}/${BACK_FILE}
# 删除30天前的备份
OLD_BACK_FILE=${BACK_DIR}/${DB_NAME}_`date -d "30 days ago" +%Y%m%d`.sql
rm -rf ${OLD_FILE}

shell脚本可执行权限

1
chmod +x mysql.sh

crontab定时任务执行脚本

1
00 01 * * * /home/backup/mysql.sh     # 每天凌晨1点备份

crontab基本格式

1
2
3
4
5
*    *    *    *    *    command
分 时 日 月 周 命令

05 * * * * command # 每5分钟执行
30 00 * * * command # 每天凌晨0点30分钟执行

镜像常用命令

1
2
3
4
5
docker images                                                                         # 查看所有镜像
docker rmi $(docker images -q) # 删除所有镜像
docker rmi <image id> # 删除指定镜像
docker pull centos:7 # 拉取镜像
docker tag <image id> 仓库:标签 # 镜像重命名

容器常用命令

1
2
3
4
5
6
7
8
9
docker ps                                                                             # 查看正在运行的容器
docker ps -a # 查看所有容器
docker kill $(docker ps -a -q) # 杀死所有正在运行的容器
docker rm $(docker ps -a -q) # 删除所有已经停止的容器
docker run -it -p 22:22 -p 80:80 -p 443:443 -p 3306:3306 <image id> /bin/bash # 创建容器
docker stop <container id> # 停止容器
docker start <container id> # 启动容器
docker exec -it <container id> /bin/bash # 进入容器
docker commit <container id> <image name> # 将容器打包成镜像

自适应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
25
26
27
28
29
30
31
32
33
!function (window) {
/* 设计图文档宽度 */
var docWidth = 750;

var doc = window.document,
docEl = doc.documentElement,
resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize';

var recalc = (function refreshRem() {
var clientWidth = docEl.getBoundingClientRect().width;

/* 8.55:小于320px不再缩小,11.2:大于420px不再放大 */
docEl.style.fontSize = Math.max(Math.min(20 * (clientWidth / docWidth), 11.2), 8.55) * 5 + 'px';

return refreshRem;
})();

/* 添加倍屏标识,安卓为1 */
docEl.setAttribute('data-dpr', window.navigator.appVersion.match(/iphone/gi) ? window.devicePixelRatio : 1);

if (/iP(hone|od|ad)/.test(window.navigator.userAgent)) {
/* 添加IOS标识 */
doc.documentElement.classList.add('ios');
/* IOS8以上给html添加hairline样式,以便特殊处理 */
if (parseInt(window.navigator.appVersion.match(/OS (\d+)_(\d+)_?(\d+)?/)[1], 10) >= 8)
doc.documentElement.classList.add('hairline');
}

if (!doc.addEventListener) return;
window.addEventListener(resizeEvt, recalc, false);
doc.addEventListener('DOMContentLoaded', recalc, false);

}(window);

  • 需求是这样的,iframe在一个div中,并且iframe高度与div一样,所以设置了iframe高度是100%,结果div出现了滚动条,在排除了padding、margin的因素外,还是有滚动条。按理说,只有iframe有滚动条,父div不应该有滚动条。

  • 一般搜索后,找到了原因,简单来说,iframe=inline frame它是一个内联元素,默认是跟baseline对齐的,iframe后边有个看不见、摸不着的行内空白节点,空白节点占据着高度,iframe与空白节点的基线对齐,导致了div被撑开,从而出现滚动条。

  • 找到原因了,解决方案也就简单了。

    • 第一种,设置iframe的vertical-align:top,设置父div的font-size:0,从而影响空白节点的line-height是0,从而不占据高度
    • 第二种,改变iframe的内联元素性质,改为块级元素,display:block

检查更新

1
composer selfupdate

切换中国镜像

1
2
3
composer config -g repo.packagist composer https://packagist.phpcomposer.com    # phpcomposer镜像         已停用
composer config -g repo.packagist composer https://packagist.laravel-china.org # Laravel China镜像 已停用
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer # 阿里云Composer全量镜像 建议使用

解除镜像并恢复到packagist官方源

1
composer config -g --unset repos.packagist

仅更新单个库

1
composer update foo/bar

全局安装

1
composer global require foo/bar

全局更新

1
composer global update

composer autoload 自动加载性能优化

1
composer dump-autoload -o

解决方案一

  • 查看当前数据库的sql_mode属性值
1
select @@sql_mode
  • 去掉ONLY_FULL_GROUP_BY, 重新赋值
1
set sql_mode = (select replace(@@sql_mode, 'ONLY_FULL_GROUP_BY', ''));
  • 但是这种方式设置的只是当前会话中的sql_model, 服务器重启后会失效。设置永久生效模式需修改mysql配置文件

解决方案二

  • MySQL有any_value(field)函数, 他主要的作用就是抑制ONLY_FULL_GROUP_BY值被拒绝
  • 官方有介绍, 地址:https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_any-value
  • 我们可以把select语句中查询的属性(除聚合函数所需的参数外), 全部放入any_value(field)函数中
  • 这样sql语句不管是在ONLY_FULL_GROUP_BY模式关闭状态还是在开启模式都可以正常执行, 不被mysql拒绝
  • 例如:
1
2
3
4
5
6
7
SELECT
`name`,
any_value ( `sex` )
FROM
`test_table`
GROUP BY
`name`

新建.babelrc

1
2
3
4
5
6
{
"presets": [
"es2015"
],
"plugins": []
}

新建package.json

1
2
3
4
5
6
7
8
9
{
"devDependencies": {
"babel-cli": "^6.26.0",
"babel-preset-es2015": "^6.24.1"
},
"scripts": {
"build": "babel src -d dist"
}
}

将src目录的js代码转换成es2015

1
cnpm run build

$.ajax异步请求demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$(function() {
$.ajax({
url: "http://localhost:3000/api/login",
method: "POST",
dataType: "json",
data: {
"user": "admin",
"password": "123456",
},
headers: {
"token": "123456789",
"sign": "11",
},
beforeSend: function (jqXHR, settings) {}
})
.done(function (data, textStatus, jqXHR) {})
.fail(function (jqXHR, textStatus, errorThrown) {})
.always(function (data, textStatus, jqXHR) {
// data|jqXHR, textStatus, jqXHR|errorThrown
});
});

axios异步请求

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
// 添加请求拦截器
axios.interceptors.request.use(function (config) {
config.headers["platform"] = 1;
config.headers["version"] = "1.0.0";
config.headers["token"] = "";
return config;
}, function (error) {
return Promise.reject(error);
});

// 添加响应拦截器
axios.interceptors.response.use(function (response) {
return response.data;
}, function (error) {
return Promise.reject(error);
});

// post请求
axios.post("http://localhost:3000/api/login", {
user: "admin",
password: "123456",
})
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});

安装依赖项

1
2
cnpm install express
cnpm install http-proxy-middleware

新建proxy.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
var express = require('express');
var app = express();
var proxy = require('http-proxy-middleware');

var port = '3000';
var proxyTarget = 'https://www.xxx.com';

app.use('/', function (request, response) {
response.send('Hello World');
});

app.use('/api/*', proxy({
target: proxyTarget,
changeOrigin: true,
ws: true,
pathRewrite: {
'^/api': ''
}
}));

app.listen(port, function () {
console.log("server is listen at http://localhost:%s", port);
});

启动服务

1
node proxy.js