Xuan's blog - 配置
type: channel
link: https://blog.ybyq.wang/tag/%E9%85%8D%E7%BD%AE/
items: Windows 本地安装并使用 OpenClaw（原 clawdbot）教程
items: UnlockMusic 本地构建、服务器部署与浏览器扩展制作教程
items: 彻底清除与飞牛OS共存的宝塔面板教程
items: 解决飞牛nas更新后提示“数据库读写错误”无法挂载硬盘
items: 飞牛NAS更新后无法登录（502/系统内部错误）解决方案
items: 解决LoadRunner录制时无网络连接及 SSL、415等回放错误
items: LoadRunner 性能测试操作全流程：从脚本录制到结果分析
items: Umami3.0版本升级教程：从 v2 平滑迁移
items: 解决AI摘要不显示的三种方案 -AIsummary插件
items: 软件工程实践二：Spring Boot 知识回顾

Windows 本地安装并使用 OpenClaw（原 clawdbot）教程
type: item
date: 2026-02-01T15:06:00+08:00
description: 简介OpenClaw 是一款基于 AI 的本地化助手工具，前身为 clawdbot。它可以帮助用户在本地环境中快速部署和使用大语言模型，支持多种国内外主流 AI 模型接入。安装步骤1. 安装 Node.js 22.x首先需要安装 Node.js 运行环境。访问 Node.js 官网下载 22.x 版本的安装包，按照向导完成安装。2. 安装 OpenClaw打开命令行工具，执行以下命令进行全局安装：npm install -g openclaw@latest3. 配置 OpenClaw安装完成后需要进行初始化配置。注意：以下操作需要在管理员权限的终端中运行执行配置命令：openclaw onboard --install-daemon3.1 选择启动模块在配置过程中，选择"快速开始"模块，这样可以快速完成基础配置。3.2 选择 AI 模型这里选择通义千问（Qwen）模型，当然也可以根据需要选择其他国内外的大模型。3.3 登录验证选择通义千问的登录验证方式。系统会自动打开浏览器进行登录验证，完成授权后即可继续。3.4 选择默认模型在可用的模型列表中选择一个作为默认使用的模型。3.5 跳过高级配置对于初次使用，可以暂时跳过 channel 的配置。同样，skills 和 hooks 也可以暂时不配置，后续有需要再添加。3.6 安装守护进程选择 reinstall 来安装或重新安装守护进程。4. 启动和使用配置完成后，OpenClaw 会自动启动。系统会自动在浏览器中打开 OpenClaw 的 Web 界面。5. 验证安装在聊天界面发送一条消息，如果收到 AI 的回复，就说明安装配置成功了。总结至此，OpenClaw 已经在 Windows 系统上成功部署。整个过程主要包括安装 Node.js 环境、全局安装 OpenClaw、配置模型和认证信息、安装守护进程等步骤。安装完成后就可以在本地使用各种 AI 大模型功能了。由于很消耗token，所以我还没有过多使用它的技能。

