叶测试
type: channel
link: https://r1989.com/
description: Rebuild 1989
items: 使用phpword读取word中的文本、表格等内容
items: 瀚高数据库安全版安装license
items: PostgreSQL中的archive_command详解
items: linux工具：json解析工具jq
items: 多因素认证（MFA）动态令牌PHP实现
items: js变量间赋值，修改变量值后原变量随之改变问题
items: OA系统信创迁移流程
items: 使用sshpass实现ssh、scp等免密登录

使用phpword读取word中的文本、表格等内容
type: item
date: 2025-08-27T06:35:24+00:00
description: phpword读取word中的内容，调用deepseek后生成word下载，代码如下： <?php /** * Desc: * User: SenSen Wechat:1050575278 * Date: 2025-8-27 * Time: 11:02 */ namespace app\index\controller\service; use app\index\controller\Auth; use PhpOffice\PhpWord\IOFactory; use PhpOffice\PhpWord\PhpWord; use PhpOffice\PhpWord\SimpleType\Jc; use sensen\services\HttpService; use sensen\services\JsonService; use sensen\services\upload\Upload; class QiSuZhuang extends Auth { /** * 诉状上传 */ public function upload() { $upload_type = $this->request->get('upload_type', sys_config('upload_type', 1)); try { $path = make_path('qisuzhuang', 2, true); $upload = new Upload((int)$upload_type, [ 'accessKey' => sys_config('accessKey'), 'secretKey' => sys_config('secretKey'), 'uploadUrl' => sys_config('uploadUrl'), 'storageName' => sys_config('storage_name'), 'storageRegion' => sys_config('storage_region'), ]); //验证类型 $res = $upload->to($path)->validate(['fileExt'=>'doc,docx', 'fileMime'=>['application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'application/msword']])->move('file'); if ($res === false) { return JsonService::fail('上传失败：' . $upload->getError()); } else { $fileInfo = $upload->getUploadInfo(); if ($fileInfo) { $file = '.'.$fileInfo['dir']; $phpWord = IOFactory::load($file); $sections = $phpWord->getSections(); $szContent = ''; foreach ($sections as $section) { $elements = $section->getElements(); // 获取当前section的所有元素 foreach ($elements as $element) { if ($element instanceof \PhpOffice\PhpWord\Element\TextRun) { // 文本段落 foreach ($element->getElements() as $ele) { $szContent .= self::getTextNode($ele) . "\n"; } }else if ($element instanceof \PhpOffice\PhpWord\Element\Table) { foreach ($element->getRows() as $ele) { $szContent .= self::getTableNode($ele) . "\n"; } } } } $deepSeekContent = $this->getDeepSeekContent($szContent); debug_file($deepSeekContent, 'qisuzhuang'); $fileName = date('YmdHis'); $this->generateQszWord($deepSeekContent, $fileName); return JsonService::successful('上传成功', ['path'=>…

瀚高数据库安全版安装license
type: item
date: 2025-08-16T01:32:43+00:00
description: 瀚高数据库安全版 V4.5.8 以及后续版本，license 文件可分别管控瀚高安全版数据库、瀚高高可用集群(db_ha)，瀚高读写分离集群(hg_proxy)。上传 license将 license文件上传到服务器任意目录下检查 license使用 hg_lic -c -F $filepath 来对指定 $filepath license 文件进行检查操作，该操作将会输出对 license 文件的检查结果，如果检查出现问题，将会提示 license 文件异常。如果一切正常将会输出 license 信息，包括 license 编号、license 状态、用户信息、授权方式、授权用途、申请日期、产品名称、产品版本、产品有效期。chmod 0600 /opt/highgo/hgdb-see-4.5.8/etc/lic/hgdb.lic hg_lic -c -F /opt/highgo/hgdb-see-4.5.8/etc/lic/hgdb.lic加载license使用 hg_lic -l -P $HGDB_HOME -F $filepath 来对指定文件 $filepath 进行加载操作，若配置了 $HGDB_HOME 环境变量，-P 参数可以省略。该操作会对许可证文件进行检查，如果许可证文件异常，将会提示。如果许可证一切正常，该操作会将许可证文件加载到数据库中。

PostgreSQL中的archive_command详解
type: item
date: 2025-07-02T00:24:00+00:00
description: 什么是归档（Archiving）？归档是指将过时或不再频繁使用的数据迁移到存储介质的过程。 PostgreSQL支持通过归档机制保存事务日志（WAL），以便在需要时进行数据库的恢复。这是确保数据安全和完整性的重要措施。使用PostgreSQL的archive_command功能，你能够增强数据安全性，确保在发生故障时能够快速恢复。[...]

linux工具：json解析工具jq
type: item
date: 2025-07-01T02:32:12+00:00
description: jq 是一个轻量级、功能强大的 JSON 解析工具，专门用于 查询、格式化、修改 JSON 数据。安装yum install -y jq或直接下载二进制文件[...]

多因素认证（MFA）动态令牌PHP实现
type: item
date: 2025-06-19T12:04:00+00:00
description: 两步验证（Two-Factor Authentication，2FA）是一种增加账户安全性的方式，它要求用户提供两种不同类型的身份验证凭据才能访问服务或数据。这种核心思想建立在“知道”和“拥有”两种安全因素上：一种是用户知道的信息（如密码或PIN码），另一种是用户拥有的物理设备（如手机或安全令牌）。这样，即使攻击者窃取了用户的密码，没有物理设备也无法完成认证过程。多因素认证（MFA）的实现主要包含以下几个核心环节和技术要点，其流程设计兼顾安全性与用户体验：一、核心实现流程MFA 实现需平衡安全性与易用性，生物识别虽便捷但需考虑隐私合规（如 GDPR 生物数据特殊保护）。密钥初始化与绑定‌用户启用 MFA 时，系统生成唯一密钥（如 Base32 编码字符串），并通过加密 QR 码展示给用户扫描绑定认证器（如 Google Authenticator、Authy）。密钥安全存储于服务器端，并与用户账号关联。[...]

js变量间赋值，修改变量值后原变量随之改变问题
type: item
date: 2025-06-03T06:51:31+00:00
description: vue项目的开发过程中，需要多次用到一份基础数据，为减少代码量，提高一下复用效果，便用变量A来定义，在项目中需要用到时就用变量A进行赋值。在项目中调用时，新定义一个变量B，再将变量A赋值给变量B，即B=A；期望的效果是，赋值之后，A和B是两份数据，对变量B进行操作时不影响变量A。B=A的方式只是将B指向A的存储地址，实际上只有同一份数据，因此无论修改A还是B都是会互相影响的。解决方法：B = JSON.parse(JSON.stringify(A))

OA系统信创迁移流程
type: item
date: 2025-05-15T09:43:00+00:00
description: 需要对3000余套律所OA系统进行迁移，按天逐步迁移。基本流程如下：1.申请瀚高测试license兼容适配2.适配前对现有系统进行升级，提高后期迁移效率3.编写相关脚本[...]

使用sshpass实现ssh、scp等免密登录
type: item
date: 2025-05-13T12:25:00+00:00
description: ssh 登陆不能在命令行中指定密码，sshpass 的出现则解决了这一问题。它允许你用 -p 参数指定明文密码，然后直接登录远程服务器，它支持密码从命令行、文件、环境变量中读取。安装：yum install -y sshpasssshpass [-f|-d|-p|-e] [-hV] command parameters-f filename Take password to use from file -d number Use number as file descriptor for getting password -p password Provide password as argument (security unwise) -e Password is passed as env-var "SSHPASS" With no parameters - password will be taken from stdin -P prompt Which string should sshpass search for to detect a password prompt -v Be verbose about what you're doing -h Show help (this screen) -V Print version information如：sshpass -p 'root' scp /opt/file.txt root@192.168.126.135:/home