@code2rich/jpage 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (143) hide show
  1. package/.claude/settings.local.json +68 -0
  2. package/.dockerignore +8 -0
  3. package/.env.example +56 -0
  4. package/.github/workflows/ci.yml +43 -0
  5. package/CLAUDE.md +280 -0
  6. package/Dockerfile +44 -0
  7. package/LICENSE +21 -0
  8. package/README.md +433 -0
  9. package/README_EN.md +399 -0
  10. package/bin/args.js +64 -0
  11. package/bin/client.js +93 -0
  12. package/bin/commands/_shared.js +54 -0
  13. package/bin/commands/cat.js +23 -0
  14. package/bin/commands/ls.js +44 -0
  15. package/bin/commands/mv.js +20 -0
  16. package/bin/commands/rm.js +22 -0
  17. package/bin/commands/skills.js +70 -0
  18. package/bin/commands/star.js +23 -0
  19. package/bin/commands/tags.js +97 -0
  20. package/bin/commands/upload.js +84 -0
  21. package/bin/commands/url.js +25 -0
  22. package/bin/commands/whoami.js +29 -0
  23. package/bin/config.js +85 -0
  24. package/bin/jpage.js +168 -0
  25. package/build.js +112 -0
  26. package/docker-compose.yml +26 -0
  27. package/docs/api.md +438 -0
  28. package/docs/design/005-custom-modal.md +296 -0
  29. package/docs/design/013-file-version-history.md +324 -0
  30. package/docs/design/billing-system.md +600 -0
  31. package/docs/design/db-index-and-healthcheck.md +176 -0
  32. package/docs/design/loading-states.md +209 -0
  33. package/docs/virtual-hosting-feasibility.md +453 -0
  34. package/eslint.config.mjs +172 -0
  35. package/lib/auth-state.js +15 -0
  36. package/lib/categories.js +20 -0
  37. package/lib/crypto.js +85 -0
  38. package/lib/csp.js +66 -0
  39. package/lib/db.js +53 -0
  40. package/lib/dispatch.js +103 -0
  41. package/lib/fts.js +81 -0
  42. package/lib/middleware/auth.js +114 -0
  43. package/lib/middleware/files.js +42 -0
  44. package/lib/paths.js +9 -0
  45. package/lib/render-cache.js +48 -0
  46. package/lib/render.js +157 -0
  47. package/lib/templates.js +149 -0
  48. package/lib/util.js +66 -0
  49. package/lib/view-counts.js +59 -0
  50. package/lib/zip.js +192 -0
  51. package/logger.js +16 -0
  52. package/mailer.js +34 -0
  53. package/mcp/constants.js +16 -0
  54. package/mcp/resources.js +74 -0
  55. package/mcp/server.js +43 -0
  56. package/mcp/tools-categories.js +56 -0
  57. package/mcp/tools-content-templates.js +59 -0
  58. package/mcp/tools-files.js +245 -0
  59. package/mcp/tools-tags.js +41 -0
  60. package/mcp/tools-versions.js +57 -0
  61. package/mcp/transport.js +183 -0
  62. package/mcp/util.js +63 -0
  63. package/mcp-server.js +20 -0
  64. package/migrations/001_init_schema.js +25 -0
  65. package/migrations/002_add_share_key.js +33 -0
  66. package/migrations/003_add_roles_and_tokens.js +28 -0
  67. package/migrations/004_add_version_history.js +32 -0
  68. package/migrations/005_tags_starred_categories.js +49 -0
  69. package/migrations/006_zip_bundle.js +17 -0
  70. package/migrations/007_add_file_type_uploaded_by_indexes.js +7 -0
  71. package/migrations/008_add_fts5.js +6 -0
  72. package/migrations/009_add_link_visits.js +20 -0
  73. package/migrations/010_add_templates_system.js +34 -0
  74. package/migrations/011_content_templates.js +233 -0
  75. package/migrations/012_add_email_and_verification.js +35 -0
  76. package/migrations/013_add_token_encrypted.js +14 -0
  77. package/migrations.js +65 -0
  78. package/package.json +63 -0
  79. package/public/css/style.css +2915 -0
  80. package/public/index.html +855 -0
  81. package/public/js/api.js +22 -0
  82. package/public/js/app.js +94 -0
  83. package/public/js/components/dialog.js +106 -0
  84. package/public/js/components/toast.js +13 -0
  85. package/public/js/pages/content-templates.js +330 -0
  86. package/public/js/pages/home.js +1903 -0
  87. package/public/js/pages/landing.js +158 -0
  88. package/public/js/pages/login.js +175 -0
  89. package/public/js/pages/preview.js +713 -0
  90. package/public/js/theme.js +44 -0
  91. package/public/js/utils.js +67 -0
  92. package/routes/admin.js +136 -0
  93. package/routes/auth.js +365 -0
  94. package/routes/categories.js +90 -0
  95. package/routes/content-templates.js +215 -0
  96. package/routes/files/_shared.js +112 -0
  97. package/routes/files/associations.js +94 -0
  98. package/routes/files/crud.js +139 -0
  99. package/routes/files/detail-serve.js +178 -0
  100. package/routes/files/index.js +38 -0
  101. package/routes/files/list.js +200 -0
  102. package/routes/files/overwrite.js +114 -0
  103. package/routes/files/upload.js +204 -0
  104. package/routes/files/versions.js +166 -0
  105. package/routes/files.js +16 -0
  106. package/routes/skills.js +93 -0
  107. package/routes/tags.js +65 -0
  108. package/routes/tokens.js +110 -0
  109. package/routes/users.js +120 -0
  110. package/server.js +372 -0
  111. package/skills/jpage-content-template/SKILL.md +98 -0
  112. package/skills/jpage-upload/SKILL.md +247 -0
  113. package/skills-registry.js +135 -0
  114. package/templates/academic.html +41 -0
  115. package/templates/dark-pro.html +41 -0
  116. package/templates/default.html +56 -0
  117. package/templates/github.html +67 -0
  118. package/test/browser-harness.js +125 -0
  119. package/test/dispatch-bench.js +74 -0
  120. package/test/helpers/setup.js +45 -0
  121. package/test/integration/admin.test.js +108 -0
  122. package/test/integration/auth.test.js +93 -0
  123. package/test/integration/categories.test.js +103 -0
  124. package/test/integration/cli.test.js +310 -0
  125. package/test/integration/content-templates.test.js +147 -0
  126. package/test/integration/files-security.test.js +248 -0
  127. package/test/integration/files.test.js +139 -0
  128. package/test/integration/share.test.js +79 -0
  129. package/test/integration/skills.test.js +104 -0
  130. package/test/integration/tags.test.js +84 -0
  131. package/test/integration/tokens.test.js +89 -0
  132. package/test/integration/users.test.js +138 -0
  133. package/test/mcp-harness.js +152 -0
  134. package/test/perf-bench.js +108 -0
  135. package/test/perf-harness.js +198 -0
  136. package/test/run-server.sh +15 -0
  137. package/test/unit/cli-args.test.js +88 -0
  138. package/test/unit/cli-config.test.js +89 -0
  139. package/test/unit/crypto.test.js +100 -0
  140. package/test/unit/fts.test.js +52 -0
  141. package/test/unit/render-cache.test.js +76 -0
  142. package/test/unit/util.test.js +81 -0
  143. package/test/unit/zip.test.js +164 -0
