l1n6yun's Blog

记录学习的技能和遇到的问题

0%

PHP 调用 MongoDB 全解析

MongoDB 是一款流行的开源文档型数据库,它以 JSON 风格的文档形式存储数据,具有高性能、高可扩展性和灵活的数据模型等特点。而 PHP 作为一种广泛应用于 Web 开发的脚本语言,与 MongoDB 结合可以为开发者提供强大的数据存储和处理能力。本文将详细介绍如何使用 PHP 调用 MongoDB 进行数据的增删改查等操作。

环境准备

在使用 PHP 调用 MongoDB 之前,需要确保已经安装了 MongoDB 数据库和 PHP 的 MongoDB 扩展。可以使用 Composer 来安装 MongoDB 的 PHP 驱动,在项目根目录下创建一个composer.json文件,内容如下:

json

1
2
3
4
5
{
"require": {
"mongodb/mongodb": "^1.13"
}
}

然后在终端中执行composer install命令来安装依赖。

代码示例与解析

连接 MongoDB

1
2
3
4
5
6
7
8
9
10
11
12
<?php

require 'vendor/autoload.php';

$client = new MongoDB\Client("mongodb://localhost:27017");
//指定数据库
$db = $client->selectDatabase('test');
//指定集合
$collection = $db->selectCollection('users');

// 另一种指定合集的方式
$collection = $client->test->users;

上述代码首先通过require 'vendor/autoload.php';引入 Composer 的自动加载文件,然后使用MongoDB\Client类来连接本地的 MongoDB 服务器,端口为27017。接着指定了要使用的数据库test和集合users

插入数据

插入单条数据

1
2
3
4
5
$collection->insertOne([
'name' => '张三',
'age' => 18,
'sex' => '男'
]);

使用insertOne方法可以向集合中插入一条数据,数据以关联数组的形式传入。

指定 ID 插入数据

1
2
3
4
5
6
$collection->insertOne([
'_id' => new MongoDB\BSON\ObjectID('5e7b0b0b0b0b0b0b0b0b0b0b'),
'name' => '李四',
'age' => 27,
'sex' => '男'
]);

在插入数据时,可以手动指定_id字段,使用MongoDB\BSON\ObjectID类来创建一个 ObjectID 对象。

插入多条数据

1
2
3
4
5
6
7
8
9
10
11
12
$collection->insertMany([
[
'name' => '王五',
'age' => 18,
'sex' => '男'
],
[
'name' => '赵六',
'age' => 18,
'sex' => '男'
]
]);

使用insertMany方法可以一次性插入多条数据,传入一个二维数组,每个子数组代表一条数据。

查询数据

查询单条数据

1
2
3
4
$document = $collection->findOne([
'name' => '张三'
]);
var_dump(json_encode($document, JSON_UNESCAPED_UNICODE));

使用findOne方法可以查询符合条件的第一条数据,返回一个文档对象,使用json_encode方法将其转换为 JSON 字符串并输出。

查询多条数据

1
2
3
4
5
6
$cursor = $collection->find([
'name' => '张三'
]);
foreach ($cursor as $document) {
var_dump(json_encode($document, JSON_UNESCAPED_UNICODE));
}

使用find方法可以查询符合条件的多条数据,返回一个游标对象,通过foreach循环遍历游标对象,输出每条数据。

查询指定数量的数据

1
2
3
4
5
6
7
8
$cursor = $collection->find([
'name' => '张三'
], [
'limit' => 2
]);
foreach ($cursor as $document) {
var_dump(json_encode($document, JSON_UNESCAPED_UNICODE));
}

find方法的第二个参数中,可以使用limit选项来指定查询结果的数量。

条件查询

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
// 查询年龄大于18的数据
$cursor = $collection->find([
'age' => [
'$gt' => 18
]
]);
foreach ($cursor as $document) {
var_dump(json_encode($document, JSON_UNESCAPED_UNICODE));
}

