0%

安装redis

1
2
3
4
5
6
<!--
Linux version 3.10.0-957.el7.x86_64
CentOS Linux release 7.6.1810
-->
yum install -y redis

修改配置

1
2
3
4
5
6
7
8
<!-- 打开/etc/redis.conf -->
<!-- 注释# bind 127.0.0.1 否侧不能远程访问 -->
# bind 127.0.0.1
<!-- 关闭保护模式可以远程访问否侧需要配置上面的ip -->
protected-mode no
port 9000
requirepass 123456

启动服务与查看状态

1
2
systemctl start redis
systemctl status redis

连接

1
2
3
4
5
6
7
8
9
10
11
<!-- 使用window进行测试,需要安卓redis -->
redis-cli -h [ip] -p [port]
<!-- 回车之后输入密码 -->
auth [pass]
<!-- 会返回ok然后就可以测试了 -->
set token 123
<!-- 123 -->
get token
del token
<!-- nil -->
get token

在上centos 7 安装 docker 使用镜像创建一个nginx容器 官方网站

安装docker启动查看版本

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
# 以前下载过需要先卸载
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine

# 设置仓库 (我是国外的服务器,国内速度等原因建议用阿里云镜像加速)
yum install -y yum-utils

yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo


# 下载docker 引擎
yum install docker-ce docker-ce-cli containerd.io

# 启动docker
systemctl start docker
# 查看版本
docker -v

# [root@cc2 ~]# docker -v
# Docker version 20.10.12, build e91ed57
阅读全文 »

京东云oss是一个对象存储服务可以用来存放前端用到的音视频和图片等静态资源

注册京东云账号实名认证开启oss服务

创建空间

1
2
3
进到控制台->空间管理->创建空间
空间名字是全局的重复的话会提示
权限给公有读私有写
阅读全文 »

打包go程序

我这边是windows 所以需要交叉编译

1
2
3
4
5
6
SET CGO_ENABLED=0
SET GOOS=linux
SET GOARCH=amd64
go build -o main main.go

//执行完毕后你得到一个二进制文件 main

安装mysql和nginx

建议使用宝塔一键操作

1
2
3
4
5
//我的版本号
[root@cc2 api]# nginx -v
nginx version: nginx/1.20.1
[root@cc2 api]# mysql -V
mysql Ver 14.14 Distrib 5.7.34, for Linux (x86_64) using EditLine wrapper
阅读全文 »

前端切片上传文件,后端接受合并文件。这里后端使用的是Koa2.

安装koa2

1
2
npm i koa2 -g
koa2 demo && cd demo && npm i

koa-body

1
2
3
4
5
6
7
8
9
10
11
npm i -S koa-body  
/*
提供了文件上传功能,处理post请求数据
所以需要在app.js中 把 bodyparser 注释了(并且二者不能共存,会导致post请求超时)
`
// app.use(bodyparser({
// enableTypes:['json', 'form', 'text']
// }))
`
*/

1
2
3
4
5
6
7
8
//使用这个中间件
app.use(koaBody({
multipart:true, //文件上传功能
formidable:{
uploadDir:path.join(__dirname,"static"),
keepExtensions:true
}
}))
阅读全文 »

hello cc

数组去重

1
2
console.log([...new Set([1, 1, 2, 2, "a", "a", "b"])]);
//[1, 2, 'a', 'b']

类型转换

1
2
3
4
5
6
7
8
let num = +"10"; // 10
let num1 = +"a"; //NaN
let bool = !!""; //false
let bool1 = !!0; //false
let bool2 = !!-1; //true
let bool3 = !![]; //true
//获取时间戳
let time = +new Date(); //Date.now()

使用===代替==

1
2
3
4
5
6
7
(([] == (0)[1]) == //true
(1)[1]) === //true
1; //false
//es6 Object.is()
NaN === NaN; //false
Object.is(1, [1]); //false
Object.is(NaN, NaN); //true

简单的随机排序

1
2
let arr = [1, 2, 3, 4, 5];
let newarr = arr.sort(() => Math.random() - 0.5); //[2, 1, 5, 3, 4]

使用 Promise 封装一个延迟器

1
2
3
4
5
6
7
8
9
10
11
function sleep(time) {
return new Promise((resolve, reject) => {
setTimeout(resolve, time);
});
}

(async () => {
console.time();
await sleep(2000);
console.timeEnd(); //这里两s后执行 //default: 2004.6728515625 ms
})();

获取文件名、文件后缀

1
2
3
4
5
6
7
8
function getFileExtName(file) {
return file.substring(file.lastIndexOf(".") + 1);
}
function getFileName(file) {
let sIndex = file.lastIndexOf("/") + 1 || 0;
let eIndex = file.lastIndexOf(".");
return file.substring(sIndex, eIndex);
}