UnlockMusic 本地构建、服务器部署与浏览器扩展制作教程
type: item
date: 2026-01-29T01:35:00+08:00
description: 本地构建前置环境配置核心依赖Node.js: 运行环境请务必锁定为 v16.x 版本。该项目暂不支持 v17 及更高版本，强行使用会导致编译失败。npm: 推荐直接使用 Node.js v16 自带的包管理工具（npm v8.x），以规避潜在的版本冲突。警告: 本项目基于 Vue CLI 4 与 Webpack 4 开发，与 Node.js v17+ 存在底层不兼容。若版本不匹配，编译流程将无法正常完成。WASM 组件（可选）操作系统：Linux环境支持：Python 3在线预览地址：unlock-music详细操作步骤1. 获取源代码首先把代码拉取到本地：git clone https://git.unlock-music.dev/um/web.git或者在项目仓库下载。2. 确认 Node 版本在终端输入命令检查当前版本：node --version如果环境不符合 v16.x 要求，请按以下方式切换：通过 nvm 管理（推荐）：# 安装 Node.js v16 nvm install 16 # 切换到 v16 环境 nvm use 16（以上命令在 Windows/Linux/macOS 上均适用，nvm 的具体安装请参照对应平台的指南。）手动安装：若未安装 nvm，请前往 Node.js 历史版本库 获取安装包。3. 清理旧依赖（建议执行）如果你之前用其他 Node 版本运行过该项目，为稳妥起见，建议先清理旧的依赖文件：# Windows PowerShell 环境 Remove-Item -Recurse -Force node_modules Remove-Item -Force package-lock.json # Linux/macOS 环境 rm -rf node_modules package-lock.json4. 安装项目依赖执行安装命令：npm install注：请使用 npm install 而非 npm ci，因为在首次构建或切换 Node 版本后，通常需要重新生成 lock 文件。5. 开始构建5.1 开发模式（用于调试）如果你想边修改代码边预览效果，运行：npm run serve启动后，在浏览器中访问 http://localhost:8080 即可实时查看。5.2 生产环境构建（用于部署）如果你需要将应用部署到服务器，运行：npm run build构建完成后，所有生成的文件将位于 dist 目录中，将其上传至服务器即可运行。6. 制作浏览器插件（可选）如果你想将其打包为浏览器扩展程序，运行：npm run make-extension构建成功后会在 dist 目录生成三个扩展文件：popup.html、popup.js 和 manifest.json常见报错及解决方法报错 1: error:0308010C:digital envelope routines::unsupported原因：典型的 OpenSSL 兼容性问题，通常由 Node.js 版本过高引起。解决：将 Node.js 降级至 v16.x 即可。报错 2: parser.state.module.addPresentationalDependency is not a function原因：全局安装了 Webpack 5，与项目内的 Webpack 4 产生冲突。解决：# 1. 移除全局冲突的 webpack npm uninstall -g webpack # 2. 彻底清理并重装项目依赖 rm -rf node_modules package-lock.json npm install报错 3: npm 环境警告如果看到类似 npm warn cli npm v11.x.x does not support Node.js v16.x.x 的提示，通常可以忽略，这仅是版本跨度提示，一般不影响最终构建结果。目录结构说明构建完成后，dist 目录结构大致如下：dist/ ├── index.html # 应用主入口页面 ├── loader.js # 资源预加载脚本 ├── css/ # 样式文件目录 ├── js/ # 核心逻辑及 Web Worker 脚本 ├── img/ # 图片等静态资源 └── service-worker.js # 离线应用支持脚本部署方案选择方案一：Nginx 静态托管将 dist 目录下的所有文件上传至你的 Nginx、Apache 服务器或任意静态托管服务/CDN。基础 Nginx 配置参考：server { listen 80; server_name your-domain.com; root /path/to/your/dist; index index.html; locati…

彻底清除与飞牛OS共存的宝塔面板教程
type: item
date: 2026-01-17T17:27:40+08:00
description: 为什么必须彻底清理？宝塔面板不仅安装服务，还会：锁定关键文件（.user.ini 加 chattr +i）启用 AppArmor/SELinux 安全策略修改 systemd 服务和内核参数即使“卸载”，仍会残留进程和配置彻底清除步骤第一步：运行宝塔官方卸载脚本wget http://download.bt.cn/install/bt-uninstall.sh sudo bash bt-uninstall.sh→ 选择 【2】卸载宝塔及运行环境第二步：清除顽固进程# 强制终止残留进程 sudo pkill -f "site_total" sudo pkill -f "php-fpm" # 验证是否清除 ps aux | grep -E 'site_total|php-fpm' | grep -v grep"第三步：解除文件锁定并删除 /www[hide]# 移除 immutable 属性（关键！） sudo find /www -name ".user.ini" -exec chattr -i {} \; 2>/dev/null # 删除主目录 sudo rm -rf /www # 验证 ls /www 2>/dev/null && echo "未删干净" || echo "/www 已删除"[/hide]第四步：禁用 AppArmor（防止 Docker 启动失败）# 临时清理策略 sudo aa-teardown # 永久禁用（编辑 GRUB） sudo nano /etc/default/grub将：GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"改为：GRUB_CMDLINE_LINUX_DEFAULT="quiet splash apparmor=0 security=none"保存后执行：sudo update-grub sudo reboot第五步：重置 Docker 环境（可选但推荐）sudo systemctl stop docker sudo rm -rf /vol1/docker sudo mkdir -p /vol1/docker/volumes sudo chown root:docker /vol1/docker sudo chmod 775 /vol1/docker sudo systemctl start docker重要提醒如需建站，请使用飞牛「应用中心」中的官方应用宝塔保持系统纯净，才能确保长期稳定运行