// 查询年龄小于18,名称等于张三的数据
$cursor = $collection->find([
'name' => '张三',
'age' => [
'$lt' => 19
]
]);
foreach ($cursor as $document) {
var_dump(json_encode($document, JSON_UNESCAPED_UNICODE));
}

// 查询性别为空的数据
$cursor = $collection->find([
'sex' => [
'$exists' => false
]
]);
foreach ($cursor as $document) {
var_dump(json_encode($document, JSON_UNESCAPED_UNICODE));
}

在查询条件中,可以使用 MongoDB 的查询操作符,如$gt(大于)、$lt(小于)、$exists(是否存在)等。

排序查询

1
2
3
4
5
6
7
8
9
10
$cursor = $collection->find([
'name' => '张三'
], [
'sort' => [
'age' => 1 // 1正序,-1倒叙
]
]);
foreach ($cursor as $document) {
var_dump(json_encode($document, JSON_UNESCAPED_UNICODE));
}

find方法的第二个参数中,可以使用sort选项来对查询结果进行排序,1表示正序,-1表示倒序。

修改数据

查询并修改

1
2
3
4
5
6
7
8
$cursor = $collection->findOneAndUpdate([
'name' => '张三'
], [
'$set' => [
'age' => 27
]
]);
var_dump(json_encode($cursor, JSON_UNESCAPED_UNICODE));

使用findOneAndUpdate方法可以查询符合条件的第一条数据并进行修改,返回修改前的文档对象。

更新数据

1
2
3
4
5
6
7
$collection->updateOne([
'name' => '张三'
], [
'$set' => [
'age' => 27
]
]);

使用updateOne方法可以更新符合条件的第一条数据,使用$set操作符来指定要更新的字段和值。

查询并替换

1
2
3
4
5
6
7
$cursor = $collection->findOneAndReplace([
'name' => '张三'
], [
'name' => '李四',
'age' => 27
]);
var_dump(json_encode($cursor, JSON_UNESCAPED_UNICODE));

使用findOneAndReplace方法可以查询符合条件的第一条数据并进行替换,返回替换前的文档对象。

存在更新不存在插入

1
2
3
4
5
6
7
8
9
$collection->updateOne([
'name' => '张三'
], [
'$set' => [
'age' => 27
]
], [
'upsert' => true
]);

updateOne方法的第三个参数中,使用upsert选项设置为true,可以实现如果符合条件的数据存在则更新,不存在则插入的功能。

更新多条数据

1
2
3
4
5
6
7
$collection->updateMany([
'name' => '张三'
], [
'$set' => [
'age' => 27
]
]);

使用updateMany方法可以更新符合条件的多条数据。

删除数据

删除单条数据

1
2
3
$collection->deleteOne([
'name' => '张三'
]);

使用deleteOne方法可以删除符合条件的第一条数据。

删除多条数据

1
2
3
$collection->deleteMany([
'name' => '张三'
]);

使用deleteMany方法可以删除符合条件的多条数据。

删除集合和数据库

1
2
3
4
5
// 删除集合
$collection->drop();

// 删除数据库
$db->drop();

使用drop方法可以删除集合和数据库。

在 Linux 系统中,Samba 是一个功能强大的服务,它允许 Linux 和 Windows 系统之间进行文件共享。通过 Samba,你可以轻松地在不同操作系统之间共享文件和打印机。本文将详细介绍如何在 Linux 上配置 Samba 服务,以实现文件共享。

安装 Samba

首先,你需要确保你的 Linux 系统上安装了 Samba。在基于 Debian 的系统(如 Ubuntu)上,你可以使用以下命令来安装 Samba:

1
2
sudo apt update
sudo apt install samba

这将安装 Samba 服务及其依赖项。

配置 Samba