日期格式化

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
function timeStrToDate(val, fmt = "yyyy-MM-dd") {
//时间戳转日期
let fillzero = function (n) {
return n < 10 ? "0" + n : n;
};
let isValidDate = (d) => {
return d instanceof Date && !isNaN(d.getTime());
};
let date = null;
if (isValidDate(new Date(val))) {
date = new Date(val);
} else {
let n = Number(val);
if (n == NaN) return val;
date = new Date(n);
}
let res = {
"y+": date.getFullYear(),
"M+": fillzero(date.getMonth() + 1),
"d+": fillzero(date.getDate()),
"h+": fillzero(date.getHours()),
"m+": fillzero(date.getMinutes()),
"s+": fillzero(date.getSeconds()),
};
for (let k in res) {
let reg = new RegExp(k);
if (reg.test(fmt)) {
fmt = fmt.replace(reg, res[k]);
}
}
return fmt;
}

文件转 base64

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function getBase64(file) {
return new Promise(function (resolve, reject) {
let reader = new FileReader();
let res = "";
reader.readAsDataURL(file);
reader.onload = function () {
res = reader.result;
};
reader.onerror = function (error) {
reject(error);
};
reader.onloadend = function () {
resolve(res);
};
});
}

base64 转文件

1
2
3
4
5
6
function base642file(base64, fileName) {
const b = Utils.dataURLtoBlob(base64);
b.lastModifiedDate = new Date(); // 文件最后的修改日期
b.name = fileName; // 文件名
return new File([b], fileName, { type: b.type, lastModified: Date.now() });
}

基于 qrcode 生成带 logo 的二维码

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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
function generateQRCode(url, config = {}, icon, fit = "contain") {
//fit 暂未实现 用于图片的展现方式
let imgExt = ["png", "jpg", "jpeg", "bmp", "gif"];
if (imgExt.includes(Utils.getFileExtName(icon))) {
let t = Date.now();
icon = icon + `?v=${t}`;
}
let _config = {
errorCorrectionLevel: "H",
width: 300,
height: 200,
color: {
dark: "#000000",
light: "#FFFFFF",
},
...config,
};
if (_config.widh !== _config.height) {
let max = Math.max(_config.width, _config.height);
_config.width = _config.height = max;
}
let canvas = await QRCode.toCanvas(url, _config);
let ctx = canvas.getContext("2d");
let scale = 0.3;
let img = new Image();
img.setAttribute("crossOrigin", "Anonymous");
img.src = icon;
return new Promise((resolve) => {
try {
img.onload = () => {
ctx.fillStyle = "white";
let rectW = _config.width * scale;
ctx.rect(
(_config.width - rectW) / 2,
(_config.height - rectW) / 2,
_config.width * scale,
_config.height * scale
);
ctx.fill();
let max = Math.max(img.width, img.height);
const scaleFit = rectW / max;
let w = img.width * scaleFit;
let h = img.height * scaleFit;
ctx.drawImage(
img,
(_config.width - w) / 2,
(_config.height - h) / 2,
w,
h
);
resolve(canvas.toDataURL());
};
} catch (error) {
resolve(canvas.toDataURL());
}
});
}

数组分组

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
41
42
43
44
function groupBy(list, key) {
return list.reduce((rv, current) => {
(rv[current[key]] = rv[current[key]] || []).push(current);
return rv;
}, {});
}

groupBy(
[
{
name: "Tom",
gender: "1",
},
{
name: "cc",
gender: "1",
},
{
name: "lisa",
gender: "0",
},
],
"gender"
);
/*return
{
0: [
{
name: "lisa",
gender: "0",
},
],
1: [
{
name: "Tom",
gender: "1",
},
{
name: "cc",
gender: "1",
},
],
}
*/

对axios进行简单的封装,这里使用的框架是react

安装react脚手架

1
npm install -g create-react-app

使用react脚手架创建项目

1
create-react-app react-demo

安装需要的包

1
2
npm i axios  //http库
npm install http-proxy-middleware -D //proxy代理 接口跨域问题

接下来

配置代理

新建配置文件/src/setupProxy.js

1
2
3
4
5
6
7
8
9
10
11
12
const { createProxyMiddleware } = require('http-proxy-middleware');

module.exports = function (app) {
app.use(createProxyMiddleware('/api', {
target : 'http://127.0.0.1:3000',
changeOrigin : true,
ws: true,
pathRewrite : {
'^/api' : ''
},
}));
};
阅读全文 »

一般情况可以使用node,这里在网页上使用FileReader读取用户计算机上的文件,xlsx解析其内容。

开始

引入CDN

这里使用的是BootCDN。 使用xlsx.core.min.js即可。

1
<script src="https://cdn.bootcdn.net/ajax/libs/xlsx/0.17.0/xlsx.core.min.js"></script>

相关代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
let inp = document.createElement('input')
inp.setAttribute('type','file')
document.body.appendChild(inp)
inp.oninput = (e)=> {
let files = e.target.files
let f = files[0];
let reader = new FileReader();
reader.onload = function(e) {
var data = new Uint8Array(e.target.result);
var workbook = XLSX.read(data, {type: 'array'});
console.log(workbook,'workbook')
};
reader.readAsArrayBuffer(f);
}

一直想抽空做一个blog记录一下自己的学习历程。