解决飞牛nas更新后提示“数据库读写错误”无法挂载硬盘
type: item
date: 2026-01-17T16:48:00+08:00
description: 问题及原因升级到飞牛OS 1.1.11 后，在 Web 界面挂载硬盘时提示 “数据库读写错误”。飞牛OS 1.1.11 版本 默认启用了 AppArmor 安全模块，但未正确配置对 /vol1 目录（用户数据盘）的访问权限。 这导致：trim_license 服务无法写入 PostgreSQL 数据库Docker 无法创建 volume 元数据（metadata.db）硬盘挂载流程因数据库操作失败而中断解决方案一：禁用 AppArmor 内核安全模块此操作仅在飞牛OS环境下安全，不建议在通用 Linux 服务器上使用。步骤 1：通过 SSH 登录飞牛OSssh admin@你的飞牛IP步骤 2：编辑 GRUB 启动参数使用root权限时需要输入密码（密码输入时不会显示）sudo nano /etc/default/grub找到以下行：GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"修改为：[hide]GRUB_CMDLINE_LINUX_DEFAULT="quiet splash apparmor=0 security=none"[/hide]按 Ctrl+O → 回车保存，Ctrl+X 退出。步骤 3：更新引导配置并重启sudo update-grub sudo reboot步骤 4：验证修复结果系统重启后，登录 Web 界面：尝试重新挂载硬盘应不再出现“数据库读写失败”错误可选验证命令（SSH 中执行）：systemctl is-active trim_license postgresql@15-main补充说明禁用 apparmor=0 不会影响飞牛OS核心功能，反而能解决兼容性问题若未来官方修复此问题，可通过恢复 GRUB 参数重新启用 AppArmor方案二同样SSH远程连接后，使用命令sudo -i切换到管理员权限然后执行官方修复脚本：curl -L https://static2.fnnas.com/aptfix/trim-sec -o trim-sec && chmod +x trim-sec && ./trim-sec最后方案一是我升级1.1.11时此问题的解决办法，解决后再次升级1.1.18并未出现这个问题。方案二是我在飞牛论坛找到的，专门解决1.1.18的。