安装完成后,你需要配置 Samba 以便它知道你想要共享哪些目录。这涉及到编辑 Samba 的配置文件 smb.conf

  1. 使用文本编辑器打开 smb.conf 文件。这里我们使用 vi 编辑器,但你也可以使用 nano 或其他你喜欢的编辑器:
1
sudo vi /etc/samba/smb.conf
  1. smb.conf 文件中,你可以定义多个共享部分,每个部分对应一个共享目录。以下是两个示例共享部分的配置:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[mnt-rw]
comment = Read-Write Mount Point
browseable = yes
path = /mnt
force user = root
create mask = 0775
directory mask = 0775
guest ok = Yes
read only = No

[onecloud-share]
comment = Read-Only OneCloud Share
browseable = yes
path = /mnt
guest ok = Yes
read only = yes
  • [mnt-rw] 部分定义了一个名为 mnt-rw 的共享,它指向 /mnt 目录。这个共享允许读写访问,并且对所有用户(包括匿名用户)开放。
  • [onecloud-share] 部分定义了另一个共享,它同样指向 /mnt 目录,但这个共享只允许读访问。

配置选项解释

  • browseable = yes:这个选项使得共享在网络浏览器中可见。
  • path = /mnt:指定共享的文件系统路径。
  • force user = root:强制所有连接到此共享的用户以 root 用户身份访问。
  • create mask = 0775directory mask = 0775:设置文件和目录的默认权限。
  • guest ok = Yes:允许匿名访问。
  • read only = No:对于 [mnt-rw] 共享,这个选项允许写入操作;对于 [onecloud-share] 共享,这个选项设置为 yes,表示只读。

启动 Samba 服务

配置完成后,你需要启动 Samba 服务以使更改生效:

1
sudo service smbd start

这个命令将启动 Samba 守护进程,使你的共享目录在网络上可用。

测试共享

在 Windows 系统上,你可以通过网络邻居访问这些共享,或者在文件资源管理器中输入共享的网络路径(例如 \\<Linux-Server-IP>\mnt-rw)来访问。

使用 OpenSSL 工具生成自签名 SSL 证书,为内网环境中的网站安全保驾护航

在内网环境中,使用 OpenSSL 工具进行自签名 SSL 证书的创建,能够为您的网站提供有效的安全保障。

自签证书流程

  1. 创建 ca 私钥。
  2. 基于 ca 私钥生成 ca 根证书。
  3. 构建 ssl 私钥。
  4. 生成 ssl 证书 csr。
  5. 运用 ca 根证书签署以获得 ssl 证书。

操作方法

  1. 创建 ca 私钥(强烈建议设置密码以增强安全性):
1
2
3
4
5
6
7
8
$ openssl genrsa -des3 -out root.key 2048
Generating RSA private key, 2048 bit long modulus
..............................................................+++
................+++
e is 65537 (0x010001)
Enter pass phrase for root.key:

Verifying - Enter pass phrase for root.key:
  1. 生成 ca 证书,自签 20 年有效期,并将此 ca 证书导入需要访问的 PC 的“受信任的根证书颁发机构”中,后续用此 ca 签署的证书均可正常使用:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ openssl req -x509 -new -nodes -key root.key -sha256 -days 7300 -out root.crt
Enter pass phrase for root.key:

You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:CN # 国家
State or Province Name (full name) [Some-State]:SiChuan # 省份
Locality Name (eg, city) []:ChengDu # 城市
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Sichuan Lingyun Technology Co., LTD # 组织
Organizational Unit Name (eg, section) []: # 部门
Common Name (e.g. server FQDN or YOUR name) []:Sichuan Lingyun Technology Co., LTD # 公司
Email Address []: # 邮箱
  1. 完成上述步骤后,创建 ssl 证书私钥:
1
2
3
4
5
$ openssl genrsa -out server.key 2048
Generating RSA private key, 2048 bit long modulus
...................................................................................+++
..........+++
e is 65537 (0x010001)
  1. 随后创建 ssl 证书 csr:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ openssl req -new -key server.key -out server.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:SiChuan