package/README.md ADDED
@@ -0,0 +1,433 @@
1
+ # 即页
2
+
3
+ > 拖入文件,即刻成页。
4
+
5
+ [![CI](https://github.com/code2rich/jpage/actions/workflows/ci.yml/badge.svg)](https://github.com/code2rich/jpage/actions/workflows/ci.yml)
6
+
7
+ [English](README_EN.md) | 中文
8
+
9
+ **[>>> 查看即页产品介绍 <<<](https://jpage.cn/)**
10
+
11
+ **即页**是一个零配置的 HTML / Markdown 即时预览与分享工具。把写好的文档拖进来,立刻获得一个干净的在线页面——无需部署流程,无需服务器知识。特别适合 AI 生成内容的一键分享。
12
+
13
+ ---
14
+
15
+ ## 功能特性
16
+
17
+ ### 核心能力
18
+
19
+ - **即时预览** — 上传 HTML 或 Markdown 文件,秒级生成在线渲染页面
20
+ - **Markdown 增强渲染** — 代码高亮(highlight.js)、数学公式(KaTeX)、Mermaid 图表,深色/浅色主题自动切换
21
+ - **源码查看** — 渲染 / 源码双模式切换,方便对照
22
+ - **短链接** — 每个文件自动生成 8 位短链(`/s/xxxxxxxx`),分享更简洁
23
+ - **文件管理** — 重命名、删除、下载、公开/私有切换,操作简单直观
24
+ - **拖拽上传** — 支持点击选择和拖拽两种方式,单文件最大 50MB
25
+ - **版本历史** — 覆盖上传自动保留历史版本,可随时回滚
26
+ - **响应式设计** — 桌面端与移动端自适应,深色模式自动跟随系统
27
+
28
+ ### 组织与发现
29
+
30
+ - **标签系统** — 为文件打标签,多维度分类检索
31
+ - **分类管理** — 创建分类归属文件,层级清晰
32
+ - **收藏功能** — 一键收藏常用文件,快速访问
33
+
34
+ ### 安全与权限
35
+
36
+ - **多用户支持** — admin 可创建和管理多个用户,普通用户只能访问自己的文件和公开文件
37
+ - **开放注册** — 通过 `ALLOW_REGISTRATION=true` 开放用户自助注册,配合 SMTP 实现邮箱验证
38
+ - **会话鉴权** — Cookie + bcrypt 密码哈希
39
+ - **API Token** — 每用户可创建多个 API Token,适合脚本和 AI 工具调用
40
+ - **公开/私有文件** — 上传时可选是否公开,私有文件仅文件所有者和 admin 可访问
41
+ - **API 限流** — 登录和上传接口均有频率限制,防止暴力破解和滥用
42
+
43
+ ### AI 集成
44
+
45
+ - **MCP 协议支持** — 内置 MCP Streamable HTTP 端点,AI 工具可直接调用
46
+ - **Skills 管理** — 自动发现 `skills/` 目录下的 Claude Code/Desktop 技能包
47
+ - **JSON 上传接口** — `/api/files/upload-json` 支持程序化上传,适合 AI 工作流
48
+
49
+ ### 部署
50
+
51
+ - **零依赖运行** — 单容器即可启动,SQLite 内置存储
52
+ - **Docker 一键部署** — 多阶段构建,环境变量配置,数据卷持久化
53
+ - **数据库迁移** — 自动执行 schema 迁移,升级无需手动操作
54
+
55
+ ## 技术栈
56
+
57
+ - **后端**: Node.js + Express + express-session(SQLite 会话存储),按域拆分的 Router 架构(routes/ + lib/ 共享层)
58
+ - **数据库**: SQLite3(零配置,自动迁移)
59
+ - **前端**: 原生 JavaScript(无框架依赖)
60
+ - **渲染**: marked.js + highlight.js + KaTeX + Mermaid
61
+ - **安全**: helmet + 分级 CSP(管理界面严格策略,渲染页 iframe sandbox 隔离 + 内容分级 CSP)
62
+ - **协议**: MCP Streamable HTTP(@modelcontextprotocol/sdk)
63
+ - **测试**: node:test + supertest(单元 + 集成),GitHub Actions CI
64
+ - **容器**: Docker / Docker Compose
65
+
66
+ ## 快速开始
67
+
68
+ ### Docker 部署(推荐)
69
+
70
+ ```bash
71
+ git clone https://github.com/code2rich/jpage.git
72
+ cd jpage
73
+ cp .env.example .env # 编辑 .env 填入 ADMIN_PASSWORD 和 SESSION_SECRET
74
+ docker-compose up -d
75
+ ```
76
+
77
+ 访问 http://localhost:8858,浏览器会跳到登录页。
78
+
79
+ ### 本地运行
80
+
81
+ ```bash
82
+ npm install
83
+ ADMIN_USER=admin ADMIN_PASSWORD=test1234 SESSION_SECRET=dev-secret npm start
84
+ ```
85
+
86
+ 开发模式(热重载):
87
+
88
+ ```bash
89
+ npm run dev
90
+ ```
91
+
92
+ ### 开发与测试
93
+
94
+ ```bash
95
+ npm test # 单元 + 集成测试(node:test + supertest)
96
+ npm run test:unit # 仅单元测试
97
+ npm run build # 构建前端产物(esbuild → public/dist)
98
+ ```
99
+
100
+ 端到端 / 性能基准(需先 `=8000# npm start= 起服务):
101
+
102
+ ```bash
103
+ node test/perf-harness.js 8858 # 核心流程 e2e(登录/上传/渲染/短链/标签)
104
+ node test/mcp-harness.js 8858 # MCP 端点
105
+ node test/perf-bench.js 8858 # 渲染/列表/缓存延迟基准
106
+ ```
107
+
108
+ ## 鉴权与安全
109
+
110
+ 即页支持多用户体系。admin 可管理全部用户和文件,普通用户只能操作自己的文件和公开文件。
111
+
112
+ **内容安全(CSP)**:通过 helmet + 分级策略加固——管理界面下发严格 CSP(仅放行同源 script),用户内容渲染页用 iframe sandbox(无 `allow-same-origin`,阻断对父窗口的访问)隔离,其中 Markdown 页套严格 CSP(内联 mermaid 脚本靠 nonce 放行),HTML 页用宽松 CSP + sandbox 兜底(用户 HTML 常含合法 script)。分享链接(`/api/files/:id/render`、`/s/:key`、下载、源码)在文件标记为公开时可匿名访问;上传时取消勾选「公开访问」可让该文件仅所有者和 admin 可见。
113
+
114
+ ### 认证方式
115
+
116
+ API 和 MCP 端点支持三种认证方式:
117
+
118
+ 1. **Session Cookie** — 登录后获得 `jpage.sid`,适合浏览器访问
119
+ 2. **API Token** — 用户在设置中创建 `jp_` 前缀的 Token,适合脚本调用
120
+ 3. **MCP Token** — 环境变量 `MCP_TOKEN`,适合 AI 工具连接(向后兼容)
121
+
122
+ ### 环境变量
123
+
124
+ | 变量 | 必填 | 说明 |
125
+ |---|---|---|
126
+ | `ADMIN_USER` | 否 | 首次启动、users 表为空时使用的管理员用户名;留空默认 `admin` |
127
+ | `ADMIN_PASSWORD` | 否 | 首次启动、users 表为空时使用的管理员密码(≥8 位);留空则自动生成 16 位随机密码并打到启动日志 |
128
+ | `SESSION_SECRET` | 生产必填 | 加密会话 Cookie;缺失时开发模式自动生成临时密钥,重启会失效 |
129
+ | `NODE_ENV` | 否 | `production` 时 Cookie 仅 HTTPS 下发送,SESSION_SECRET 缺失会拒绝启动 |
130
+ | `PORT` | 否 | 默认 8858 |
131
+ | `MCP_TOKEN` | 否 | `/mcp` 端点的全局 Bearer token(向后兼容);未设置时仍可用用户级 API Token(`jp_` 前缀)访问 MCP |
132
+ | `ALLOW_REGISTRATION` | 否 | 设为 `true` 开放用户自助注册;默认关闭,仅 admin 可创建用户 |
133
+ | `SMTP_HOST` | 否 | SMTP 服务器地址(如 `smtp.qq.com`),配置后支持邮箱验证 |
134
+ | `SMTP_PORT` | 否 | SMTP 端口(如 `465`) |
135
+ | `SMTP_SECURE` | 否 | 是否使用 SSL(`true`/`false`) |
136
+ | `SMTP_USER` | 否 | SMTP 登录用户名 |
137
+ | `SMTP_PASS` | 否 | SMTP 登录密码或授权码 |
138
+ | `SMTP_FROM` | 否 | 发件人地址(如 `"即页 <user@example.com>"`) |
139
+ | `APP_URL` | 否 | 应用外部访问地址,用于拼接验证链接(如 `https://jpage.cn`) |
140
+
141
+ 如果 `ADMIN_USER` 和 `ADMIN_PASSWORD` 都留空启动,启动日志会输出:
142
+
143
+ ```
144
+ [即页] 已创建初始管理员: admin
145
+ [即页] 初始密码(请妥善保存): 7Hk2mN9pq4rTv8wX
146
+ [即页] ⚠️ 首次登录后请立即修改密码
147
+ ```
148
+
149
+ 复制日志里的密码登录即可。
150
+
151
+ `SESSION_SECRET` 推荐生成方式:
152
+ ```bash
153
+ node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"
154
+ ```
155
+
156
+ ### 重置或修改密码
157
+
158
+ 所有用户登录后可在设置中修改密码。admin 可在用户管理中重置其他用户密码。
159
+
160
+ 手动方式(SQLite 命令行):
161
+
162
+ ```bash
163
+ node -e "console.log(require('bcryptjs').hashSync('新密码', 10))"
164
+ sqlite3 data/database.sqlite "UPDATE users SET password_hash='<上面生成的hash>' WHERE username='admin';"
165
+ ```
166
+
167
+ ## 项目结构
168
+
169
+ ```
170
+ jpage/
171
+ ├── server.js # 入口:app 装配 + 中间件 + 启动编排(业务逻辑已拆分)
172
+ ├── routes/ # 按域拆分的 Express Router
173
+ │ ├── auth.js # 登录/注册/邮箱验证
174
+ │ ├── users.js # 用户管理(admin)
175
+ │ ├── tokens.js # API Token
176
+ │ ├── files.js # 文件 CRUD/上传/渲染/版本/标签/收藏/统计
177
+ │ ├── tags.js # 标签
178
+ │ ├── categories.js # 分类 + 模板元数据
179
+ │ ├── content-templates.js # 内容模板市场
180
+ │ ├── admin.js # 备份导出/导入/统计
181
+ │ └── skills.js # Skills + MCP 配置
182
+ ├── lib/ # 共享层(被 routes 复用)
183
+ │ ├── db.js # SQLite 访问(dbRun/dbGet/dbAll + PRAGMA)
184
+ │ ├── paths.js # 数据/上传目录常量
185
+ │ ├── util.js # now/shareKey/clientIp/decodeFilename 等纯函数
186
+ │ ├── csp.js # 分级 CSP 策略 + nonce
187
+ │ ├── auth-state.js # adminUserId 共享状态
188
+ │ ├── templates.js # 模板系统 + marked/hljs/KaTeX 渲染管线
189
+ │ ├── render.js # 文件 → HTML 渲染(含 CSP 下发)
190
+ │ ├── render-cache.js # 渲染结果 LRU 缓存
191
+ │ ├── fts.js # FTS5 全文索引
192
+ │ ├── categories.js # 分类名内存缓存
193
+ │ ├── view-counts.js # 浏览数缓冲批量回写
194
+ │ ├── zip.js # ZIP 上传(安全校验/解压/分类)
195
+ │ ├── dispatch.js # MCP 进程内请求分发(绕过 TCP 自调用)
196
+ │ └── middleware/ # 鉴权 + 文件加载中间件
197
+ ├── logger.js # 结构化 JSON Lines 日志
198
+ ├── mailer.js # SMTP 邮件(验证码/验证链接)
199
+ ├── mcp-server.js # MCP Streamable HTTP 端点(/mcp)
200
+ ├── migrations.js # 数据库迁移 runner
201
+ ├── migrations/ # 按序执行的 schema 迁移文件(001-012)
202
+ ├── skills-registry.js # 扫描 skills/ 目录,提供 skill 列表/详情/zip 打包
203
+ ├── templates/ # Markdown 渲染样式模板(default/github/academic/dark-pro)
204
+ ├── package.json
205
+ ├── build.js # esbuild 打包前端 → public/dist
206
+ ├── Dockerfile
207
+ ├── docker-compose.yml
208
+ ├── .env.example # 环境变量示例
209
+ ├── .mcp.json # MCP 客户端配置示例
210
+ ├── docs/
211
+ │ ├── api.md # REST API 完整参考
212
+ │ └── design/ # 设计文档
213
+ ├── skills/
214
+ │ └── jpage-upload/ # Claude Code / Desktop skill
215
+ │ └── SKILL.md
216
+ ├── test/ # 单元 + 集成测试(node:test + supertest)+ e2e harness
217
+ ├── data/ # SQLite 数据库、上传文件与会话存储(运行时自动创建)
218
+ └── public/ # 前端静态资源
219
+ ├── index.html
220
+ ├── css/style.css
221
+ ├── js/ # 按页拆分的 ES 模块
222
+ └── dist/ # 构建产物(npm run build 生成,git 忽略)
223
+ ```
224
+
225
+ ## REST API
226
+
227
+ 端口 `8858`(`PORT` 可覆盖)。所有写入端点要求登录或 Bearer token。完整参考见 [docs/api.md](docs/api.md)。
228
+
229
+ ### 鉴权
230
+
231
+ | 端点 | 方法 | 说明 |
232
+ |---|---|---|
233
+ | `/api/auth/me` | GET | 当前登录信息(返回 `{id, username, email, emailVerified, role}`) |
234
+ | `/api/auth/login` | POST | 登录(`{account, password}` 或 `{username, password}`,自动识别用户名或邮箱) |
235
+ | `/api/auth/register` | POST | 注册(需 `ALLOW_REGISTRATION=true`) |
236
+ | `/api/auth/logout` | POST | 登出 |
237
+ | `/api/auth/change-password` | POST | 修改密码(所有用户可用) |
238
+ | `/api/auth/profile` | POST | 编辑个人资料(用户名/邮箱) |
239
+ | `/api/auth/send-register-code` | POST | 发送注册验证码(需开放注册) |
240
+ | `/api/auth/verify-email` | GET | 验证邮箱 token |
241
+ | `/api/auth/smtp-status` | GET | SMTP 是否已配置 |
242
+ | `/api/auth/registration-status` | GET | 注册是否开放 |
243
+
244
+ ### 用户管理(仅 admin)
245
+
246
+ | 端点 | 方法 | 说明 |
247
+ |---|---|---|
248
+ | `/api/users` | GET | 列出所有用户 |
249
+ | `/api/users` | POST | 创建用户 |
250
+ | `/api/users/:id` | PUT | 更新角色或重置密码 |
251
+ | `/api/users/:id` | DELETE | 删除用户,文件转交 admin |
252
+
253
+ ### API Token
254
+
255
+ | 端点 | 方法 | 说明 |
256
+ |---|---|---|
257
+ | `/api/tokens` | GET | 列出自己的 Token |
258
+ | `/api/tokens` | POST | 创建 Token(明文仅返回一次) |
259
+ | `/api/tokens/:id` | DELETE | 删除 Token |
260
+
261
+ ### 文件管理
262
+
263
+ | 端点 | 方法 | 说明 |
264
+ |---|---|---|
265
+ | `/api/files` | GET | 列出文件(admin 看全部,普通用户看自己的 + 公开的) |
266
+ | `/api/files/search` | GET | 全文 + 文件名搜索(分页、过滤) |
267
+ | `/api/files/upload` | POST | multipart 上传(支持 `.html`/`.htm`/`.md`/`.markdown`/`.zip`,50MB) |
268
+ | `/api/files/upload-json` | POST | JSON 上传(`{name, content, isPublic?}`) |
269
+ | `/api/files/batch` | POST | 批量操作(删除/公开/私有/分类,≤200) |
270
+ | `/api/files/:id` | GET | 单文件元数据 |
271
+ | `/api/files/:id` | PUT | 重命名或切换公开/私有 |
272
+ | `/api/files/:id` | DELETE | 删除文件 |
273
+ | `/api/files/:id/content` | GET | 返回原始文本 |
274
+ | `/api/files/:id/render` | GET | 返回渲染后 HTML |
275
+ | `/api/files/:id/download` | GET | 流式下载文件(Bundle 以 ZIP 下载) |
276
+ | `/api/files/:id/asset/*` | GET | Bundle 资源文件访问 |
277
+ | `/api/files/:id/overwrite` | POST | 覆盖上传(自动版本备份) |
278
+ | `/api/files/:id/versions` | GET | 版本历史列表 |
279
+ | `/api/files/:id/versions/:ver/restore` | POST | 恢复到指定版本 |
280
+ | `/api/files/:id/stats` | GET | 访问统计(viewCount/daily7/daily30) |
281
+ | `/s/:key` | GET | 短链接渲染页面 |
282
+
283
+ ### 标签
284
+
285
+ | 端点 | 方法 | 说明 |
286
+ |---|---|---|
287
+ | `/api/tags` | GET | 列出所有标签(含 file_count) |
288
+ | `/api/tags` | POST | 创建标签 |
289
+ | `/api/tags/:id` | DELETE | 删除标签 |
290
+ | `/api/files/:id/tags` | PUT | 替换文件的标签列表 |
291
+
292
+ ### 收藏
293
+
294
+ | 端点 | 方法 | 说明 |
295
+ |---|---|---|
296
+ | `/api/files/:id/star` | POST | 收藏文件 |
297
+ | `/api/files/:id/star` | DELETE | 取消收藏 |
298
+
299
+ ### 分类
300
+
301
+ | 端点 | 方法 | 说明 |
302
+ |---|---|---|
303
+ | `/api/categories` | GET | 列出分类(含 file_count) |
304
+ | `/api/categories` | POST | 创建分类 |
305
+ | `/api/categories/:id` | PUT | 重命名分类(仅 admin) |
306
+ | `/api/categories/:id` | DELETE | 删除分类(仅 admin) |
307
+ | `/api/files/:id/category` | PUT | 设置文件分类 |
308
+
309
+ ### 内容模板
310
+
311
+ | 端点 | 方法 | 说明 |
312
+ |---|---|---|
313
+ | `/api/content-templates/public` | GET | 公开模板列表(无需登录) |
314
+ | `/api/content-templates` | GET | 当前用户模板列表 |
315
+ | `/api/content-templates` | POST | 创建模板 |
316
+ | `/api/content-templates/:id` | PUT/DELETE | 更新/删除模板(仅所有者) |
317
+ | `/api/content-templates/:id/use` | POST | 基于模板创建文件 |
318
+ | `/api/templates` | GET | 样式模板(渲染皮肤) |
319
+
320
+ ### 管理后台(仅 admin)
321
+
322
+ | 端点 | 方法 | 说明 |
323
+ |---|---|---|
324
+ | `/api/admin/export` | GET | 导出数据库备份 |
325
+ | `/api/admin/import` | POST | 导入备份 |
326
+ | `/api/admin/stats` | GET | 系统统计 |
327
+
328
+ ### Skills
329
+
330
+ | 端点 | 方法 | 说明 |
331
+ |---|---|---|
332
+ | `/api/skills` | GET | 列出已安装的 skill 包 |
333
+ | `/api/skills/:name` | GET | skill 详情 |
334
+ | `/api/skills/:name/download` | GET | ZIP 下载整个 skill 目录 |
335
+
336
+ 完整 API 文档见 [docs/api.md](docs/api.md)。
337
+
338
+ ## MCP / AI 集成
339
+
340
+ 即页内置 [MCP Streamable HTTP](https://modelcontextprotocol.io) 端点,让 Claude Code、Claude Desktop 等 AI 工具能够直接上传、管理文件。
341
+
342
+ ### 启用
343
+
344
+ 设置全局 `MCP_TOKEN` 环境变量,或使用任意用户级 API Token(`jp_` 前缀)即可启用 `/mcp`。两者二选一:
345
+
346
+ ```bash
347
+ MCP_TOKEN=your-secret-token
348
+ ```
349
+
350
+ ### 客户端配置
351
+
352
+ **Claude Code** — 把以下配置放到项目根 `.mcp.json` 或合并到 `~/.claude.json`:
353
+
354
+ ```json
355
+ {
356
+ "mcpServers": {
357
+ "jpage": {
358
+ "type": "http",
359
+ "url": "http://localhost:8858/mcp",
360
+ "headers": {
361
+ "Authorization": "Bearer ${env.MCP_TOKEN}"
362
+ }
363
+ }
364
+ }
365
+ }
366
+ ```
367
+
368
+ **Claude Desktop** — 把 `mcpServers` 块合并到 `~/Library/Application Support/Claude/claude_desktop_config.json`。
369
+
370
+ ### 能力
371
+
372
+ **Tools**(15 个):
373
+
374
+ | 工具 | 用途 |
375
+ |---|---|
376
+ | `upload_file` | 上传 HTML 或 Markdown,返回预览链接 |
377
+ | `list_files` | 列出所有文件 |
378
+ | `get_file_content` | 读取文件原文 |
379
+ | `get_file_url` | 获取文件预览 URL |
380
+ | `rename_file` | 重命名文件 |
381
+ | `delete_file` | 删除文件 |
382
+ | `list_file_versions` | 查看文件版本历史 |
383
+ | `restore_file_version` | 回滚到指定版本 |
384
+ | `list_tags` | 列出标签 |
385
+ | `add_tags_to_file` | 为文件添加标签 |
386
+ | `star_file` | 收藏文件 |
387
+ | `unstar_file` | 取消收藏 |
388
+ | `list_categories` | 列出分类 |
389
+ | `create_category` | 创建分类 |
390
+ | `set_file_category` | 设置文件分类 |
391
+
392
+ **Resources**(2 个):
393
+
394
+ | URI | 说明 |
395
+ |---|---|
396
+ | `jpage://files` | 所有文件元数据(JSON 列表) |
397
+ | `jpage://file/{id}` | 单文件正文(≤ 256KB) |
398
+
399
+ ### 配套 Skill
400
+
401
+ 仓库内 `skills/jpage-upload/SKILL.md` 是 Claude Code / Desktop 的开箱即用技能。安装后,AI 生成 HTML、Markdown、报告、可视化等内容时会自动上传到即页并返回预览链接。
402
+
403
+ ```bash
404
+ ln -s "$(pwd)/skills/jpage-upload" ~/.claude/skills/jpage-upload
405
+ ```
406
+
407
+ ### Web 管理
408
+
409
+ 登录后首页底部有 **AI 技能 (Skills)** 区块,可查看详情、下载 zip 包。新增 Skill 只需在 `skills/<name>/SKILL.md` 编写 frontmatter,重启服务即可自动发现。
410
+
411
+ ### 调试
412
+
413
+ ```bash
414
+ npx -y @modelcontextprotocol/inspector http://localhost:8858/mcp
415
+ ```
416
+
417
+ ## 使用场景
418
+
419
+ - **AI 生成内容分享** — Claude Code、Cursor 等工具生成的 HTML 报告、可视化页面,一键上传获得可分享链接
420
+ - **技术文档协作** — Markdown 笔记、会议纪要、项目报告,上传后自动渲染代码高亮、数学公式、流程图
421
+ - **静态页面托管** — 单页 HTML Demo、原型、落地页,无需配置服务器
422
+ - **临时文件分享** — 任何 HTML/Markdown 文件,拖入即得链接,无需注册账号
423
+ - **版本管理** — 迭代更新的文档自动保留历史版本,随时回滚
424
+
425
+ ## 为什么做这个
426
+
427
+ 现有的方案要么太重(需要配置服务器、域名、CI),要么太封闭(绑定特定平台)。
428
+
429
+ 即页只想做一件事:让静态内容的分享回归简单。拖入文件,得到一个链接。支持可选的多用户体系,但默认开箱即用——拖入文件即得链接,匿名也能分享公开文件,无需注册。
430
+
431
+ ## 协议
432
+
433
+ MIT