飞牛NAS更新后无法登录（502/系统内部错误）解决方案
type: item
date: 2026-01-17T00:27:00+08:00
description: 前言在25年11月，我将飞牛os从0.9.35更新到1.x.x后，发现登不进去了。然后我一直怀疑是飞牛frpc服务未重启，就让家里人手动重启了几次，但都不行。最后也是在寒假第一天晚上修复了，不是frp的问题。问题现象浏览器访问 Web 界面时卡在登录页控制台报错：GET http://192.168.1.9:5666/license/v1/device/baseInfo 502 (Bad Gateway)SSH 登录后发现 trim_license.service 反复崩溃解决步骤第一步：确认核心服务状态# 检查飞牛相关服务 systemctl list-units --type=service | grep trim # 检查 Nginx（应为 running） systemctl status nginx # 检查 PostgreSQL 是否安装 systemctl list-unit-files | grep postgresql预期输出：存在 postgresql.service 且为 enabled，但 trim_license 为 inactive 或反复重启。第二步：检查 PostgreSQL 集群状态# 查看 PostgreSQL 集群列表 sudo pg_lsclusters示例输出：Ver Cluster Port Status Owner Data directory Log file 15 main 5432 down postgres /var/lib/postgresql/15/main ...若状态为 down，说明数据库未运行。第三步：排查 PostgreSQL 启动失败原因尝试启动集群：sudo pg_ctlcluster 15 main start若失败，查看详细日志：sudo journalctl -xeu postgresql@15-main.service --no-pager | tail -n 30关键错误示例：could not bind IPv4 address "127.0.0.1": Address already in use FATAL: could not create any TCP/IP sockets表明 5432 端口已被占用。第四步：释放被占用的 5432 端口1. 查找占用端口的进程sudo ss -tulnp | grep :5432示例输出：tcp LISTEN ... 127.0.0.1:5432 ... users:(("postgres",pid=1358,fd=8))2. 终止残留进程sudo kill -9 1358 # 替换为实际 PID3. 清理残留 PID 文件sudo rm -f /var/lib/postgresql/15/main/postmaster.pid sudo rm -f /run/postgresql/*.pid第五步：启动 PostgreSQL 并验证# 启动正规集群 sudo pg_ctlcluster 15 main start # 验证 socket 文件生成 ls /var/run/postgresql/正常输出应包含：.s.PGSQL.5432 15-main.pid第六步：启动 License 服务# 启动授权服务 sudo systemctl start trim_license # 验证状态 systemctl status trim_license预期状态：Active: active (running)第七步：设置开机自启（防止重启后复现）# 启用 PostgreSQL 集群自启 sudo systemctl enable postgresql@15-main # 确保 license 服务自启（通常已启用） sudo systemctl enable trim_license验证与总结输入账号密码，登录成功适用场景：飞牛OS系统更新后，Web 管理界面无法登录，提示 502 Bad Gateway 或“系统内部错误”，且浏览器开发者工具中可见 /license/v1/device/baseInfo 请求失败。 根本原因：trim_license 服务依赖 PostgreSQL 数据库，但更新后 PostgreSQL 未正常运行或端口被残留进程占用，导致授权服务启动失败。附：完整修复命令汇总（可一键复制执行）[hide]# 1. 查看并终止占用 5432 的进程 sudo ss -tulnp | grep :5432 sudo kill -9 1358 # 替换为实际 PID # 2. 清理残留文件 sudo rm -f /var/lib/postgresql/15/main/postmaster…

解决LoadRunner录制时无网络连接及 SSL、415等回放错误
type: item
date: 2026-01-15T02:12:00+08:00
description: LoadRunner 在录制脚本时经常会遇到网络连接失败、回放报错等问题，这些问题往往与本地代理配置、防火墙设置或浏览器缓存有关。本文从实际场景出发，提供完整的排查与解决方案。前言期末作业需要用LoadRunner对上学期开发的项目做性能测试。我早早的做完了作业并完成了答辩，后面陆续帮助舍友和同学解决了录制等问题，把遇到的问题和解决方案都给总结了一下，发了三篇简单的教程。在解决了五六位同学的问题后，发现对每个人的问题和方法都不太一样。所以下面这些解决办法，建议可以每个都尝试一下，大概率可以得到解决。一、录制阶段：无法连接网络问题问题表现使用 LoadRunner 12.55 录制时，启动后会提示 "无 Internet 连接"。排查思路LoadRunner 录制通过拦截浏览器的 HTTP(S) 流量实现，因此本地防火墙、代理软件都可能干扰流量捕获。应首先排除系统层面的干扰，再根据是否使用代理进行配置。解决方案一：关闭本地防火墙适用场景： 所有情况下优先检查 防火墙（如 Microsoft Defender、火绒等）可能会阻止 LoadRunner 的网络监听行为。打开 Windows 安全中心 -> 防火墙和网络保护。临时关闭所有网络配置文件的防火墙。解决方案二：配置 HTTP 代理（根据本地环境选择）场景 A：本地未安装任何代理软件操作步骤：进入 Recording Options -> HTTP Properties -> Advanced。在代理设置中选择使用LoadRunner代理服务器。场景 B：本地安装了代理软件（如 Clash、Clash Verge）操作步骤：配置端口映射 进入 Recording Options -> Network -> Port Mapping，添加目标服务器：目标服务器地址：被测网站的域名（如 petad.xuan.cyou）目标端口：2000（或被测网站实际端口，如 80）筛选级别：选择 代码生成配置代理服务器 进入 Runtime Settings -> Internet Protocol -> Proxy -> Use Custom Proxy：代理地址：127.0.0.1代理端口：Clash：7890Clash Verge：7897解决方案三：清除浏览器缓存适用场景： 被测网站在录制浏览器中存在登录态或缓存数据 浏览器缓存可能导致 LoadRunner 无法正确拦截首次请求。在录制浏览器中按 Ctrl + Shift + Delete，清除所有浏览数据。成功标志录制开始后，浏览器访问网站时会提示 "您的连接不是私密连接"（SSL 证书警告），点击 "继续访问" 即可正常录制。二、回放阶段：常见错误及解决方案错误 1：录制后无代码生成问题描述： 录制过程正常，但停止后 Action 文件为空。 解决方案： 这通常是端口映射或捕获级别问题，详细排查方法请参考：[post cid="1402" /]错误 2：SSL Protocol Error完整报错信息： SSL protocol error when attempting to connect with host "127.0.0.1"原因分析： 回放时使用套接字（Socket）模式与 SSL 握手不兼容。解决方法： 进入 Runtime Settings -> Internet Protocol -> Preferences，勾选 "Use WinInet replay instead of Sockets"（使用 WinINet 回放而非套接字）。错误 3：HTTP 415 (Unsupported Media Type)完整报错信息： 对于"https://petad.xuan.cyou/api/product/update"，HTTP 状态代码=415 (Unsupported Media Type)原因分析： 服务端要求请求头包含 Content-Type: application/json，但 LoadRunner 录制时未自动添加。解决方法： 在对应的 web_submit_data 或 web_custom_request 函数之前手动添加请求头：web_add_header("Content-Type", "application/json");三、总结与建议这软件真是一坨💩