Locality Name (eg, city) []:ChengDu
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Sichuan Lingyun Technology Co., LTD
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:Sichuan Lingyun Technology Co., LTD
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
  1. 创建域名附加配置信息,新建一个文件,通过 vim cert.ext ,将以下代码粘贴后保存:
1
2
3
4
5
6
7
8
9
10
11
12
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names

[alt_names]
DNS.1 = localhost
IP.2 = 192.168.0.10
IP.3 = 192.168.1.200
DNS.4 = xa.it.com
DNS.5 = xiykj.com
DNS.6 = *.xa.com

需要注意的是,IP.2 = 192.168.11.100 表示 https 要访问的 IP 地址,IP.3 同理也是 IP 地址,ssl 证书允许自签多个 IP 地址,这便是自签 IP 的证书。而 DNS.4 = https://xa.it.com/ 则表示 https 要访问的域名,DNS.5、DNS.6 同理均为域名,ssl 证书也支持自签多个域名,此为自签域名的证书。

  1. 使用CA根证书签署ssl证书,自签ssl证书有效期20年:
1
2
3
4
5
$ openssl x509 -req -in server.csr -out server.crt -days 7300 -CAcreateserial -CA root.crt -CAkey root.key -CAserial serial -extfile cert.ext
Signature ok
subject=C = CN, ST = SiChuan, L = ChengDu, O = "Sichuan Lingyun Technology Co., LTD"
Getting CA Private Key
Enter pass phrase for root.key:
  1. 查看文件,通过执行“ls -al”命令
1
2
3
4
5
6
$ ls -al
cert.ext #ssl证书附加配置信息
serial #证书序列号
server.crt #ssl证书文件,包含公钥信息
server.csr #ssl证书签名文件
server.key #ssl证书私钥
  1. 查看签署的证书信息:
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
58
59
60
61
$ openssl x509 -in server.crt -noout -text
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
cd:ae:a9:3e:b7:bb:93:e1
Signature Algorithm: sha256WithRSAEncryption
Issuer: C = CN, ST = SiChuan, L = ChengDu, O = "Sichuan Lingyun Technology Co., LTD"
Validity
Not Before: Jul 18 06:26:05 2024 GMT
Not After : Jul 13 06:26:05 2044 GMT
Subject: C = CN, ST = SiChuan, L = ChengDu, O = "Sichuan Lingyun Technology Co., LTD"
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
00:aa:4e:ca:f5:0d:51:e7:b4:ba:3c:0b:6e:a5:4a:
d8:b4:0d:ad:19:54:3d:11:02:14:29:41:45:76:fc:
4a:b0:6c:5c:76:46:91:ff:8d:89:7a:f2:a8:62:73:
1d:c4:3a:96:8c:74:82:0a:e9:58:55:73:4a:4e:ec:
17:23:43:90:39:69:0e:aa:ac:ec:71:3e:60:e5:6b:
0c:e7:7b:f9:8f:93:db:a8:45:ae:d9:43:6f:f1:a1:
1c:01:0a:14:33:ce:4f:8c:81:f0:34:b5:cc:7c:81:
f6:91:1a:69:31:dc:8a:d1:c1:cc:34:6f:96:71:e0:
c2:86:79:37:47:a7:e4:c8:71:3f:44:82:38:7e:11:
4d:05:96:fd:01:d8:8c:8b:75:0b:bc:6e:ad:37:1d:
77:94:0b:2a:15:1a:43:3c:f6:59:61:eb:ea:8a:73:
54:06:b0:ed:70:11:77:42:57:59:e1:80:df:eb:0b:
36:d7:7b:d6:c8:53:20:e7:3a:cb:7c:95:67:ea:ff:
25:06:80:e9:93:b2:1d:a0:58:9f:ec:60:65:76:e8:
24:2c:14:9d:86:47:83:3b:b9:66:59:7d:69:b5:bd:
46:af:4f:15:a7:21:45:d1:8c:a1:9b:8b:73:20:94:
17:0e:1b:da:d2:e3:93:fb:98:d8:db:13:2b:ed:ff:
f5:95
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Authority Key Identifier:
keyid:8D:FB:23:BD:1D:AA:3B:C0:12:62:2A:15:8F:27:BF:81:EB:94:15:42

