Files
raisfast/docs/strapi-gap-analysis.md
T

320 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Strapi 替代方案 — 差距分析与路线图
> 目标:高性能、高安全性、高扩展性的 Strapi 替代品
## 当前完成度:约 55%
| 类别 | 完成度 | 说明 |
|------|--------|------|
| **核心架构** | 95% | Handler→Service→Model、插件系统、CMS 引擎 |
| **认证/权限** | 80% | JWT + RBAC,缺密码重置 |
| **Content Type** | 90% | Builder UI + 动态 CRUD,缺组件/动态区块 |
| **Admin UI** | 70% | 20 个模块,缺 Relation Picker、批量编辑 |
| **媒体** | 50% | 上传/缩略图,缺裁剪/焦点/多格式 |
| **基础设施** | 75% | Worker/Cron/Webhook/搜索,缺 SMTP/重试日志 |
| **Strapi 标配功能** | 20% | 缺 GraphQL/内容 i18n/导入导出/主题 |
---
## 逐项差距分析
### 1. GraphQL API — 缺失 (0%)
**现状**:项目仅支持 REST API,所有路由注册在 `/api/v1/`。Cargo.toml 中无任何 GraphQL crate。
**Strapi**:提供完全自动生成的 GraphQL APIqueries、mutations、subscriptions),支持过滤、分页、排序、关联自动解析。
**差距**
- 无 GraphQL schema 生成
- 无 GraphQL 查询引擎
- 无 subscription(实时数据推送)
- 无 GraphQL playground
---
### 2. Content-Type Builder UI — 完成 (~90%)
**现状**
- 完整的 Content-Type Builder 页面(1013 行),支持创建/编辑 content type
- 字段类型:text, richtext, email, password, uid, integer, bigint, decimal, float, date, datetime, time, boolean, enum, json, media, relation
- 字段配置:required, unique, private, immutable, label, description, default, max_length, min/max, enum_values, relation config, media config
- 字段上下移动排序、删除字段
- draft/publish, timestamps, soft_delete, slug_field 开关
**Strapi 额外能力**
- 拖拽排序(本项目用上下箭头)
- 组件/可组合类型(Component,可复用字段组)
- 动态区块(Dynamic Zone,运行时选择组件类型)
- Schema 实时预览
---
### 3. 媒体库 — 部分 (~50%)
**现状**
- 上传/下载/删除,MIME 校验 + magic-byte 验证
- 网格/列表视图、搜索、按类型过滤、排序
- 详情面板(类型、大小、尺寸、URL、日期)
- 自动缩略图生成(WebP,后台 Worker
- 存储抽象(Local + S3
- 统计端点
**Strapi 额外能力**
- 裁剪/焦点编辑 UI
- 多格式/响应式图片变体(srcset)
- 焦点选择(smart cropping
- 文件夹/相册组织
- 多文件上传进度条
---
### 4. 内容 i18n(每条记录多语言)— 缺失 (0%)
**现状**:仅有 **UI 层面** 的 i18nrust_i18n + next-intl,支持 en/zh-CN)。posts 表无 locale 列,无 translation_of 外键,无记录级翻译管理。
**Strapi**:每条内容可有 en/zh/fr 等多语言版本,管理员在编辑界面切换语言,支持回退 locale。
**差距**
- 无 per-record 多语言模型
- 无语言切换 UI
- 无 fallback locale 逻辑
- 无翻译同步机制
---
### 5. Admin 关联管理 — 部分 (~30%)
**现状**Content-Type Builder 支持定义 relation 字段,后端有完整的 relation 解析(批量 ManyToOne/OneToOne/OneToMany/ManyToMany)。但 **前端 relation 字段渲染为普通文本 Input**,用户必须手动输入关联记录 ID。
**Strapi**:完整的 Relation Picker,支持搜索、分页、多选(ManyToMany)、从 Picker 内直接创建关联记录。
**差距**
- 无下拉/combobox 浏览选择关联记录
- 无搜索联想
- 无分页浏览
- 无内联创建关联记录
- 不显示关联记录的 title/name(仅显示原始 ID
---
### 6. 用户/角色管理 UI — 完成 (~80%)
**现状**
- 用户管理页(列表、创建、改角色、分页)
- RBAC 页(角色 CRUD、权限管理、系统角色保护)
- 后端完整的 role/permission 数据库操作
**Strapi 额外能力**
- 管理员编辑其他用户的资料(email/username/bio
- 用户封禁/停用/暂停
- 用户头像管理
- 更细粒度的字段级权限控制
- 可视化权限矩阵编辑器
---
### 7. Webhook 投递重试 — 部分 (~60%)
**现状**
- Worker 框架级指数退避重试(base × 2^attempt + jitter
- 最大重试次数(默认 3),死信队列
- 死信任务可手动重试
- HMAC-SHA256 签名
- Webhook handler 非 2xx 返回 error 触发重试
**Strapi 额外能力**
- 每个订阅独立配置重试策略
- 投递日志/历史(每次尝试的响应码、响应体)
- Webhook 调试 UI
- 自动熔断/禁用失败 webhook
---
### 8. 邮件发送 (SMTP) — 缺失 (0%,仅有 stub)
**现状**`SendWelcomeEmailHandler` 仅 log 到控制台,有注释掉的 SMTP 代码。AppConfig 无 SMTP 字段,Cargo.toml 无 lettre 依赖。
**Strapi**:完整的邮件 Provider 系统,支持 SendGrid、Mailgun、Amazon SES、自定义 SMTP。
---
### 9. 密码重置流程 — 缺失 (0%)
**现状**Auth handler 支持 register/login/refresh/logout/change_password。无 forgot-password/reset-password endpoint,无 reset token,无相关 UI。
**Strapi**:完整的 forgot-password → 邮件 token → reset-password 流程。
---
### 10. API 版本管理 — 部分 (~20%)
**现状**:所有 API 路由挂在 `/api/v1/`,仅为 URL 前缀。
**Strapi**:支持多版本并行、版本协商、废弃通知。
---
### 11. 插件市场 — 部分 (~50%)
**现状**
- 插件管理 UI(列表、启用/禁用/重载/删除)
- 完整插件系统(WASM/JS/Lua 三引擎)
- 插件热重载、健康监控、VFS、权限、存储
- 扩展安装/启用/禁用/卸载
**Strapi 额外能力**:在线 Marketplace,浏览/搜索/一键安装社区插件。
---
### 12. 主题系统 — 极少 (~10%)
**现状**:仅有 dark/light CSS 切换(next-themes + Tailwind dark mode)。
**Strapi**:管理面板主题引擎(自定义颜色/logo/字体)+ 公开主题市场 + 模板引擎。
---
### 13. 导入/导出 — 缺失 (0%)
**现状**:无任何导入导出功能。
**Strapi**WordPress 导入器、CSV/JSON 导入、全库导出/导入、实例间迁移。
---
### 14. 内容审核 — 部分 (~60%)
**现状**
- 评论审核队列 UI(状态过滤、审批/拒绝/删除、批量操作)
- 评论创建默认 pending,仅 approved 公开显示
- 插件 hook `on_comment_creating`
- 嵌套评论深度验证(最多 3 层)
**Strapi 额外能力**:垃圾评论检测/过滤、自动审批规则、AI 内容审核。
---
### 15. 定时发布 — 部分 (~40%)
**现状**
- `ScheduledPublishHandler` 完整实现并通过测试
- 已注册到 handler registry
- **但没有任何代码触发它**`JobEnqueuer` 不处理 `ScheduledPublish`DTO 无 `publish_at` 字段,无 UI 设置发布时间
**Strapi**:编辑器设置发布日期,系统自动在指定时间发布。
---
## 路线图
### Phase 1 — 补齐基础体验(2-3 周)
目标:**用户能完整使用,不卡在基本流程上**
| # | 任务 | 优先级 | 工作量 |
|---|------|--------|--------|
| 1.1 | SMTP 邮件发送(lettre + 配置) | P0 | 2天 |
| 1.2 | 密码重置流程(forgot/reset endpoint + 邮件) | P0 | 1天 |
| 1.3 | 定时发布对接(handler 已有,加 glue code | P0 | 0.5天 |
| 1.4 | Relation Picker UI(下拉搜索选择关联记录) | P0 | 2天 |
| 1.5 | Webhook 投递日志(delivery history + 重试 UI | P1 | 1天 |
### Phase 2 — Admin UI 打磨(2-3 周)
目标:**Admin 体验不输 Strapi**
| # | 任务 | 工作量 |
|---|------|--------|
| 2.1 | Content-Type Builder 拖拽排序(dnd-kit 替代箭头) | 1天 |
| 2.2 | 批量操作(列表页多选 + 批量删除/发布/移动) | 2天 |
| 2.3 | 媒体库增强(文件夹组织 + 多文件上传进度条) | 2天 |
| 2.4 | 内联编辑器(列表页直接编辑字段,不用进详情) | 2天 |
| 2.5 | Admin 全局搜索(Cmd+K 弹窗,搜索所有资源) | 1天 |
### Phase 3 — 核心差异化功能(3-4 周)
目标:**补齐 Strapi 标配 + 发挥 Rust 优势**
| # | 任务 | 工作量 |
|---|------|--------|
| 3.1 | GraphQL APIasync-graphql + 自动 schema 生成) | 5天 |
| 3.2 | 内容 i18nlocale 列 + translation_of FK + Admin 切换) | 3天 |
| 3.3 | 导入导出(JSON/CSV + WordPress 导入器) | 3天 |
| 3.4 | 实时 APISSE → WebSocket 升级 + 订阅过滤) | 2天 |
| 3.5 | Dashboard 仪表盘(统计图表 + 最近活动 + 快捷操作) | 2天 |
### Phase 4 — 开发者体验(2-3 周)
目标:**让其他开发者愿意用**
| # | 任务 | 工作量 |
|---|------|--------|
| 4.1 | 文档站(Getting Started + API Reference + Plugin 开发指南) | 5天 |
| 4.2 | Demo 站点(在线体验,预装示例数据) | 2天 |
| 4.3 | 一键部署(`docker compose up` 3 分钟跑起来) | 2天 |
| 4.4 | Plugin CLI`rblog plugin new/create/publish` | 3天 |
| 4.5 | TypeScript SDK 生成(从 OpenAPI spec 自动生成) | 2天 |
### Phase 5 — 插件生态(3-4 周)
目标:**有可用的官方插件**
| # | 任务 | 工作量 |
|---|------|--------|
| 5.1 | 插件市场 UI(浏览/搜索/一键安装) | 3天 |
| 5.2 | 插件注册中心(简单的 registry API + 存储) | 3天 |
| 5.3 | 官方插件:Stripe 支付 | 3天 |
| 5.4 | 官方插件:Algolia/Meilisearch 搜索 | 2天 |
| 5.5 | 官方插件:邮件营销 | 3天 |
| 5.6 | 官方插件:AI 内容生成 | 3天 |
### Phase 6 — 企业级功能(4-6 周)
目标:**能卖给企业**
| # | 任务 | 工作量 |
|---|------|--------|
| 6.1 | SSO/SAML | 5天 |
| 6.2 | 审计日志增强(导出 CSV、合规报告) | 2天 |
| 6.3 | 内容审批工作流(多级审批、评论批注) | 5天 |
| 6.4 | 主题引擎(模板系统 + 主题市场) | 5天 |
| 6.5 | PostgreSQL 生产支持 | 5天 |
| 6.6 | 多数据库连接(读写分离) | 3天 |
---
## 总时间估算
| 阶段 | 时间 | 里程碑 |
|------|------|--------|
| Phase 1 | 2-3 周 | 可自用的完整 CMS |
| Phase 2 | 2-3 周 | Admin 体验达标 |
| Phase 3 | 3-4 周 | 功能对齐 Strapi |
| Phase 4 | 2-3 周 | 开源发布就绪 |
| Phase 5 | 3-4 周 | 有插件生态 |
| Phase 6 | 4-6 周 | 企业可用 |
| **总计** | **16-23 周** | Strapi 替代 |
---
## 核心竞争优势
### vs Strapi
| 维度 | raisfast | Strapi |
|------|-----------|--------|
| **性能** | 单实例 10x QPS,内存 1/10 | Node.js 需要集群才能到千级 QPS |
| **部署** | 单二进制 30MB,零依赖 | Node.js 18+ + npm + PostgreSQL200MB+ |
| **插件安全** | WASM 沙箱隔离,插件崩溃不影响主进程 | JS 插件直接 require(),一个 crash 全挂 |
| **冷启动** | <100ms | 3-5 秒 |
| **二进制安全** | 编译型,源码不可逆 | JavaScript 源码可直接阅读 |
| **GC** | 无 GC 暂停 | V8 GC 导致 P99 延迟毛刺 |
| **单机密度** | 一台 1C1G VPS 跑几十个站点(SQLite) | 每个站点需要独立进程 + 数据库连接 |
### 独特卖点
1. **WASM 插件沙箱** — Strapi 完全没有的安全隔离机制,是构建可信插件市场的前提
2. **极致轻量部署** — 30MB 单文件替代 Node.js 全家桶,适合嵌入式、边缘、IoT 场景
3. **SQLite 原生架构** — 多租户托管成本极低(每站点一个 .db 文件),不依赖外部数据库
4. **三引擎插件** — WASM + JS + Lua,开发者可按需选择性能/生态平衡点