<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Qawkhの栖</title><description>在光影和文字之间，留一处适合停靠的小站。</description><link>https://www.qawkh.com/</link><templateTheme>Firefly</templateTheme><templateThemeVersion>6.14.3</templateThemeVersion><templateThemeUrl>https://github.com/CuteLeaf/Firefly</templateThemeUrl><lastBuildDate>2026年7月22日 15:32:58</lastBuildDate><item><title>从空白页到可用成品：Qawkh の栖建站记录</title><link>https://www.qawkh.com/posts/15/</link><guid isPermaLink="true">https://www.qawkh.com/posts/15/</guid><description>记录 Qawkh の栖 从零开始搭建的过程，包括技术选型、项目结构、核心模块与实现思路。</description><pubDate>Tue, 30 Jun 2026 09:22:58 GMT</pubDate><content:encoded>&lt;h1&gt;从空白页到可用成品：Qawkh の栖建站记录&lt;/h1&gt;
&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;折腾了快半个月，&lt;code&gt;Qawkh の栖&lt;/code&gt; 终于从一个空白页面，慢慢长成了现在这个样子。&lt;/p&gt;
&lt;p&gt;回头看，这个过程其实比一开始想的要复杂得多。前台页面要好看、后台要能管内容、接口要稳定、上传要能跑、主题切换和夜间模式要统一、留言、音乐、照片墙、万年历这些模块也都得一点点接起来。单独拎出来看，每一块都不算特别夸张，但真正把它们拼成一个完整的网站，细节是真的很多。&lt;/p&gt;
&lt;p&gt;这篇文章就当作一次阶段性记录。主要想聊聊这个博客目前用了什么框架、什么语言、什么组件库，以及整个项目是怎么拆分、怎么实现、怎么一点点补齐功能的。如果你也想做一个属于自己的个人博客，希望这篇记录能给你一些参考。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;技术栈一览&lt;/h2&gt;
&lt;p&gt;先放目前这个项目真实在用的一套技术栈。&lt;/p&gt;






































































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;层级&lt;/th&gt;&lt;th&gt;我使用的技术&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;站点前台&lt;/td&gt;&lt;td&gt;Vue 3 + TypeScript + Vite&lt;/td&gt;&lt;td&gt;采用 Composition API，开发体验轻快，适合组件化页面组织&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;路由与状态&lt;/td&gt;&lt;td&gt;Vue Router + Pinia&lt;/td&gt;&lt;td&gt;负责页面导航、全局状态和交互联动&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;后端服务&lt;/td&gt;&lt;td&gt;Spring Boot 3 + Java 21&lt;/td&gt;&lt;td&gt;提供 REST API、业务逻辑与后台能力&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;数据访问&lt;/td&gt;&lt;td&gt;MyBatis + MySQL&lt;/td&gt;&lt;td&gt;负责内容数据存储与查询&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;鉴权方案&lt;/td&gt;&lt;td&gt;JWT&lt;/td&gt;&lt;td&gt;后台登录与接口访问控制&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;参数校验&lt;/td&gt;&lt;td&gt;Spring Validation&lt;/td&gt;&lt;td&gt;用于表单与接口参数校验&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;接口文档&lt;/td&gt;&lt;td&gt;Knife4j / OpenAPI&lt;/td&gt;&lt;td&gt;便于联调和接口管理&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;管理后台&lt;/td&gt;&lt;td&gt;vue-pure-admin + Vue 3 + Element Plus&lt;/td&gt;&lt;td&gt;快速搭建后台内容管理系统&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;对象存储&lt;/td&gt;&lt;td&gt;阿里云 OSS&lt;/td&gt;&lt;td&gt;存储图片、封面和其他上传资源&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;评论系统&lt;/td&gt;&lt;td&gt;Waline&lt;/td&gt;&lt;td&gt;用于留言板互动&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;功能组件&lt;/td&gt;&lt;td&gt;lunar-javascript、highlight.js、GSAP&lt;/td&gt;&lt;td&gt;农历黄历、代码高亮、页面动效&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;特色模块&lt;/td&gt;&lt;td&gt;Live2D&lt;/td&gt;&lt;td&gt;看板娘、欢迎语与互动效果&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;简单概括一下，就是：&lt;/p&gt;
&lt;p&gt;我这次没有走 SSR 那套路线，而是选择了更适合当前开发节奏的前后端分离方案。前台专注页面和交互，后端专注接口和数据，后台专注内容管理，各自做自己最擅长的那部分。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;为什么这么选&lt;/h2&gt;
&lt;p&gt;技术栈这件事，说到底还是看项目目标和开发习惯。&lt;/p&gt;
&lt;h3&gt;前台为什么用 Vue 3&lt;/h3&gt;
&lt;p&gt;前台我使用的是 &lt;code&gt;Vue 3 + TypeScript + Vite&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;原因很直接：这一套我比较熟，也确实适合做这种页面多、卡片多、细节多、交互也不少的个人博客。像首页信息卡片、文章页、说说、照片墙、留言、个人中心、万年历这些模块，彼此之间结构独立，但又需要统一风格和状态联动，用 Vue 3 的 Composition API 来拆分会很自然。&lt;/p&gt;
&lt;p&gt;TypeScript 的价值也很明显。接口字段、组件 props、工具函数、状态结构都能有更清楚的约束，联调的时候会少踩很多低级坑。&lt;/p&gt;
&lt;p&gt;而 Vite 的优点就是轻和快。开发时热更新足够及时，打包也直接，对这种前端页面驱动型项目来说，体验非常舒服。&lt;/p&gt;
&lt;h3&gt;后端为什么用 Spring Boot&lt;/h3&gt;
&lt;p&gt;后端我使用的是 &lt;code&gt;Spring Boot 3 + Java 21 + MyBatis + MySQL&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;这一套的优点主要是稳定、成熟、好维护。博客虽然不是一个超高并发项目，但它的数据类型并不少：文章、分类、公告、说说、照片墙、收藏夹、音乐、背景图、留言配置、关于页、特殊日期、上传资源……这些内容都需要比较稳定的 CRUD 和清晰的业务边界。&lt;/p&gt;
&lt;p&gt;Spring Boot 负责整体框架能力，MyBatis 负责数据访问，MySQL 负责持久化存储。这样搭起来很踏实，也方便后续继续扩展管理功能。&lt;/p&gt;
&lt;h3&gt;后台为什么直接用 vue-pure-admin&lt;/h3&gt;
&lt;p&gt;后台我没有自己从零造，而是基于 &lt;code&gt;vue-pure-admin&lt;/code&gt; 做二次开发。&lt;/p&gt;
&lt;p&gt;原因也很现实：后台不是最值得重复造轮子的地方。像登录、菜单、路由、标签页、表格、分页、表单、弹窗这些通用能力，现成成熟模板已经做得很好了。直接拿来裁剪和改造，可以把时间省下来用在真正属于这个博客的功能上。&lt;/p&gt;
&lt;p&gt;对我来说，最合适的方案不是“全都自己写”，而是“该自己写的认真写，不该重复造的就少造一点”。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;项目结构&lt;/h2&gt;
&lt;p&gt;目前整个项目主要分成三部分：站点前台、后端服务、管理后台。&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;qawkh-blog/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── qawkh-studio/                  # 博客前台&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   ├── src/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   │   ├── views/                 # 页面视图&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   │   ├── components/            # 公共组件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   │   ├── api/                   # 前端接口封装&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   │   ├── router/                # 路由配置&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   │   ├── utils/                 # 工具函数&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   │   └── types/                 # TypeScript 类型声明&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   ├── public/                    # 静态资源&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   └── package.json&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── qawkh-server/                  # Spring Boot 后端&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   ├── src/main/java/com/qawkh/server/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   │   ├── controller/            # 控制器层&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   │   ├── service/               # 业务逻辑层&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   │   ├── mapper/                # MyBatis 映射层&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   │   ├── domain/entity/         # 实体类&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   │   ├── model/dto/             # 请求 DTO&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   │   ├── model/vo/              # 返回 VO&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   │   └── config/                # 配置类&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   ├── src/main/resources/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   │   ├── application.yml        # 后端配置&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   │   └── db/schema.sql          # 初始化 SQL&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   └── pom.xml&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;└── pure-admin-thin-i18n/          # 管理后台&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;├── src/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│   ├── views/                 # 后台页面&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│   ├── api/                   # API 调用封装&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;31&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│   ├── router/                # 后台路由&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;32&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│   └── store/                 # Pinia 状态管理&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;33&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;└── package.json&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;整个结构是比较标准的前后端分离：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;qawkh-studio&lt;/code&gt; 负责博客前台展示&lt;/li&gt;
&lt;li&gt;&lt;code&gt;qawkh-server&lt;/code&gt; 负责接口、数据、鉴权、上传等后端能力&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pure-admin-thin-i18n&lt;/code&gt; 负责后台内容管理&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;三部分之间通过 API 通信，职责边界比较清楚。这样后续无论是加功能还是改页面，都不会互相缠得太死。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;前端：我使用了什么框架、语言和组件&lt;/h2&gt;
&lt;h3&gt;核心框架和语言&lt;/h3&gt;
&lt;p&gt;前台核心使用的是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Vue 3&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;TypeScript&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Vite&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Vue Router&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Pinia&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Vue 3 负责页面渲染和组件组织，TypeScript 负责类型约束，Vite 负责开发和构建，Vue Router 负责路由切换，Pinia 负责全局状态。&lt;/p&gt;
&lt;p&gt;这种组合最大的好处就是“清晰”。页面逻辑、组件逻辑、数据逻辑、路由逻辑分层比较自然，代码不会很快陷入混乱。&lt;/p&gt;
&lt;h3&gt;前台页面模块&lt;/h3&gt;
&lt;p&gt;目前前台已经完成或接入的页面主要有：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;首页&lt;/li&gt;
&lt;li&gt;文章列表&lt;/li&gt;
&lt;li&gt;文章详情&lt;/li&gt;
&lt;li&gt;说说&lt;/li&gt;
&lt;li&gt;留言板&lt;/li&gt;
&lt;li&gt;收藏夹&lt;/li&gt;
&lt;li&gt;照片墙&lt;/li&gt;
&lt;li&gt;万年历&lt;/li&gt;
&lt;li&gt;归档&lt;/li&gt;
&lt;li&gt;个人中心&lt;/li&gt;
&lt;li&gt;关于页&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这些页面不是靠一个大组件硬撑出来的，而是按功能拆成了很多独立模块，这样后面迭代起来更轻松。&lt;/p&gt;
&lt;h3&gt;我用到的前台功能组件&lt;/h3&gt;
&lt;p&gt;这个博客里前台组件数量不少，比较有代表性的有：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;HomeBeijingTimeCard&lt;/code&gt;：北京时间卡片&lt;/li&gt;
&lt;li&gt;&lt;code&gt;HomeWeatherCard&lt;/code&gt;：天气卡片&lt;/li&gt;
&lt;li&gt;&lt;code&gt;HomeSpecialDateCalendarCard&lt;/code&gt;：首页特殊日期 / 节日卡片&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GlobalMusicPlayer&lt;/code&gt;：全局音乐播放器&lt;/li&gt;
&lt;li&gt;&lt;code&gt;QuickAgeCalculatorPanel&lt;/code&gt;：年龄计算工具&lt;/li&gt;
&lt;li&gt;&lt;code&gt;QuickLunarConverterPanel&lt;/code&gt;：农历转换工具&lt;/li&gt;
&lt;li&gt;&lt;code&gt;QuickMetabolismPanel&lt;/code&gt;：基础代谢计算工具&lt;/li&gt;
&lt;li&gt;&lt;code&gt;AppIcon&lt;/code&gt;：统一图标组件&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这些组件本质上都是围绕“首页信息展示”和“轻量工具增强”来做的。相比一个只有文章列表的普通博客，我更希望它看起来像一个真正有内容、有交互、有生活感的个人空间。&lt;/p&gt;
&lt;h3&gt;文章渲染和代码高亮&lt;/h3&gt;
&lt;p&gt;文章详情页支持 Markdown 内容展示，代码高亮使用的是 &lt;code&gt;highlight.js&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;这部分的好处很明显：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;技术文章可以更自然地写代码块&lt;/li&gt;
&lt;li&gt;阅读体验比纯文本好很多&lt;/li&gt;
&lt;li&gt;后续扩展语言支持也比较方便&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;对于技术博客来说，代码高亮几乎算是基础设施。&lt;/p&gt;
&lt;h3&gt;留言板评论系统&lt;/h3&gt;
&lt;p&gt;留言页使用的是 &lt;code&gt;Waline&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;我选择它主要是因为接入简单、交互完整，而且和个人博客这种场景非常契合。对于一个需要评论和互动的页面来说，自己从零写评论系统并不划算，能稳定用现成方案就够了。&lt;/p&gt;
&lt;h3&gt;万年历和农历黄历&lt;/h3&gt;
&lt;p&gt;万年历页面使用的是 &lt;code&gt;lunar-javascript&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;这个库主要帮我解决了这些问题：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;公历转农历&lt;/li&gt;
&lt;li&gt;节气识别&lt;/li&gt;
&lt;li&gt;公历节日和农历节日识别&lt;/li&gt;
&lt;li&gt;干支、生肖、彭祖、星宿等黄历信息展示&lt;/li&gt;
&lt;li&gt;宜忌信息计算&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这个模块是站点里辨识度比较高的一块。它不仅仅是一个简单日期面板，而是尽量做成一个完整可用的“月历 + 详情 + 黄历信息”页面。&lt;/p&gt;
&lt;h3&gt;动效与视觉增强&lt;/h3&gt;
&lt;p&gt;在前台视觉层面，我还用了这些能力：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;GSAP&lt;/code&gt;：用于部分动效和过渡处理&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Live2D&lt;/code&gt;：右下角看板娘、模型切换和欢迎语&lt;/li&gt;
&lt;li&gt;自定义卡片样式、主题切换、夜间模式适配&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这些东西单独看都不算决定性功能，但组合在一起之后，确实能让页面更有质感，也更像一个“自己的站”。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;后端：我使用了什么框架、语言和服务&lt;/h2&gt;
&lt;h3&gt;核心框架和语言&lt;/h3&gt;
&lt;p&gt;后端主要使用的是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Spring Boot 3.3.6&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Java 21&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;MyBatis&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;MySQL&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;其中 Spring Boot 负责搭框架和接口能力，MyBatis 负责数据库访问，MySQL 负责数据存储。&lt;/p&gt;
&lt;h3&gt;我在后端做了哪些模块&lt;/h3&gt;
&lt;p&gt;目前后端已经拆分出比较完整的内容模块，包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;文章管理&lt;/li&gt;
&lt;li&gt;文章分类管理&lt;/li&gt;
&lt;li&gt;公告管理&lt;/li&gt;
&lt;li&gt;关于页信息管理&lt;/li&gt;
&lt;li&gt;说说管理&lt;/li&gt;
&lt;li&gt;照片墙分类与照片管理&lt;/li&gt;
&lt;li&gt;收藏夹分类与收藏项管理&lt;/li&gt;
&lt;li&gt;音乐歌曲管理&lt;/li&gt;
&lt;li&gt;站点背景图管理&lt;/li&gt;
&lt;li&gt;特殊日期管理&lt;/li&gt;
&lt;li&gt;留言板配置管理&lt;/li&gt;
&lt;li&gt;文件上传&lt;/li&gt;
&lt;li&gt;后台登录鉴权&lt;/li&gt;
&lt;li&gt;前台天气接口&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;接口层我按前台和后台分别做了拆分，比如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;前台接口使用 &lt;code&gt;User*Controller&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;后台接口使用 &lt;code&gt;Admin*Controller&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这样做的好处是边界很清楚：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;前台只拿展示所需的数据&lt;/li&gt;
&lt;li&gt;后台只做管理和编辑所需的能力&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;不会把管理逻辑和展示逻辑混成一锅。&lt;/p&gt;
&lt;h3&gt;数据结构和代码组织&lt;/h3&gt;
&lt;p&gt;后端这一层我基本按照常见的分层方式来组织：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;entity&lt;/code&gt;：数据库实体&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dto&lt;/code&gt;：请求参数对象&lt;/li&gt;
&lt;li&gt;&lt;code&gt;vo&lt;/code&gt;：返回结果对象&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mapper&lt;/code&gt;：数据库访问层&lt;/li&gt;
&lt;li&gt;&lt;code&gt;service&lt;/code&gt;：业务逻辑层&lt;/li&gt;
&lt;li&gt;&lt;code&gt;controller&lt;/code&gt;：接口控制层&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这种写法虽然类会多一些，但业务清晰、职责分明。等模块慢慢变多以后，这种结构的好处会越来越明显。&lt;/p&gt;
&lt;h3&gt;鉴权、校验和接口文档&lt;/h3&gt;
&lt;p&gt;后台鉴权这块，我使用的是 &lt;code&gt;JWT&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;登录成功后生成 token，后续后台接口携带 token 访问，服务端负责解析和校验。对个人博客后台来说，这已经是一套足够实用的方案。&lt;/p&gt;
&lt;p&gt;参数校验我使用的是 &lt;code&gt;Spring Validation&lt;/code&gt;，主要负责：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;必填项校验&lt;/li&gt;
&lt;li&gt;长度范围校验&lt;/li&gt;
&lt;li&gt;基本格式校验&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;接口文档我接入了 &lt;code&gt;Knife4j / OpenAPI&lt;/code&gt;，这样联调的时候会方便很多，也更容易统一管理接口。&lt;/p&gt;
&lt;h3&gt;文件上传和对象存储&lt;/h3&gt;
&lt;p&gt;文件上传这块，我接入的是 &lt;code&gt;阿里云 OSS&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;目前它主要负责这些资源：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;文章封面&lt;/li&gt;
&lt;li&gt;照片墙图片&lt;/li&gt;
&lt;li&gt;站点背景图&lt;/li&gt;
&lt;li&gt;其他媒体资源&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这样做最大的好处就是不用把所有文件都压在服务器本地磁盘上，资源管理和后续迁移都会更轻松一些。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;管理后台：我使用了什么后台框架和组件库&lt;/h2&gt;
&lt;p&gt;后台项目我使用的是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;vue-pure-admin&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Vue 3&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;TypeScript&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Vite&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Element Plus&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Pinia&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这套东西本身就很适合做管理系统，特别是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;表格&lt;/li&gt;
&lt;li&gt;表单&lt;/li&gt;
&lt;li&gt;分页&lt;/li&gt;
&lt;li&gt;弹窗&lt;/li&gt;
&lt;li&gt;菜单路由&lt;/li&gt;
&lt;li&gt;登录页&lt;/li&gt;
&lt;li&gt;标签页&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这些内容如果全都自己写，成本其实不低。直接基于成熟后台模板做裁剪和扩展，效率会高很多。&lt;/p&gt;
&lt;h3&gt;后台目前已经支持的内容管理&lt;/h3&gt;
&lt;p&gt;我在后台里主要做了这些模块：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;文章管理&lt;/li&gt;
&lt;li&gt;文章分类管理&lt;/li&gt;
&lt;li&gt;公告管理&lt;/li&gt;
&lt;li&gt;说说管理&lt;/li&gt;
&lt;li&gt;照片墙分类管理&lt;/li&gt;
&lt;li&gt;照片墙图片管理&lt;/li&gt;
&lt;li&gt;收藏夹分类与条目管理&lt;/li&gt;
&lt;li&gt;音乐管理&lt;/li&gt;
&lt;li&gt;关于页信息管理&lt;/li&gt;
&lt;li&gt;留言板设置管理&lt;/li&gt;
&lt;li&gt;站点背景图管理&lt;/li&gt;
&lt;li&gt;特殊日期管理&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;数据量稍大一点的列表页，也都尽量做了服务端分页，不至于后面数据一多就直接卡成表格坟场。&lt;/p&gt;
&lt;p&gt;后台这部分最大的价值，不是“页面有多炫”，而是它真的能让我把站点内容管理起来，而不是所有信息都写死在前端代码里。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;这个博客里比较有意思的功能&lt;/h2&gt;
&lt;p&gt;除了常规的文章和后台管理，这个项目里我自己比较喜欢的模块还有几个。&lt;/p&gt;
&lt;h3&gt;1. 首页信息卡片&lt;/h3&gt;
&lt;p&gt;首页不只是放一排文章，而是做了多个信息卡片：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;北京时间&lt;/li&gt;
&lt;li&gt;天气&lt;/li&gt;
&lt;li&gt;节日 / 特殊日期&lt;/li&gt;
&lt;li&gt;音乐模块&lt;/li&gt;
&lt;li&gt;公告内容&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这样首页不至于显得过空，也更有“个人站点首页”的感觉，而不是单纯的内容列表页。&lt;/p&gt;
&lt;h3&gt;2. 个人中心&lt;/h3&gt;
&lt;p&gt;个人中心页不只是一个简短的 About，而是集中展示了：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;头像和封面&lt;/li&gt;
&lt;li&gt;建站初衷&lt;/li&gt;
&lt;li&gt;兴趣日常&lt;/li&gt;
&lt;li&gt;个人简介&lt;/li&gt;
&lt;li&gt;页面跳转入口&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;它更像一个完整的个人展示页，而不是仅仅“补一个资料页”。&lt;/p&gt;
&lt;h3&gt;3. 照片墙&lt;/h3&gt;
&lt;p&gt;照片墙模块除了分类展示外，也做了大图预览和更偏展示型的布局。对个人博客来说，图片本身也是内容的一部分，不应该只是一个冷冰冰的管理列表映射页。&lt;/p&gt;
&lt;h3&gt;4. 万年历&lt;/h3&gt;
&lt;p&gt;万年历是目前站里功能性比较强的页面之一。它不是简单做个日期选择器就结束，而是把农历、节气、节日、宜忌和黄历详情都整合到了一个页面里，实用性和辨识度都还不错。&lt;/p&gt;
&lt;h3&gt;5. Live2D 看板娘&lt;/h3&gt;
&lt;p&gt;右下角的看板娘属于很典型的“没那么必要，但确实很有趣”的功能。&lt;/p&gt;
&lt;p&gt;它目前支持：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;模型切换&lt;/li&gt;
&lt;li&gt;大小切换&lt;/li&gt;
&lt;li&gt;页面欢迎语&lt;/li&gt;
&lt;li&gt;点击互动&lt;/li&gt;
&lt;li&gt;位置记忆&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;对个人博客来说，这种小东西往往就是“个人风格”的一部分。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;一路做下来的一些感受&lt;/h2&gt;
&lt;p&gt;做这个博客过程中，我最大的感受其实是：&lt;/p&gt;
&lt;p&gt;真正花时间的，往往不是把某个功能“做出来”，而是把它“做顺眼、做完整、做统一”。&lt;/p&gt;
&lt;p&gt;比如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;页面白天和夜间模式是否统一&lt;/li&gt;
&lt;li&gt;留言区和正文区是不是都清楚可读&lt;/li&gt;
&lt;li&gt;卡片之间的风格是否一致&lt;/li&gt;
&lt;li&gt;后台改完内容后，前台是否真的能接住&lt;/li&gt;
&lt;li&gt;图片、音乐、特殊日期这些动态内容有没有真正从后台管理起来&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这些事情每一件都不算惊天动地，但恰恰是它们堆起来，最后才决定这个站点看起来像不像一个完整产品。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;结语&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;Qawkh の栖&lt;/code&gt; 到现在当然还远远算不上“彻底完成”，但至少它已经从一个空白页，走到了一个能看、能用、能继续迭代的阶段。&lt;/p&gt;
&lt;p&gt;前台有了完整的页面结构，后端有了比较清晰的业务模块，后台也已经能真正接管内容维护。剩下的工作，不再是“从零开始”，而是继续把细节补得更完整，把体验做得更统一。&lt;/p&gt;
&lt;p&gt;如果你也想做一个自己的博客，或者正在准备做一个前后端分离的小项目，我觉得最重要的不是一开始就追求多复杂的技术栈，而是先把结构搭稳，再一步步把内容、功能和细节补上。&lt;/p&gt;
&lt;p&gt;技术栈从来没有唯一正确答案，最适合自己的，才是最值得一直做下去的那一套。&lt;/p&gt;
&lt;p&gt;如果后面我继续给这个博客加更多模块，应该还会再写一篇，把后续的实现细节和踩坑记录继续补上。&lt;/p&gt;</content:encoded></item><item><title>不知道说什么嘀嘀嘀</title><link>https://www.qawkh.com/posts/3/</link><guid isPermaLink="true">https://www.qawkh.com/posts/3/</guid><description>管理iiiiiiiiiiiiiiiiiihi皮hi和公路Gigi屁股篇</description><pubDate>Tue, 02 Jun 2026 09:18:58 GMT</pubDate><content:encoded>&lt;h1&gt;到底说了说明&lt;/h1&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;message&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;hello&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;img src=&quot;https://java-aierp.oss-cn-beijing.aliyuncs.com/articles/content/2026/06/02/09fef97ef194430b91c6f1b2ae66ce07.png&quot; alt=&quot;19&quot; /&gt;
付款要分开有有有有有有有有有有有有由于放映空间急急急急急急急急急急急急急急急&lt;/p&gt;</content:encoded></item><item><title>123456</title><link>https://www.qawkh.com/posts/16/</link><guid isPermaLink="true">https://www.qawkh.com/posts/16/</guid><pubDate>Sat, 18 Jul 2026 11:02:22 GMT</pubDate><content:encoded>&lt;p&gt;案说法分为&lt;/p&gt;</content:encoded></item><item><title>11</title><link>https://www.qawkh.com/posts/14/</link><guid isPermaLink="true">https://www.qawkh.com/posts/14/</guid><pubDate>Thu, 18 Jun 2026 08:02:40 GMT</pubDate><content:encoded>&lt;p&gt;afwafwawf&lt;/p&gt;</content:encoded></item><item><title>Nginx常用命令</title><link>https://www.qawkh.com/posts/13/</link><guid isPermaLink="true">https://www.qawkh.com/posts/13/</guid><pubDate>Thu, 11 Jun 2026 09:11:07 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;进入 nginx 目录中: cd /usr/local/nginx/sbin&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;1、查看nginx版本号&lt;/h3&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;./nginx -v&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h3&gt;&lt;strong&gt;2、启动 nginx&lt;/strong&gt;&lt;/h3&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;./nginx&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;查看是否启动成功：ps -ef|grep nginx
&lt;img src=&quot;https://java-aierp.oss-cn-beijing.aliyuncs.com/articles/content/2026/06/11/0d69564219b74f2fad40602aceb44d66.png&quot; alt=&quot;4.png&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;3、停止 nginx&lt;/h3&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;./nginx&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h3&gt;4、重新加载 nginx&lt;/h3&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;./nginx -s reload&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h2&gt;三、nginx.conf配置文件&lt;/h2&gt;
&lt;h3&gt;1、位置&lt;/h3&gt;
&lt;p&gt;vim /usr/local/nginx/conf/nginx.conf&lt;/p&gt;
&lt;h3&gt;2、配置文件中的内容（包含三部分）&lt;/h3&gt;
&lt;h3&gt;（1）全局块：配置服务器整体运行的配置指令&lt;/h3&gt;
&lt;p&gt;从配置文件开始到 events 块之间的内容，主要会设置一些影响 nginx 服务器整体运行的配置指令，主要包括配&lt;/p&gt;
&lt;p&gt;置运行 Nginx 服务器的用户（组）、允许生成的 worker process 数，进程 PID 存放路径、日志存放路径和类型以&lt;/p&gt;
&lt;p&gt;及配置文件的引入等。&lt;/p&gt;
&lt;p&gt;比如上面第一行配置的：&lt;/p&gt;
&lt;p&gt;这是 Nginx 服务器并发处理服务的关键配置，worker_processes 值越大，可以支持的并发处理量也越多，但是&lt;/p&gt;
&lt;p&gt;会受到硬件、软件等设备的制约&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://java-aierp.oss-cn-beijing.aliyuncs.com/articles/content/2026/06/11/75b1a0e3588f44279bb007ae12506b30.png&quot; alt=&quot;5.png&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;（2）events 块：影响 Nginx 服务器与用户的网络连接&lt;/h3&gt;
&lt;p&gt;events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接，常用的设置包括是否开启对多 work process&lt;/p&gt;
&lt;p&gt;下的网络连接进行序列化，是否允许同时接收多个网络连接，选取哪种事件驱动模型来处理连接请求，每个 word&lt;/p&gt;
&lt;p&gt;process 可以同时支持的最大连接数等。&lt;/p&gt;
&lt;p&gt;上述例子就表示每个 work process 支持的最大连接数为 1024.&lt;/p&gt;
&lt;p&gt;这部分的配置对 Nginx 的性能影响较大，在实际中应该灵活配置。
&lt;img src=&quot;https://java-aierp.oss-cn-beijing.aliyuncs.com/articles/content/2026/06/11/8ee1ab621c27494e94cb5d6798b372c4.png&quot; alt=&quot;6.png&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;（3）http 块&lt;/h3&gt;
&lt;p&gt;这算是 Nginx 服务器配置中最频繁的部分，代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。&lt;/p&gt;
&lt;p&gt;需要注意的是：http 块也可以包括 http 全局块、server 块。
&lt;img src=&quot;https://java-aierp.oss-cn-beijing.aliyuncs.com/articles/content/2026/06/11/3a45e38f5a084c26bdc825a6f4a87069.jpg&quot; alt=&quot;Snipaste_20260611_163357.jpg&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;①、http 全局块&lt;/h4&gt;
&lt;p&gt;http 全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。
&lt;img src=&quot;https://java-aierp.oss-cn-beijing.aliyuncs.com/articles/content/2026/06/11/f77ed9a8794043ae8476b930e1c7f3d5.png&quot; alt=&quot;7.png&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;②、server 块&lt;/h4&gt;
&lt;p&gt;这块和虚拟主机有密切关系，虚拟主机从用户角度看，和一台独立的硬件主机是完全一样的，该技术的产生是为了&lt;/p&gt;
&lt;p&gt;节省互联网服务器硬件成本。&lt;/p&gt;
&lt;p&gt;每个 http 块可以包括多个 server 块，而每个 server 块就相当于一个虚拟主机。&lt;/p&gt;
&lt;p&gt;而每个 server 块也分为全局 server 块，以及可以同时包含多个 locaton 块。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://java-aierp.oss-cn-beijing.aliyuncs.com/articles/content/2026/06/11/a0da29c5d84345049c2078b33b3697a0.png&quot; alt=&quot;8.png&quot; /&gt;&lt;/p&gt;
&lt;h5&gt;全局 server 块&lt;/h5&gt;
&lt;p&gt;最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或 IP 配置。&lt;/p&gt;
&lt;h5&gt;location 块&lt;/h5&gt;
&lt;p&gt;一个 server 块可以配置多个 location 块。&lt;/p&gt;
&lt;p&gt;这块的主要作用是基于 Nginx 服务器接收到的请求字符串（例如 server_name/uri-string），对虚拟主机名称&lt;/p&gt;
&lt;p&gt;（也可以是 IP 别名）之外的字符串（例如 前面的 /uri-string）进行匹配，对特定的请求进行处理。地址定向、数据缓&lt;/p&gt;
&lt;p&gt;存和应答控制等功能，还有许多第三方模块的配置也在这里进行。&lt;/p&gt;</content:encoded></item><item><title>安装Nginx</title><link>https://www.qawkh.com/posts/12/</link><guid isPermaLink="true">https://www.qawkh.com/posts/12/</guid><pubDate>Thu, 11 Jun 2026 08:57:31 GMT</pubDate><content:encoded>&lt;h2&gt;安装Nginx&lt;/h2&gt;
&lt;h3&gt;1、准备工作&lt;/h3&gt;
&lt;p&gt;（1）打开虚拟机，使用远程连接工具连接 linux 操作系统&lt;/p&gt;
&lt;p&gt;（2）到 nginx 官网下载软件&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://nginx.org/&quot;&gt;http://nginx.org/&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;2、开始进行 nginx 安装&lt;/h3&gt;
&lt;h4&gt;&lt;strong&gt;（1）安装 pcre 依赖&lt;/strong&gt;&lt;/h4&gt;
&lt;h6&gt;第一步 联网下载 pcre 压缩文件依赖&lt;/h6&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;wget http://downloads.sourceforge.net/project/pcre/pcre/8.37/pcre-8.37.tar.gz&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h6&gt;第二步 解压压缩文件&lt;/h6&gt;
&lt;p&gt;使用命令 tar –xvf pcre-8.37.tar.gz&lt;/p&gt;
&lt;h6&gt;第三步./configure 完成后，回到 pcre 目录下执行 make，最后执行 make install&lt;/h6&gt;
&lt;p&gt;查看pcre依赖是否安装成功：pcre-config —version&lt;/p&gt;
&lt;h5&gt;&lt;strong&gt;（2）安装 openssl 、zlib 、 gcc 依赖&lt;/strong&gt;&lt;/h5&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h5&gt;（3）安装 nginx&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;使用命令解压&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;* ./configure&lt;/p&gt;
&lt;p&gt;* make &amp;amp;&amp;amp; make install&lt;/p&gt;
&lt;p&gt;进入目录 /usr/local/nginx/sbin/nginx 启动服务&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;安装后，不能访问的，需要对防火墙进行设置&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;也可以直接关闭防火墙，并防止自启(在练习模式中)&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;//关闭防火墙&amp;amp;&amp;amp;防火墙自启&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;​&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;systemctl stop firewalld &amp;amp;&amp;amp; systemctl disable firewalld&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;​&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;//安装Iptables管理工具&amp;amp;&amp;amp;启动Iptables&amp;amp;&amp;amp;设为Iptables开机自启&amp;amp;&amp;amp;清空Iptables规则&amp;amp;&amp;amp;保存Iptables默认规则&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;​&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;yum -y install iptables-services &amp;amp;&amp;amp; systemctl start iptables &amp;amp;&amp;amp; systemctl enable iptables&amp;amp;&amp;amp; iptables -F &amp;amp;&amp;amp; service iptables save&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;①　查看开放的端口&lt;/p&gt;
&lt;p&gt;firewall-cmd —list-all
&lt;img src=&quot;https://java-aierp.oss-cn-beijing.aliyuncs.com/articles/content/2026/06/11/1887f62b18a840dab453a6eaaf70d1eb.png&quot; alt=&quot;1455597201910291025538201653097356.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;②　设置开放的端口号&lt;/p&gt;
&lt;p&gt;firewall-cmd —add-service=http –permanent&lt;/p&gt;
&lt;p&gt;firewall-cmd —add-port=80/tcp —permanent&lt;/p&gt;
&lt;p&gt;③　设置之后需要重启防火墙
&lt;img src=&quot;https://java-aierp.oss-cn-beijing.aliyuncs.com/articles/content/2026/06/11/94c6db0660004f8d9b824f60ec4120ef.png&quot; alt=&quot;1455597201910291026105201568314025.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;④　访问成功
&lt;img src=&quot;https://java-aierp.oss-cn-beijing.aliyuncs.com/articles/content/2026/06/11/37398e2645834054ab51bf7e51167033.png&quot; alt=&quot;3.png&quot; /&gt;&lt;/p&gt;</content:encoded></item><item><title>Nginx简介</title><link>https://www.qawkh.com/posts/11/</link><guid isPermaLink="true">https://www.qawkh.com/posts/11/</guid><description>Nginx(&quot;engine x”)是一个高性能的HTTP和反向代理服务器，特点是占有内存少，并发能力强，事实上nginx的并发能力确实在同类型的网页服务器中表现较好。</description><pubDate>Thu, 11 Jun 2026 08:40:43 GMT</pubDate><content:encoded>&lt;h2&gt;Nginx简介&lt;/h2&gt;
&lt;h3&gt;1.什么是nginx&lt;/h3&gt;
&lt;p&gt;Nginx(“engine x”)是一个高性能的HTTP和反向代理服务器，特点是占有内存少，并发能力强，事实上nginx的并发能力确实在同类型的网页服务器中表现较好。Nginx专为性能优化而开发，性能是其最重要的考量，实现上非常注重效率，能经受高负载的考验，有报告表明能支持高达 50，000个并发连接数。&lt;/p&gt;
&lt;h3&gt;2.反向代理&lt;/h3&gt;
&lt;h4&gt;（1）正向代理&lt;/h4&gt;
&lt;p&gt;Nginx不仅可以做反向代理，实现负载均衡。还能用作正向代理来进行上网等功能。正向代理:如果把局域网外的Intemet想象成一个巨大的资源库，则局域网中的客户端要访问Internet，则需要通过代理服务器来访问，这种代理服务就称为正向代理。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;内网电脑没法直接上网，&lt;strong&gt;借助代理服务器访问外网&lt;/strong&gt;，外网看不到真实客户端。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;（2）反向代理&lt;/h4&gt;
&lt;p&gt;反向代理，其实客户端对代理是无感知的，因为客户端不需要任何配置就可以访问，我们只需要将请求发送到反向代理服务器，由反向代理服务器去选择目标服务器获取数据后，在返回给客户端，此时反向代理服务器和目标服务器对外就是一个服务器，暴露的是代理服务器地址，隐藏了真实服务器IP地址。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;简单说：用户只管访问&lt;strong&gt;代理服务器&lt;/strong&gt;，完全不知道背后还有真正的业务服务器。代理帮你转发请求、拿数据再回传给你，&lt;strong&gt;真实服务器地址被藏起来了&lt;/strong&gt;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;（3）正向反向代理区别&lt;/h4&gt;
&lt;p&gt;用通俗的话+核心区别帮你分清，好记好用：&lt;/p&gt;
&lt;h3&gt;一、一句话总结&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;正向代理&lt;/strong&gt;：&lt;strong&gt;替客户端干活&lt;/strong&gt;，隐藏&lt;strong&gt;用户&lt;/strong&gt;用户→代理→外网服务器，服务器不知道真正访问的是谁。例：翻墙、局域网统一上网。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;反向代理&lt;/strong&gt;：&lt;strong&gt;替服务器干活&lt;/strong&gt;，隐藏&lt;strong&gt;后端服务&lt;/strong&gt;用户→代理→真实业务服务器，用户不知道后端真实地址。例：网站、项目部署用的Nginx反向代理。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h3&gt;二、核心对比&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;访问目标正向：访问&lt;strong&gt;外网资源&lt;/strong&gt;反向：访问&lt;strong&gt;内部业务服务&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;隐藏对象正向：隐藏&lt;strong&gt;客户端IP&lt;/strong&gt;反向：隐藏&lt;strong&gt;服务端IP&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;配置方正向：&lt;strong&gt;客户端&lt;/strong&gt;要指定代理地址反向：&lt;strong&gt;服务端&lt;/strong&gt;配置，客户端无感知&lt;/li&gt;
&lt;li&gt;典型用途正向：内网上网、网络加速、翻墙反向：负载均衡、动静分离、隐藏后端服务、网站分发&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3.负载均衡&lt;/h3&gt;
&lt;p&gt;单个服务器解决不了，我们增加服务器的数量，然后将请求分发到各个服务器上，将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上，将负载分发到不同的服务器，也就是我们所说的负载均衡&lt;/p&gt;
&lt;p&gt;例如&lt;/p&gt;
&lt;p&gt;不一定非要&lt;strong&gt;多买物理服务器&lt;/strong&gt;，分几种情况，结合你的进销存讲直白点：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;测试/小流量自用&lt;/strong&gt;完全不用加机器。你&lt;strong&gt;单台服务器&lt;/strong&gt;就能跑，暂时不用负载均衡。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;一台机器性能富余（最省钱方案）&lt;strong&gt;不用新购服务器。一台服务器上&lt;/strong&gt;启动多个项目实例&lt;/strong&gt;（比如同一套进销存开2~3个端口运行），Nginx把请求分给这些实例，也算负载均衡，&lt;strong&gt;只用1台机器&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;真正用户多、压力大&lt;/strong&gt;这时才需要&lt;strong&gt;多台独立服务器&lt;/strong&gt;，分摊压力，防止一台崩掉。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;总结：初期自己用/小用户量 → &lt;strong&gt;不用加服务器&lt;/strong&gt;后期访问变多、卡顿 → 先一台机器多开实例，还扛不住再添新服务器。&lt;/p&gt;
&lt;h3&gt;4.动静分离&lt;/h3&gt;
&lt;blockquote&gt;
&lt;hr /&gt;
&lt;/blockquote&gt;
&lt;p&gt;用大白话讲，再结合部署场景说明：&lt;/p&gt;
&lt;h5&gt;一、简单解释&lt;/h5&gt;
&lt;p&gt;把网站资源分成&lt;strong&gt;静态&lt;/strong&gt;和&lt;strong&gt;动态&lt;/strong&gt;两类，分开交给不同服务器处理，就是&lt;strong&gt;动静分离&lt;/strong&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;静态资源&lt;/strong&gt;：不变/很少变的文件，比如图片、CSS、JS、HTML、字体、视频&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;动态资源&lt;/strong&gt;：需要Java代码实时计算、查数据库的内容，比如进销存数据、博客文章接口、用户登录&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;二、工作流程（以Nginx+Tomcat为例）&lt;/h5&gt;
&lt;ol&gt;
&lt;li&gt;用户发请求，先到 &lt;strong&gt;Nginx&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;若是图片、样式等静态文件 → Nginx 直接返回，&lt;strong&gt;不用走Java服务&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;若是查数据、提交表单这类动态请求 → Nginx 转发给 &lt;strong&gt;Tomcat/SpringBoot&lt;/strong&gt; 处理&lt;/li&gt;
&lt;/ol&gt;
&lt;h5&gt;三、为什么要这么做&lt;/h5&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;提速&lt;/strong&gt;：Nginx 处理静态文件速度远快于Java服务&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;减压&lt;/strong&gt;：Java服务只专注处理业务逻辑，压力变小&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;易维护&lt;/strong&gt;：静态资源、动态代码可以分开部署、单独扩容&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;为了加快网站的解析速度，可以把动态页面和静态页面由不同的服务器来解析，加快解析速度。降低原来单个服务器的压力。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;</content:encoded></item><item><title>最近在整理个人站的新功能规划</title><link>https://www.qawkh.com/posts/8/</link><guid isPermaLink="true">https://www.qawkh.com/posts/8/</guid><description>记录一下近期把说说、照片墙和背景图配置陆续补齐后的开发感受。</description><pubDate>Tue, 02 Jun 2026 10:32:24 GMT</pubDate><content:encoded>&lt;h1&gt;最近在整理个人站的新功能规划&lt;/h1&gt;
&lt;p&gt;最近主要完成了几个内容型功能模块：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;说说&lt;/li&gt;
&lt;li&gt;照片墙&lt;/li&gt;
&lt;li&gt;网站背景图&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;一点记录&lt;/h2&gt;
&lt;p&gt;持续把小功能做完整，比一开始追求大而全更有效。&lt;/p&gt;
&lt;h2&gt;下一步&lt;/h2&gt;
&lt;p&gt;后面可以继续补评论、更多内容配置和前台交互细节。&lt;/p&gt;</content:encoded></item><item><title>按双方发生发发我发</title><link>https://www.qawkh.com/posts/2/</link><guid isPermaLink="true">https://www.qawkh.com/posts/2/</guid><pubDate>Tue, 02 Jun 2026 04:54:28 GMT</pubDate><content:encoded>&lt;h1&gt;阿迪斯&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;重点内容&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;message&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;hello&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;img src=&quot;https://java-aierp.oss-cn-beijing.aliyuncs.com/articles/content/2026/06/02/d592300e5db74e5199727c494101f668.png&quot; alt=&quot;21&quot; /&gt;&lt;/p&gt;</content:encoded></item><item><title>震惊，AI直接自动生成一个完整的项目</title><link>https://www.qawkh.com/posts/1/</link><guid isPermaLink="true">https://www.qawkh.com/posts/1/</guid><pubDate>Tue, 02 Jun 2026 04:33:59 GMT</pubDate><content:encoded>&lt;p&gt;123&lt;/p&gt;</content:encoded></item><item><title>照片墙页面的卡片预览数据结构设计</title><link>https://www.qawkh.com/posts/7/</link><guid isPermaLink="true">https://www.qawkh.com/posts/7/</guid><description>围绕分类预览图、数量和时间字段，设计适合前端直接渲染的接口结构。</description><pubDate>Sun, 31 May 2026 10:32:24 GMT</pubDate><content:encoded>&lt;h1&gt;照片墙页面的卡片预览数据结构设计&lt;/h1&gt;
&lt;p&gt;照片墙首页一般不是直接铺平所有照片，而是先展示分类卡片。&lt;/p&gt;
&lt;h2&gt;分类卡片常见字段&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;id&lt;/li&gt;
&lt;li&gt;name&lt;/li&gt;
&lt;li&gt;previewImages&lt;/li&gt;
&lt;li&gt;photoCount&lt;/li&gt;
&lt;li&gt;updatedAt&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;设计原则&lt;/h2&gt;
&lt;p&gt;返回结果尽量让前端拿到后可以直接渲染，不需要再做复杂拼装。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://java-aierp.oss-cn-beijing.aliyuncs.com/articles/content/2026/06/09/63f795dd23534cb6a07abf509e2bcc96.jpg&quot; alt=&quot;82e40c5fb47fa98aacb47c305e4ee27c&quot; /&gt;&lt;/p&gt;</content:encoded></item><item><title>uni-app 页面数据请求与加载态处理</title><link>https://www.qawkh.com/posts/6/</link><guid isPermaLink="true">https://www.qawkh.com/posts/6/</guid><description>整理前端页面在首屏加载、下拉刷新和异常态展示上的处理思路。</description><pubDate>Fri, 29 May 2026 10:32:24 GMT</pubDate><content:encoded>&lt;h1&gt;uni-app 页面数据请求与加载态处理&lt;/h1&gt;
&lt;p&gt;前端页面体验往往取决于数据加载阶段的处理是否自然。&lt;/p&gt;
&lt;h2&gt;常见状态&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;首次加载&lt;/li&gt;
&lt;li&gt;下拉刷新&lt;/li&gt;
&lt;li&gt;上拉加载更多&lt;/li&gt;
&lt;li&gt;空数据&lt;/li&gt;
&lt;li&gt;请求失败&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;建议&lt;/h2&gt;
&lt;p&gt;将页面状态独立管理，不要把所有逻辑都塞进一个布尔值里。&lt;/p&gt;</content:encoded></item><item><title>MyBatis 注解 SQL 在内容管理系统中的使用</title><link>https://www.qawkh.com/posts/5/</link><guid isPermaLink="true">https://www.qawkh.com/posts/5/</guid><description>基于注解方式组织 Mapper，可以在简单后台项目中减少 XML 成本。</description><pubDate>Wed, 27 May 2026 10:32:24 GMT</pubDate><content:encoded>&lt;h1&gt;MyBatis 注解 SQL 在内容管理系统中的使用&lt;/h1&gt;
&lt;p&gt;当前项目采用的是注解 SQL 风格。&lt;/p&gt;
&lt;h2&gt;适合的场景&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;SQL 复杂度可控&lt;/li&gt;
&lt;li&gt;表数量不算特别多&lt;/li&gt;
&lt;li&gt;团队希望快速定位查询逻辑&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;优点&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;文件更集中&lt;/li&gt;
&lt;li&gt;查询与接口定义靠得更近&lt;/li&gt;
&lt;li&gt;对中小项目维护友好&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;注意点&lt;/h2&gt;
&lt;p&gt;复杂动态 SQL 仍然要注意可读性。
&lt;img src=&quot;https://java-aierp.oss-cn-beijing.aliyuncs.com/articles/content/2026/06/09/5a00b1e91d594991a696f3ec1f25dd53.jpg&quot; alt=&quot;古见&quot; /&gt;&lt;/p&gt;</content:encoded></item><item><title>Spring Boot 接口统一返回结构实践</title><link>https://www.qawkh.com/posts/4/</link><guid isPermaLink="true">https://www.qawkh.com/posts/4/</guid><description>整理一个中小型项目里统一响应结果、异常处理和分页结构的落地方式。</description><pubDate>Mon, 25 May 2026 10:32:24 GMT</pubDate><content:encoded>&lt;h1&gt;Spring Boot 接口统一返回结构实践&lt;/h1&gt;
&lt;p&gt;在中小型后台项目中，统一响应结构可以显著降低前后端联调成本。&lt;/p&gt;
&lt;h2&gt;核心目标&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;成功响应结构统一&lt;/li&gt;
&lt;li&gt;失败响应结构统一&lt;/li&gt;
&lt;li&gt;分页结果结构统一&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;推荐做法&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;使用 Result 统一包裹业务数据&lt;/li&gt;
&lt;li&gt;使用全局异常处理统一错误输出&lt;/li&gt;
&lt;li&gt;分页接口统一返回 total、pageNum、pageSize、records&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;p&gt;这套模式适合博客、内容管理、工具站等后台项目。&lt;/p&gt;</content:encoded></item></channel></rss>