X509v3 Basic Constraints:
CA:FALSE
X509v3 Key Usage:
Digital Signature, Non Repudiation, Key Encipherment, Data Encipherment
X509v3 Subject Alternative Name:
DNS:localhost, IP Address:192.168.11.100, IP Address:192.168.10.200, DNS:xa.it.com, DNS:xiykj.com, DNS:*.xa.com
Signature Algorithm: sha256WithRSAEncryption
74:0f:a7:56:97:66:e1:8d:7a:5e:4e:7b:6f:b0:da:26:31:5c:
a3:77:9d:7f:25:19:1c:e2:cd:6a:ee:b3:9e:1f:55:3e:ea:8c:
05:5b:0f:9e:ac:f7:0f:72:8b:4c:6e:eb:20:4c:c3:d4:7b:d1:
63:79:54:dc:8d:46:f5:2e:73:fe:4f:5e:8f:d2:3c:54:47:90:
ae:cd:20:28:31:19:88:26:ec:46:86:1c:1e:ab:8b:67:77:d6:
81:1d:62:1b:59:7c:d6:4d:52:fe:44:b7:18:ce:6d:47:d3:34:
48:c8:59:c9:f9:3a:2a:41:9a:7c:50:c0:43:b0:6a:f4:3c:b1:
d5:49:f1:be:21:ae:b9:d8:72:48:19:f8:20:8c:3b:03:c5:c7:
26:0d:27:08:4d:0b:9e:27:ea:3c:bf:c3:09:07:fe:b0:68:9c:
76:1a:3f:49:44:af:67:9f:47:af:88:9f:50:25:1c:f4:a3:05:
b6:fb:1c:04:16:3d:6d:d3:ac:99:92:73:05:2f:c8:08:9a:e4:
88:e4:12:4d:f3:d0:aa:47:3c:eb:cf:9b:20:3a:88:e5:33:1b:
32:65:14:78:1d:c4:24:e8:63:e7:8e:18:b3:2b:bb:e2:94:38:
1d:dd:1f:f5:13:a2:db:ef:65:bc:12:a9:66:4f:48:15:57:e8:
82:79:24:a0
  1. 使用 CA 验证 ssl 证书状态,若显示“OK”则表示通过验证:
1
2
$ openssl verify -CAfile root.crt server.crt
server.crt: OK

最后,将 root.crt 导入到需要访问的客户端 PC 的“受信任的根证书颁发机构”中,同时将 server.crt、server.key 文件部署在服务器上即可。

PHPStorm 控制台出现乱码的情况,往往是由于控制台所采用的字符编码和输出内容的编码存在差异所致。比如说,控制台或许默认运用的是 GBK 编码,然而您的 PHP 代码输出的却是 UTF-8 编码的内容,抑或是其他的编码形式。

upload successful

开启 PHPStorm 的设置页面,在其中进行搜索“Console Encoding”,接着选中“Default Encoding”这一选项,并将“UTF-8”设定为默认编码。

upload successful

再次执行相关命令,此时控制台理应能够正常显示内容。

upload successful

是一个开源项目,用于破解和优化Windows系统上的Remote Desktop Protocol(远程桌面协议)。它允许你在没有官方许可的情况下,实现多用户的并发远程访问,这对于IT管理员、开发者或者需要频繁远程控制电脑的用户来说,是一个非常实用的工具。

项目简介