LoadRunner 性能测试操作全流程：从脚本录制到结果分析
type: item
date: 2026-01-12T21:09:00+08:00
description: 本教程使用的版本：12.55一、 脚本录制 (VUGen)1. 初始化与新建脚本首先打开 LoadRunner，选择 Virtual User Generator (VUGen)。在首页点击“新建解决方案”或直接创建新脚本。创建新脚本时，通常选择 Web - HTTP/HTML 协议。2. 配置录制环境点击录制按钮，在配置窗口中，应用程序（Application）选择对应的浏览器，并在 URL 地址栏输入被测网站的地址。3. 执行业务录制点击开始录制后，在浏览器中按照预定的业务流程进行操作。4. 插入事务为了精确衡量关键业务（如登录）的性能，需要在操作前后插入事务 (Transaction)。开始事务：以登录功能为例，在点击登录前点击“插入事务”并命名为 login。结束事务：成功登录后，点击“结束事务”并确认 login 事务结束。5. 结束录制与生成代码完成操作后停止录制，系统会自动生成脚本代码和录制报告。后续的性能优化和参数化工作将在生成的代码基础上进行。6. 录制回放校验在正式压测前，点击“回放 (Replay)”确保脚本在单用户环境下能正常跑通。回放成功意味着脚本逻辑基本正确。二、 场景创建 (Controller)1. 创建压测场景在 VUGen 工具栏中点击 工具 -> 创建场景，将脚本导入 Controller。设置场景名称并点击确定，即可完成初始化。三、 场景设计与负载配置本文以并发测试中的一个场景举例根据压测目标（如 TS-2-1.1 用例）配置具体的负载参数。1. 设置启动虚拟用户 (Ramp-up)配置启动的 Vuser 总数以及启动频率（如每隔一定时间增加固定用户），模拟压力平稳上升的过程。2. 设置持续时间 (Duration)设置系统在峰值压力下的持续运行时间，以便观察系统的稳定性和资源消耗情况。3. 设置停止虚拟用户 (Ramp-down)配置测试结束时用户的退出方式，建议采用分批退出的方式。四、 场景运行切换到“运行”选项卡，点击开始执行场景。测试完成后，Controller 将汇总所有实时监控数据。五、 结果分析 (Analysis)1. 启动分析引擎点击 结果 -> 分析结果，系统将启动 Analysis 组件对收集到的原始数据进行整理。2. 查看性能报告在分析报告中，重点关注摘要报告（Summary Report）中的事务响应时间、吞吐量（Throughput）和每秒点击率（Hits per Second）等核心指标。

