websocket 断开重连
https://blog.svenhetin.com/chu-tan-he-shi-xian-websocketxin-tiao-zhong-lian/
lodash 。Lodash 通过降低 array、number、objects、string 等等的使用难度从而让 JavaScript 变得更简单。
moment 。 时间格式处理工具。
jsonwebtoken 。用于生产及交验 token
https://github.com/auth0/node-jsonwebtoken
https://blog.csdn.net/qq_37398213/article/details/81606824
https://cloud.tencent.com/developer/article/1431793
url 。 url 模块提供了一些实用函数,用于URL处理与解析。
https://www.cnblogs.com/fengch/p/8610196.html
yeast 。根据时间戳生成唯一字符串 (做聊天的时候,生成房间 id 可以使用)
https://github.com/unshiftio/yeast
[https://blog.csdn.net/themagickeyjianan/article/details/78588257](https://blog.csdn.net/themagickeyjianan/article/details/78588257)
https://www.javascriptcn.com/read-53551.html
ioredis 。 ioredis 是一个用于 Node.js/io.js 的 Redis 客户端,强健、功能强大且全面。
https://www.oschina.net/p/ioredis
https://blog.csdn.net/qq_33589252/article/details/85535890
ws 。 ws websocket 库, node.js 的 websocket 的实现。
https://www.npmjs.com/package/ws
https://blog.csdn.net/LiMubai_CN/article/details/81844156
os 。 os 模块提供了与操作系统相关的实用方法和属性。
http://nodejs.cn/api/os.html#os_os
http://nodejs.cn/api/os/os_networkinterfaces.html
mysql 。 mysql 连接池
https://www.jianshu.com/p/2239a4df6ed5
bluebird 。bluebird 实现更强大的 Promise
https://www.ibm.com/developerworks/cn/web/wa-lo-use-bluebird-implements-power-promise/index.html
虽然 homestead 用的很习惯,还是想尝试新东西 docker 。也不是新东西了,出来有些年了。既然用 laravel ,那么就用 laradock
熟悉 virtualBox + vagrant + homestead 的朋友,对于 laradock 上手也会很快。当初,装 homestead 需要安装 virtualBox(也可以是vm等) 和 vagrant,然后是使用 homestead 来实现环境的配置安装。对于 docker 可以这样理解,docker 就是 virtualBox + vagrant,或是 vagrant。 我们只需要安装一个 docker 就可以了。然后下载 laradock 即可以开始安装了。
安装使用,一步到位,初观全局
laradock: https://github.com/laradock/laradock
这里以 win 为例子:
# 先选定一个磁盘位置,用来存放 laradock 并且相邻文件夹做为 www 目录(当然也可以其他位置)
cd /e/
mkdir service
cd service
git clone https://github.com/laradock/laradock.git
cd laradock
# 准备配置文件
cp env-example .env
# 修改配置文件
vim .env
# 修改 APP_CODE_PATH_HOST = '../www'
# 创建并启动
docker-compose up -d nginx php-fpm mysql redis workspace
# 重启
docker-compose restart
# 进入服务器
winpty docker-compose exec workspace bash
# 退出
exec
上边的过程,可能有些长久。先创建 laravel 项目。
# 默认安装最新版本。当前版本 6.8
composer create-project laravel/laravel --prefer-dist docker.cn
再配置 nginx,创建默认 laravel 项目
cd service/laradock/nginx/sites
# 复制一份配置出来。命名一定要以 .conf 作为后缀
cp app.conf.example docker.cn.conf
# 修改 docker.cn.conf
vim docker.cn.conf
# 通常会修改 server 下的 server_name 和 root。将 server_name 修改为你想要指定的域名。比如 docker.cn。 root修改为映射的文件目录。比如 /var/www/study/docker.cn/public 。保存退出。
# 每个对象都是一个容器
# 比如 修改了 nginx 只需要单独启动 nginx 即可
docker-compose up -d nginx
然后再执行 winpty docker-compose exec workspace bash 。如果发现还是访问不了。可以 docker-compose restart 再执行 winpty docker-compose exec workspace bash
配置 host
# 修改 host 文件,再末尾加入
vim hosts
GG
127.0.0.1 docker.cn
###
https://xueyuanjun.com/post/9608
做聊天项目的时候,通常会用到关键词过滤。对于一些敏感信息,可能还会进行内容加密。这里从两个不同的功能点,总结下过程。也是在别人的基础上,跑了一遍而已。照着做,可以一步到位。
环境
1. php
2. js
3. laravel
https://github.com/FireLustre/php-dfa-sensitive
composer require lustre/php-dfa-sensitive
# 项目中
use DfaFilter\SensitiveHelper;
# 添加词库,使用文件
$path = storage_path('sensitive/words.txt');
$handle = SensitiveHelper::init()->setTreeByFile($wordFilePath);
# 添加词库,单个添加
$data = [
'哎呦我的天',
'太阳',
'太阳块融化我的脸'
];
$handle = SensitiveHelper::init()->setTree($data);
# 替换,检测
$islegal = $handle->islegal($content);
$content = '啥啥啥,哎呦我的天呀,太阳快融化我的脸';
$content = $handle->replace($content, '*', true);
上边这些,github
上都有,照着做就可以了。
https://www.zkii.net/tech/php/1115.html
这里数据加密使用 aes。数据加密解密的对象是字符串。无论哪 js 还是 php,都可以互相转换。不过这里可能存在一种文体,js 加密的 js 可以解密,但 php 不能解密。反之亦然。出现这种情况,往往是加密解密模式没有配对上。
** js 加密解密 **
参考: https://blog.csdn.net/yingbaoyu/article/details/95761177
如果不是 node 环境,可以下载 https://pan.baidu.com/s/1Mvg8vhlD56wvS4b6yjUoaA 提取码:57gd
例子:
const aseKey = 'YjKp7COQ9QZN2EgMJdiI8tzBsJarvQAr';
const aseIv = 'zmtuC5UyMfK3r1QYXKa1lYmNNy8F5jiP';
//将秘钥转换成Utf8字节数组
const key = CryptoJS.enc.Utf8.parse(aseKey);
const iv = CryptoJS.enc.Utf8.parse(aseIv);
let data = {
name: 'vini',
gender: 1
}
data = JSON.stringify(data);
let encoded = CryptoJS.AES.encrypt(data, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
}).toString();
console.log(encoded);
let uncoded = CryptoJS.AES.decrypt(encoded, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
}).toString(CryptoJS.enc.Utf8);
console.log(uncoded);
# 这个时候, data 应该等于 uncoded
key 的长度决定了 CBC 模式的不同。
# php 加密解密
<?php
namespace App\Helper;
class Aes
{
static public function encrypt($data)
{
$method = 'AES-256-CBC';
$key = 'YjKp7COQ9QZN2EgMJdiI8tzBsJarvQAr';
$iv = 'zmtuC5UyMfK3r1QY';
return openssl_encrypt($data, $method, $key, 0, $iv);
}
static public function decrypt($data)
{
$method = 'AES-256-CBC';
$key = 'YjKp7COQ9QZN2EgMJdiI8tzBsJarvQAr';
$iv = 'zmtuC5UyMfK3r1QY';
return openssl_decrypt($data, $method, $key, 0, $iv);
}
}
这里为了方便,把 method key iv 都写死了。项目里边不会这样做。比如,可以定义一个类:
<?php
namespace App\Utils;
class Aes
{
protected $aesSecret = 'YjKp7COQ9QZN2EgMJdiI8tzBsJarvQAr', $aesIv = '00000000000000000000000000000000';
/**
* 进制转换
* @param string $hex
* @return string
*/
protected function aesHexIv($hex = '')
{
$string = '';
$hex = $hex != '' ? $hex : $this->aesIv;
for ($i = 0; $i < strlen($hex) - 1; $i += 2) {
$string .= chr(hexdec($hex[$i] . $hex[$i + 1]));
}
return $string;
}
/**
* AES加密
* @param string $content
* @param string $key
* @param string $hex
* @return string
*/
public function aesEncrypt($content = '', $key = '', $hex = '')
{
$hash = hash('sha256', $key ?: $this->aesSecret, true);
$enCrypt = openssl_encrypt($content, 'AES-256-CBC', $hash, PKCS7_TEXT, $this->aesHexIv($hex));
return base64_encode($enCrypt);
}
/**
* AES解密
* @param string $content
* @param string $key
* @param string $hex
* @return string
*/
public function aesDecrypt($content = '', $key = '', $hex = '')
{
$content = base64_decode(str_replace(' ', '+', $content));
$hash = hash('sha256', $key ?: $this->aesSecret, true);
return openssl_decrypt($content, 'AES-256-CBC', $hash, PKCS7_TEXT, $this->aesHexIv($hex));
}
}
https://www.php.net/manual/zh/openssl.pkcs7.flags.php
https://blog.csdn.net/GlatChen/article/details/79978875
https://suijimimashengcheng.51240.com/
进一步了解 aes 加密解密
在多端配合的情况下,不是 key
和 iv
都对,就可以解密出加密的数据的。 秘钥位数,加密模式,填充方式也得一一对应上。
aes 参数
npm config set registry https://registry.npm.taobao.org
npm config get registry
– 或npm info express
安装 ant design pro
npm create umi
# 选择 ant design pro
# 选择 typescript或javascript
有些时候,特别是虚拟机,跑着跑着,可能就不准了。校准时间就有必要了。
这里使用 ntpdate
来纠正数据
# centos
yum install ntpdate
# ubuntu
apt-get install ntpdate
# 开始纠正
ntpdate -u ntp.api.bz
如果发现时间和上海时间相差 8 个小时,时区问题请解决,再执行上边的命令。
vim /etc/profile
G
# 调到末尾,加入下边的命令
export TZ='CST-8'
# 使得环境变量生效,再执行上边的命令纠正时区
source /etc/profile
如果经常纠正可以加入定时任务
https://www.cnblogs.com/luchuangao/p/7795293.html
https://blog.csdn.net/wblinux/article/details/81981328