RDPWrap的主要功能是绕过Windows系统的限制,使得单个安装了RDP服务的计算机可以同时接受多个远程桌面连接,而无需购买额外的授权。该项目由Stas’M Sajewicz创建并维护,社区也在持续贡献和支持。

技术分析

RDPWrap的工作原理是通过对Windows的Remote Desktop Services(RDS)服务进行钩子处理,改变其内部的行为模式。它提供了一个配置工具,用于检测当前系统的支持情况,并更新本地的bypass.dll文件以启用多会话模式。此外,RDPWrap还包含一个实时更新的服务端口数据库,帮助用户跟踪最新的系统版本兼容性。

需要注意的是,由于涉及到系统底层操作,RDPWrap可能需要管理员权限运行,且在安装和配置过程中应谨慎操作,避免对系统稳定性产生影响。

应用场景

  1. 节省成本 - 对于拥有大量Windows设备但预算有限的企业,RDPWrap可以帮助他们避免购买昂贵的多用户许可证。
  2. 远程教育与培训 - 教师或教练可以同时监控多个学生的学习进度,提供即时反馈。
  3. 多用户共享 - 在家庭环境中,家庭成员可以在各自的设备上同时远程访问一台高性能主机进行游戏或计算任务。
  4. 服务器管理 - IT专业人员可以更方便地同时管理多台服务器,无需来回切换登录。

特点

  • 开源免费 - 开源意味着代码公开,用户可以自由查看,学习甚至改进。
  • 跨平台支持 - 支持多种Windows操作系统版本,从XP到最新的Windows 10。
  • 简单易用 - 提供直观的配置工具,即使是对技术不太了解的用户也能轻松设置。
  • 持续更新 - 社区活跃,不断跟进新的Windows更新,确保兼容性。

使用建议

在使用RDPWrap之前,请确保已理解其工作方式并做好数据备份,因为任何对系统核心组件的操作都可能存在风险。另外,尊重他人的版权,合法使用远程桌面服务,切勿用于非法目的。

总结来说,RDPWrap是一个强大且实用的工具,尤其适合需要高效远程管理Windows系统的用户。只要合理使用,它就能为你带来极大的便利。希望这篇介绍能够帮助你更好地理解和利用RDPWrap,享受更灵活的远程桌面体验。

项目地址:https://github.com/stascorp/rdpwrap

在使用Docker的过程中,镜像下载速度一直是许多开发者面临的痛点。尤其是在网络环境不佳的情况下,等待镜像下载完成可能会耗费大量的时间和耐心。不过,今天我要为大家介绍一个能够显著提升Docker镜像下载速度的工具——毫秒镜像。

什么是毫秒镜像?