Umami3.0版本升级教程：从 v2 平滑迁移
type: item
date: 2025-11-08T16:58:00+08:00
description: 前言这是一份关于如何将已部署的 Umami2.0 统计系统更新到 3.0 版本的详细教程。如果你是按照我之前的 [post cid="381" /]部署的，那么这篇教程将帮助你平滑升级到最新版本。更新前的准备1. 备份数据库在进行任何更新操作之前，强烈建议先备份数据库数据，以防万一出现问题可以快速回滚。# 进入到 Umami 目录 cd /www/wwwroot/visitors.ybyq.wang/umami # 备份数据库数据 docker-compose exec db pg_dump -U umami umami > umami_backup_$(date +%Y%m%d_%H%M%S).sql备份文件会保存在当前目录下，文件名包含时间戳，方便识别。2. 记录当前版本查看当前运行的 Umami 版本，以便后续确认更新是否成功：docker-compose exec umami cat /app/package.json | grep version更新步骤1. 进入项目目录cd /www/wwwroot/visitors.ybyq.wang/umami2. 停止当前运行的容器docker-compose down这个命令会停止并删除容器，但不会删除数据卷，你的统计数据是安全的。3. 拉取最新代码我已经同步了官方最新版本到 Gitee仓库，现在直接拉取更新：git pull origin master如果提示有本地修改冲突，可以先备份 docker-compose.yml 文件：cp docker-compose.yml docker-compose.yml.backup然后强制拉取：git fetch --all git reset --hard origin/master之后再恢复你的配置文件：cp docker-compose.yml.backup docker-compose.yml4. 检查配置文件Umami3.0 可能会有一些配置变化，检查 docker-compose.yml 文件是否需要更新。主要关注以下配置：[collapse status="false" title="展开查看 docker-compose.yml 配置示例"]version: '3' services: umami: image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/docker.umami.is/umami-software/umami:postgresql-latest ports: - "3000:3000" environment: DATABASE_URL: postgresql://umami:你的密码@db:5432/umami DATABASE_TYPE: postgresql APP_SECRET: 5201314yyds depends_on: db: condition: service_healthy restart: always healthcheck: test: ["CMD-SHELL", "curl http://localhost:3000/api/heartbeat"] interval: 5s timeout: 5s retries: 5 db: image: postgres:15-alpine environment: POSTGRES_DB: umami POSTGRES_USER: umami POSTGRES_PASSWORD: 你的密码 volumes: - umami-db-data:/var/lib/postgresql/data restart: always healthcheck: test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"] interval: 5s timeout: 5s retries: 5 volumes: umami-db-data:[/collapse]确保你的数据库密码等配置信息保持一致。5. 拉取最新镜像docker-compose pull这个命令会从 镜像站拉取最新的 Umami 镜像。6. 重新启动服务docker-compose up -d容器会自动完成数据库迁移和服务启动。7. 查看容器状态docker-compose ps确保所有容器都处于 Up 状态。8. 查看日志如果容器启动失败，可以查看日志排查问题：# 查看 Umami 容器日志 docker-compose logs -f umami # 查看数据库容器日志 docker-compose logs -f db按 Ctrl…

