Bladeren bron

'CLAUDE更新'

admincjy 1 maand geleden
bovenliggende
commit
2f18722f48
1 gewijzigde bestanden met toevoegingen van 87 en 17 verwijderingen
  1. 87 17
      CLAUDE.md

+ 87 - 17
CLAUDE.md

@@ -4,7 +4,11 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
 
 ## 项目概述
 
-CJYDocs 是一个基于 Node.js + Express 的轻量级 Markdown 文档管理和渲染系统,采用前后端分离架构。核心特点是通过解析 `docs/index.md` 配置文件实现文档的层级化管理。
+CJYDocs 是一个基于 Node.js + Express 的轻量级 Markdown 文档管理和渲染系统,采用前后端分离架构。核心特点包括:
+- 通过解析 `docs/index.md` 配置文件实现文档的层级化管理
+- 支持在线编辑功能,智能光标定位
+- 全文搜索、TOC 目录、响应式设计
+- 高性能优化:DOM 缓存、事件委托、IntersectionObserver
 
 ## 开发命令
 
@@ -48,7 +52,7 @@ npm install
 2.2: 子文档名.md
 ```
 
-**解析逻辑** (`server.js:200-236`):
+**解析逻辑** (`server.js:247-282`):
 - `[分类名]` → 对应 `docs/` 下的目录名
 - `编号: 文档名.md` → 文档项,支持多级编号(如 1.1.1)
 - `level` 通过点号数量计算:`1` = level 0, `1.1` = level 1, `1.1.1` = level 2
@@ -61,7 +65,7 @@ npm install
 
 ### 前端架构
 
-**DOM 缓存策略** (`reader.js:5-13`):
+**DOM 缓存策略** (`reader.js:8-22`):
 ```javascript
 const DOM = {
     loading: null,
@@ -69,11 +73,15 @@ const DOM = {
     docNav: null,
     toc: null,
     leftSidebar: null,
-    rightSidebar: null
+    rightSidebar: null,
+    editBtn: null,
+    editorContainer: null,
+    markdownEditor: null,
+    // ... 更多元素
 };
 ```
 
-所有频繁访问的 DOM 元素都通过此对象缓存,避免重复查询。
+所有频繁访问的 DOM 元素都通过此对象缓存,避免重复查询。缓存采用懒加载策略:首次使用时查询并缓存,后续直接使用。
 
 **事件委托模式**:
 - 导航点击:在 `#doc-nav` 父元素上监听,而非每个导航项
@@ -84,29 +92,34 @@ const DOM = {
 
 所有 API 都在 `server.js` 中定义:
 
-- `GET /api/structure` - 获取完整文档结构(解析 index.md)
+- `GET /api/structure` - 获取完整文档结构(解析 index.md,带5秒缓存
 - `GET /api/category/:category` - 获取指定分类信息
 - `GET /api/doc/:category/:docName` - 获取文档内容
+- `PUT /api/doc/:category/:docName` - 保存文档内容(在线编辑)
 - `GET /api/search/:category?q=xxx&currentDoc=yyy` - 搜索文档
 
 **安全机制**:
 所有用户输入都经过 `sanitizePath()` 清理和 `validatePath()` 验证,防止路径遍历攻击。
 
+**缓存策略**:
+`index.md` 解析结果缓存5秒(`server.js:9-12`),减少文件系统读取频率。
+
 ### 关键功能实现
 
 #### 1. Markdown 渲染
-使用 `marked.js` + `highlight.js`,配置在 `reader.js:15-29`
+使用 `marked.js` + `highlight.js`,配置在 `reader.js:25-38`
 
 #### 2. TOC 自动生成
-`reader.js:176-231` - 遍历渲染后的 HTML,提取所有 h1-h6 标题,使用 `IntersectionObserver` 实现滚动监听
+`reader.js:190-270` - 遍历渲染后的 HTML,提取所有 h1-h6 标题,使用 `IntersectionObserver` 实现滚动监听
 
 #### 3. 搜索功能
-- 后端:逐行扫描所有 `.md` 文件,返回匹配的行号和上下文片段
-- 前端:使用 `TreeWalker` API 精确定位到匹配的文本节点并滚动
+- 后端:`server.js:159-244` - 逐行扫描所有 `.md` 文件,返回匹配的行号和上下文片段(最多5个)
+- 前端:`reader.js:443-785` - 使用 `TreeWalker` API 精确定位到匹配的文本节点并滚动
 - 搜索历史保存在 `localStorage`,按分类隔离
+- 搜索防抖 500ms,点击搜索结果后自动关闭搜索框和侧边栏
 
 #### 4. 移动端侧边栏交互
-`reader.js:314-355` - 移动端侧边栏管理逻辑:
+`reader.js:359-440` - 移动端侧边栏管理逻辑:
 - **互斥展开**:点击一侧目录按钮时,自动隐藏另一侧已展开的目录,确保同一时间最多只有一个侧边栏展开
 - **点击外部关闭**:点击文档内容区域或其他目录以外的地方时,所有展开的侧边栏自动隐藏
 - **响应式行为**:此功能仅在移动端和平板(≤1024px)上启用,桌面端不受影响
@@ -118,22 +131,65 @@ const DOM = {
 - 搜索防抖:500ms,减少 40% 的 API 请求
 - `IntersectionObserver`:替代 scroll 事件,性能提升 20-30%
 
+#### 6. 在线编辑功能
+`reader.js:820-1095` + `server.js:113-156` - 完整的在线文档编辑系统:
+
+**编辑器特性**:
+- **智能光标定位** (`reader.js:869-988`):根据当前阅读位置(标题、段落)在编辑器中自动定位到对应的 markdown 源码行
+- **无缝模式切换**:编辑/预览模式切换时保持滚动位置,自动隐藏渲染内容并显示编辑器
+- **实时保存**:通过 `PUT /api/doc/:category/:docName` 保存到服务器,保存后自动重新渲染并更新 TOC
+
+**编辑流程**:
+```
+点击编辑按钮 → 进入编辑模式
+    ↓
+findVisibleElement() - 找到视口中可见的元素
+    ↓
+positionCursorByElement() - 在编辑器中定位到对应行
+    ↓
+用户编辑内容
+    ↓
+saveDocument() → PUT /api/doc/:category/:docName
+    ↓
+服务器验证路径 + 保存文件
+    ↓
+前端重新渲染 + 退出编辑模式
+```
+
+**安全验证**:
+- 文件必须已存在(不能创建新文件)
+- 内容类型必须为字符串
+- 所有路径经过 `sanitizePath()` 和 `validatePath()` 验证
+
+**用户体验细节**:
+- 浮动编辑按钮(右下角)
+- 防重复提交(保存时禁用按钮)
+- 成功提示 Toast(2秒后自动消失)
+- 完整的错误处理和提示
+
 ## 文件结构
 
 ```
 cjydocs/
-├── server.js              # Express 后端,包含所有 API 和 index.md 解析逻辑
+├── server.js              # Express 后端(288行)
+│                          # - 所有 API 端点(GET/PUT)
+│                          # - index.md 解析逻辑(带5秒缓存)
+│                          # - 安全验证函数(sanitizePath, validatePath)
+│                          # - 搜索引擎实现
 ├── docs/
 │   ├── index.md          # 文档结构配置文件(核心)
 │   └── 分类名/
-│       └── 文档.md       # 实际文档内容
+│       └── 文档.md       # 实际文档内容(可通过在线编辑修改)
 └── public/
-    ├── index.html        # 首页(显示分类列表)
-    ├── reader.html       # 阅读器页面(三栏布局)
+    ├── index.html        # 首页(显示分类列表)35行
+    ├── reader.html       # 阅读器页面(三栏布局+编辑器129行
     ├── css/style.css     # 统一样式
     └── js/
-        ├── index.js      # 首页逻辑
-        └── reader.js     # 阅读器逻辑(DOM缓存、事件委托、搜索)
+        ├── index.js      # 首页逻辑(70行)
+        └── reader.js     # 阅读器核心逻辑(1113行)
+                          # - DOM缓存、事件委托
+                          # - 搜索、TOC、侧边栏交互
+                          # - 在线编辑器(智能光标定位)
 ```
 
 ## 代码修改指南
@@ -157,6 +213,13 @@ cjydocs/
 2. 在对应目录下创建/删除 `.md` 文件
 3. 无需重启服务器,刷新页面即可
 
+### 修改/扩展编辑功能
+1. 所有文档保存操作必须通过 PUT API,并经过安全验证
+2. 编辑器光标定位依赖 `findVisibleElement()` 和 `positionCursorByElement()` 函数
+3. 修改编辑行为时注意保持 `currentMarkdownContent` 和 `savedScrollPosition` 的同步
+4. 编辑模式切换时需要正确管理 DOM 显示/隐藏状态
+5. 不要允许编辑功能创建新文件,只能编辑已存在的文档
+
 ## 安全注意事项
 
 **路径遍历防护**:
@@ -215,6 +278,13 @@ if (!validatePath(docPath, docsDir)) {
 2. 是否频繁查询 DOM(应使用 `DOM` 缓存对象)
 3. 是否对搜索等高频操作使用了防抖
 
+### 编辑功能无法保存
+检查:
+1. 文件是否存在(编辑功能不能创建新文件)
+2. 浏览器控制台是否有 PUT API 错误
+3. 服务器是否返回 403(路径验证失败)或 400(数据格式错误)
+4. 文件权限是否允许服务器写入
+
 ## 技术栈版本
 
 - Node.js: v14+