毫秒镜像(https://docker.1ms.run)是由合肥木雷坞信息技术有限公司提供的Docker镜像加速服务。它通过在国内部署高速的镜像代理服务器,帮助用户快速获取Docker Hub上的镜像资源,从而大大缩短了镜像下载时间。

如何使用毫秒镜像?

使用毫秒镜像非常简单,主要有两种方式:全局配置和临时配置。

全局配置

全局配置可以让毫秒镜像永久生效,适用于大多数用户。以下是具体的配置步骤:

  1. 编辑Docker配置文件
    打开终端,运行以下命令,将毫秒镜像的地址添加到Docker的配置文件中:
1
echo '{"registry-mirrors": ["https://docker.1ms.run"]}' | sudo tee /etc/docker/daemon.json > /dev/null

这一步会将镜像加速地址写入/etc/docker/daemon.json文件中。

  1. 重启Docker服务
    配置完成后,需要重启Docker服务以使配置生效:
1
systemctl daemon-reload systemctl restart docker

完成以上步骤后,毫秒镜像就会自动为你的Docker镜像下载提供加速服务。

临时配置

如果你不想修改全局配置,也可以在拉取镜像时临时使用毫秒镜像。例如:

1
docker pull docker.1ms.run/library/nginx

这种方式会在本次拉取操作中使用毫秒镜像加速,而不会影响其他镜像的拉取。

登录毫秒镜像

如果需要使用更高级的功能,比如VIP加速通道,可以注册并登录毫秒镜像。登录命令如下:

1
docker login docker.1ms.run

登录后,你将享受更快速、更稳定的镜像下载体验。

赞助商与合作伙伴

毫秒镜像背后有强大的赞助商和合作伙伴支持。例如,腾讯CODING团队提供的免费Git托管和CI/CD全流程研发能效平台,以及宝塔Linux面板、雷池WAF社区版、耗子面板和林枫云等合作伙伴,都为用户提供了丰富的服务器管理和安全防护解决方案。

使用协议与免责声明

在使用毫秒镜像时,用户需要遵守相关法律法规,并自行承担使用风险。开发者不对因使用本程序而导致的任何直接或间接损失承担责任。使用本程序即视为同意免责声明的所有条款。

在日常使用浏览器的过程中,书签功能是许多用户不可或缺的工具之一。它可以帮助我们快速访问常用的网站,节省时间并提高上网效率。然而,有些用户可能希望单击书签时能够直接在新标签页中打开,而不是在当前标签页中替换内容。今天,我们就来分享一下如何在火狐浏览器中设置书签单击后在新标签页打开的方法。

一、火狐浏览器的书签功能简介

火狐浏览器(Mozilla Firefox)是一款广受欢迎的开源浏览器,以其强大的功能、灵活的自定义选项和出色的隐私保护而受到用户的喜爱。书签功能是火狐浏览器的一个重要特性,用户可以通过它将喜欢的网站添加到收藏夹中,方便随时访问。默认情况下,单击书签会在当前标签页中打开链接,但有时我们可能需要在新标签页中打开书签,以便同时查看多个网页。

二、设置书签单击后在新标签页打开的步骤

1. 打开火狐浏览器的高级首选项窗口

首先,启动火狐浏览器,在浏览器顶部的地址栏中输入 about:config,然后按下回车键。这个地址会带你进入火狐浏览器的高级配置页面,这里包含了大量可以自定义的选项。

upload successful

2. 接受风险并继续

当页面切换后,你会看到一个提示文字,警告你更改配置可能会导致浏览器不稳定或出现其他问题。不用担心,这只是浏览器的常规提示。点击“接受风险并继续”按钮,进入高级首选项窗口。

3. 搜索并修改相关设置

在高级首选项窗口的搜索框中输入 browser.tabs.loadBookmarksinTabs,然后按下回车键。搜索结果中会出现一个名为 browser.tabs.loadBookmarksinTabs 的选项,它的默认值通常是 false。

upload successful

4. 修改选项值

找到这个选项后,点击其右侧的双向箭头,将其值切换为 true。这样,当你再次单击书签时,链接就会在新标签页中打开。

在当今快节奏的开发环境中,拥有一个功能强大且易于使用的工具箱对于提升工作效率至关重要。今天,我们将介绍一个轻量级、开源的前端工具箱——it-tools。这个工具箱专为开发者设计,旨在简化日常开发任务,无论是普通用户还是资深开发者都能从中受益。

upload successful

为什么选择 it-tools?

it-tools 以其简洁高效、一站式解决方案、跨平台支持和开源特性脱颖而出:

  • 简洁高效:提供众多常用小工具,降低学习和使用成本。
  • 一站式解决方案:一个界面解决多种需求,简化工作流程。
  • 跨平台支持:通过 web 端访问,支持多种操作系统和浏览器环境。
  • 开源且持续更新:社区活跃,功能不断扩展和优化。

部署方式

it-tools 作为一个基于 Web 的前端工具箱,提供了多种部署方式:

在线使用

最简单的部署方式是直接在线使用,无需本地部署。访问 https://it-tools.tech/ 即可立即开始使用所有功能,所有操作都在浏览器中完成。如果访问的语言不正确,可以在右上角切换。

Docker 部署

使用 docker 命令

1
2
3
4
docker run -d --name it-tools \
--restart unless-stopped \
-p 8080:80 \
corentinth/it-tools:latest

使用 docker-compose

1
2
3
4
5
6
7
8
9
version: '3.3'
services:
it-tools:
image: corentinth/it-tools:latest
restart: always
environment:
TZ: Asia/Shanghai
ports:
- 8080:80

本地编译部署

如果你想将 it-tools 部署到线上服务器供团队使用,可以按照以下步骤进行:

  1. 构建项目

首先生成项目的静态文件:

1
2
3
4
5
6
7
git clone https://github.com/CorentinTh/it-tools.git
cd it-tools
pnpm install
# 运行开发环境
pnpm dev
# 编译上线环境
pnpm build

如果你想开发自己的工具,还可以运行:

1
pnpm run script:create:tool my-tool-name
  1. 部署到服务器

将生成的 dist 文件夹中的静态文件上传到你的 Web 服务器(如 Nginx、Apache 等)。

  1. 配置服务器

在你的服务器配置文件中,将根目录指向 /opt/dist 文件夹。以 Nginx 为例:

1
2
3
4
5
6
7
8
9
server {
listen 80;
server_name 你的域名;

location / {
root /opt/dist;
index index.html;
}
}

保存配置并重启服务器,即可通过域名访问。

工具详细介绍

it-tools 涵盖了多个实用的前端工具,主要包括以下类别:

  1. Crypto 加密工具类:Token生成、Hash函数、UUID生成和文本加解密等功能。
  2. Converter 转换工具类:日期时间、数据格式(JSON、XML等)和颜色代码转换等工具。
  3. Web 工具类:URL编码/解码、HTML实体转义、HTTP状态码查询等Web开发相关工具。
  4. Images and videos 图片视频工具类:二维码生成、SVG占位符生成等功能。
  5. Development 开发工具类:代码格式化、端口生成等工具,帮助开发者简化日常任务。
  6. Network 网络工具类:IPv4子网计算器、MAC地址生成器等网络相关工具。
  7. Math 数学工具类:数学表达式计算、百分比计算等常用数学工具。
  8. Measurement 测量工具类:温度转换等测量单位转换工具。
  9. Text 文本工具类:文本统计、字符串混淆器等文本处理工具。
  10. Data 数据工具类:JSON转CSV、数据格式验证等数据处理工具。

总结

it-tools 已经提供了广泛的工具集合,帮助开发者在加密、格式转换、网络、开发辅助等领域提高工作效率。通过进一步扩展和细化每个工具的功能,可以增强其适用性和灵活性,满足更多复杂开发场景下的需求。这些扩展内容有助于让 it-tools 成为前端开发中更强大且实用的工具箱。

关于

随着时间的推移,个人站点的博客文章会越来越多,那怎么样才能快速找到你印象中的文章呢?增加一个站点内的搜索功能是非常有必要和方便的。
具体操作

  1. 安装搜索:在Hexo的根目录下,打开命令可执行窗口,执行如下命令:
1
npm install hexo-generator-searchdb --save
  1. 全局配置文件_config.yml,新增如下内容:
1
2
3
4
5
search:
path: search.xml
field: post
format: html
limit: 10000
  1. hexo主题配置文件(\themes\next_config.yml),修改local_search的enable为true:
1
2
3
4
5
6
7
8
9
10
11
12
13
# Local Search
# Dependencies: https://github.com/theme-next/hexo-generator-searchdb
local_search:
enable: true
# If auto, trigger search by changing input.
# If manual, trigger search by pressing enter key or search button.
trigger: auto
# Show top n results per article, show all results by setting to -1
top_n_per_article: 1
# Unescape html strings to the readable one.
unescape: false
# Preload the search data when the page loads.
preload: false