解决AI摘要不显示的三种方案 -AIsummary插件
type: item
date: 2025-09-21T15:18:00+08:00
description: 前言在自定义主题的某天，AI摘要突然不显示了，前前后后改了好几次，通过重启插件无数次、移除全部自定义js和css、关闭pjax、一一恢复改过的页面代码，均未果。这次是通过本文第二个方法改好的，所以至今不知道突然不显示的原因。下面是解决AISummary插件的摘要块不显示的三种方案，前提是摘要内容已正确生成且保存。针对handsome主题，其他主题可借鉴思路。技术环境博客系统: Typecho 1.2.1主题: Handsome 10.1.0插件: AISummary v1.1.0解决方案方案一：修改插件核心逻辑直接修改 Plugin.php 中的 customContent 方法，将摘要插入到内容末尾：// 修改前 $content = $summaryString . $content; // 修改后 $content = $content . $summaryString;方案二：主题模板直接集成（推荐）在主题模板文件中直接添加摘要显示逻辑，绕过插件的 customContent 方法。实施步骤在插件设置中将"正文摘要显示样式"设置为"默认"或者"自定义"，推荐设置为自定义。在主题模板中添加摘要显示代码在 usr/themes/handsome/post.php 第74行的 下方添加：[hide] <?php // 添加AI摘要显示 $options = Typecho_Widget::widget('Widget_Options')->plugin('AISummary'); if ($options->summaryStyle !== '0') { $summaryField = $options->field ?: 'summary'; $db = Typecho_Db::get(); $row = $db->fetchRow($db->select('str_value')->from('table.fields')->where('cid = ?', $this->cid)->where('name = ?', $summaryField)); if ($row && !empty($row['str_value'])) { $pureSummary = str_replace("{{text}}", $row['str_value'], $options->prefix); // 根据插件配置选择样式 if ($options->summaryStyle === '1') { // 使用默认引用样式 $summaryString = ' ' . $pureSummary . ' '; } else if ($options->summaryStyle === '2') { // 使用自定义样式，只添加class，让CSS控制样式 $summaryString = ' ' . $pureSummary . ' '; } else { // 默认样式 $summaryString = ' ' . $pureSummary . ' '; } echo $summaryString; } } ?>[/hide]这种方式不依赖于Typecho的钩子系统，直接在主题模板中添加摘要显示代码。方案三：针对开启了前台Vditor解析方式第一种：1、打开文件：usr/themes/handsome/libs/content/PostContent.php2、找到第382行（大约在第380-385行之间）3、将$content = $obj->text;改为$content = $obj->content;4、保存文件$obj->text是vditor原始的Markdown文本，没有经过任何插件处理$obj->content是经过Typecho插件系统处理后的HTML内容，包括AISummary插件的customContent方法添加的摘要通过使用$obj->content，确保所有插件的钩子都能正常工作第二种：在handsome插件后台切换vidtor为typecho自带的即可下面是自定义模板的文章：[post cid="335" /]

软件工程实践二：Spring Boot 知识回顾
type: item
date: 2025-09-10T09:49:21+08:00
description: 使用 IntelliJ IDEA 创建 Spring Boot Web 项目（仅 Web 依赖）目标：用 IntelliJ IDEA 快速创建只包含 Spring Web 的最小可运行项目，启动后通过浏览器访问 http://localhost:8080/api/hello 返回 JSON。一、创建项目（Spring Boot 向导）步骤说明：打开 IDEA → New Project → 选择 Spring Boot；服务地址保持默认。Project Metadata：Group：如 com.exampleArtifact/Name：如 demoPackaging：jar（默认）Java：17（或本机已安装的 LTS 版本）Build system：Maven（不要选 Gradle）Dependencies：搜索并仅勾选 Spring Web。Finish → 等待 Maven 下载依赖与索引完成。提示：若看不到 Spring Boot(Initializr)，确保安装了 IntelliJ 的 Spring 插件，或使用 File > New > Project... 再选择。二、项目最小代码示例1) 主启动类（IDE 已生成，检查包名与类名）package com.example.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }2) Hello 控制器（新增）package com.example.demo.controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.Date; import java.util.Map; @RestController @RequestMapping("/api") public class HelloController { @GetMapping("/hello") public Map<String, Object> hello() { return Map.of( "msg", "hello", "time", new Date() ); } }3) 应用配置（可选）# src/main/resources/application.yml server: # 如需修改端口，取消注释并调整值 # port: 8080三、运行与验证在 DemoApplication 类左侧点击绿色运行箭头，或使用菜单 Run。控制台看到 Started DemoApplication ... 表示启动成功。浏览器/工具访问：http://localhost:8080/api/hello期望响应示例：{"msg":"hello","time":"2025-01-01T00:00:00Z"}常见问题：端口占用：在 application.yml 配置 server.port: 8081。依赖未下载：检查网络代理或尝试 Reload All Maven Projects。JDK 不匹配：Project Structure > Project/Modules 指定与向导一致的 Java 版本。四、标准目录结构与说明 demo/ ← 工程根目录 ├─ pom.xml ← 构建脚本（Maven） ├─ src │ ├─ main │ │ ├─ java │ │ │ └─ com │ │ │ └─ example │ │ │ └─ demo │ │ │ ├─ DemoApplication.java ← 启动类 │ │ │ └─ controller │ │ │ └─ HelloController.java ← Web 控制器 │ │ └─ resources │ │ ├─ application.yml ← 应用配置 │ │ └─ static/ temp…