我用 767 行代码做了一个文档管理器——不用 React、不用数据库、不用 Docker,反而是最优解
写第五章之前我犹豫了很久。
这一章要讲的项目叫 Doc-Manager——是我用来归档 Claude Code 产出的本地工具。它的技术选型在 2026 年看起来近乎荒谬——
```
279 行 Python 后端(仅依赖 Flask)
488 行原生 HTML/CSS/JS 前端(零框架、零构建工具)
文件系统就是数据库(无 ORM、无 Schema、无迁移)
总计 767 行代码,部署成本零,永不宕机
```
我犹豫,是因为这个案例**反所有"现代全栈"教程的潮流**。但我最终决定写——因为它呈现的工程判断比技术选型本身更值得讲。
> **「在追求『全栈』『企业级』『可扩展』的行业氛围中,克制是一种稀缺的工程美德。」**
下面把这件事讲透。
### 一、问题是什么——AI 产出的"组织记忆"
设想一下:你和 Claude Code 协作了三个月,产出了——
- 47 份 PPT(产品介绍、技术分享、商业方案……)
- 23 篇技术文档(架构、API、部署)
- 12 份商业方案
- 一部连载小说的前 30 章
- 几十封邮件草稿、十几份会议纪要……
某天客户问:"上次那份 AI 行业分析的 PPT 在哪?"你打开桌面,看见 `desktop/`、`Downloads/`、`tmp_2025_11/`、`claude_output/`、`新建文件夹 (3)/`——花 20 分钟翻找,最终在某个临时目录的孙目录里找到它。
这不是个别现象,是 **AI 协作时代的普遍痛点**。
传统文件管理建立在「人类创作」的前提上——你写一份文档,你知道它在哪里。但 AI 产出彻底改变了这个假设——
| 假设 | AI 协作下的现实 |
| --- | --- |
| 创作速度匹配整理速度 | 一次对话生成 3-5 个文件 |
| 创作者注意力在归档上 | 注意力全在内容本身 |
| 文件有稳定的创建语境 | 对话结束后语境消失 |
| 分类层级清晰 | 一份文档可能跨多个分类 |
**Doc-Manager 要解决的不是"文件管理"问题,而是"AI 产出的组织记忆"问题。**
### 二、为什么不用 Notion / 语雀 / Git
所有现有方案都有同一个共同假设——「人类会主动整理文件」。在 AI 协作场景下,**这个假设根本不成立**。
Doc-Manager 的核心理念是——**消除归档的认知负担**。
具体做法:通过 CLAUDE.md 中的产出规则,**让 Claude Code 在生成文件时就自动写入正确的分类目录**。人类不需要做任何额外操作——文件在创建的瞬间就已经被正确归档。
这是「约定优于配置」思想在 AI 产出管理领域的极致应用。
### 三、为什么不用 React/Vue
前端框架解决的是「状态管理」和「组件复用」。但 Doc-Manager 的交互模型极简——点目录看内容、点文件看详情、搜索框输入关键词。
引入 React 意味着——
```
npm init → 安装 react/react-dom (≥120KB gzip)
→ 配置 webpack/vite
→ 处理 JSX/Babel/TypeScript
→ 管理组件状态、context、useEffect 依赖
→ 持续跟随版本、安全补丁
```
为了一个本质上只有 3 个视图的应用,引入 10 倍的工程复杂度。**这不叫"工程化",叫"工程虚胖"。**
### 四、为什么不用数据库
这个选择更反直觉。文件管理系统不用数据库?
仔细想想——Doc-Manager 管理的"数据"是什么?**是文件本身。** 文件已经存在于文件系统中,文件系统本身就是一个层级化的数据存储。用数据库存文件元数据,本质上是在文件系统之上建一层冗余映射。
冗余映射的代价——
- **同步问题**:用户在资源管理器移动了文件,数据库不知道
- **要么写定时扫描** → 增加复杂度
- **要么接受不一致** → 降低可靠性
Doc-Manager 的解法是——**直接读文件系统**。每次请求都是对文件系统的实时查询。
那性能呢?一个 AI 助手一年的产出大约几百到几千个文件。这个量级下 Python 的 `os.walk` 在 SSD 上遍历不到 50 毫秒。**YAGNI 原则在此得到完美体现——不要为假想的未来需求引入当下的复杂度。**
如果有一天真需要数据库——279 行代码的迁移成本几乎为零。
### 五、路径遍历防护:纵深防御
Web 文件管理器的头号安全风险是**路径遍历攻击**——攻击者构造 `../../etc/passwd` 试图访问任意文件。Doc-Manager 的防护是三层叠加——
```python
DOCS_ROOT = Path("D:/doc-manager/docs")
@app.route("/api/browse/<path:subpath>")
def api_browse(subpath=""):
target = DOCS_ROOT / subpath
# 层一:Flask 的 <path:> 路由不传递 .. 开头的段
# 层二:pathlib 的 / 操作符自动解析 ..
if not target.exists():
return jsonify({"error": "路径不存在"}), 404
# 层三:resolve 后必须仍在 DOCS_ROOT 之下
resolved = target.resolve()
if not str(resolved).startswith(str(DOCS_ROOT.resolve())):
return jsonify({"error": "非法路径"}), 403
```
**纵深防御** —— Flask 路由层 + pathlib 拼接层 + resolve 检查层,三道闸门串起来。任何一层被绕过都不致命。
### 六、守护进程:每个细节都有理由
Doc-Manager 通过 146 行的 `daemon.pyw` 实现开机自启和自动重启。三个值得讲的设计——
**① 用 `.pyw` 而不是 `.py`**
Windows 上 `.py` 运行时弹命令行窗口,`.pyw` 用 `pythonw.exe` 不显示窗口。一个永远驻留的黑窗口既不美观也容易被误关。
**② 5 秒健康检查必须是真实 HTTP 请求**
为什么不用进程检查或端口检查?因为——
| 检查方式 | 能告诉你 | 不能告诉你 |
| --- | --- | --- |
| 进程存在(`ps`) | 没崩溃 | 是否陷入死循环 / 阻塞 IO |
| 端口占用(`netstat`) | Socket 在监听 | 是否真正能响应 |
| **真实 HTTP 请求** | **服务从用户视角是否可用** | —— |
**③ 重启计数器只在健康通过时重置**
计数器计的是"连续失败次数"而非"累计重启次数"。偶尔崩溃但能重启——持续清零;问题是系统性的(配置错误、端口冲突)——连续失败触发上限。
### 七、与 Claude Code 的"声明式集成"
这是 Doc-Manager 真正的杀手特性——与 Claude Code 的无缝集成。集成方式是 CLAUDE.md 里一段文字——
```markdown
## 文档产出规范
所有由 Claude 创作的内容产出,统一存放到 D:/doc-manager/docs/ 下,按分类归档:
├── PPT演示/ # PPT 文件 (.pptx)
├── 小说/ # 小说创作
├── 技术文档/ # 技术类文档
├── 商业方案/ # 商业计划、方案
├── 学术论文/ # 学术论文
└── 其他/ # 未归类内容
```
**这段文本不是写给人看的——是写给 Claude 看的。**
当你说"帮我写份 AI 行业分析报告",Claude 不需要被提醒存到哪里——它从 CLAUDE.md 中知道这应该写入"商业方案"目录。
**集成的精妙之处在于它是声明式的**——不需要写代码、不需要 webhook、不需要 API。一段自然语言规则就足以让 AI 理解产出的组织方式。
这是 Claude Code 生态的独特优势——**当工具和 AI 之间的接口是自然语言时,集成成本趋近于零**。
### 八、极简主义的两大隐藏优势
**优势一:可理解性**
任何一个初级开发者都能在 30 分钟内读完 Doc-Manager 全部源码并完全理解。这意味着——
- 出问题时修复成本极低——直接定位、直接改
- 需要定制时影响可控——改一行知道改一行
- 交接成本接近零——新来的同事一上午就能接手
相比之下,一个用 React + TS + Prisma + PostgreSQL 构建的"等价"系统,光理解构建配置可能就需要一天。
**优势二:零维护负担**
```
依赖只有 Flask → 几年才升一次版
没有数据库迁移 → 没有 schema 变更
没有 npm audit 警告 → 没有每周 30 个间接依赖升级
没有 Docker 镜像 → 没有每月重 build
```
一份用了 React 的"现代"系统,三年后会被 npm 依赖拖垮。Doc-Manager 不存在这些问题。
### 写在最后:"够用"是最高级的工程判断
Doc-Manager 从来不是通用工具。它是面向特定用户(Claude Code 使用者)、特定场景(AI 产出归档)、特定环境(本地 Windows 开发机)的专用工具。
在这个精确限定的上下文中,它的"缺失功能"——
- 要么不需要(协作——只有一个用户)
- 要么已被其他工具覆盖(在线编辑——VSCode 打开就行)
- 要么当前规模不需要(全文搜索——几百文件用文件名搜索就够)
> **「『够用』不是『凑合』。『够用』是清楚地知道自己解决的是什么问题、不解决什么问题,然后在边界内把事情做到 95 分。」**
日本茶道有一个概念叫"侘寂"(wabi-sabi)——欣赏不完美、不完整、未完成。一个粗糙的茶碗,可能比精美的瓷器更有韵味,因为它有"够用"的精确,没有"过度"的虚胖。
Doc-Manager 是一只这样的"茶碗"。它不漂亮,没用最新的技术,没有让人"哇"的炫技。但它每天工作,安静地解决一个真实问题——**这就够了**。
下一章会从两个案例(鉴渊 + DocManager)中抽出共性——把这些经验变成「通用 Skill 开发方法论」。从案例到原理。关注一下,别走丢。
---
更多推荐
所有评论(0)