nex_docus/README.md

184 lines
8.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# NEX Docus 文档管理平台
<div align="center">
轻量、可自托管的团队文档中心:文件系统存储内容,数据库管理权限,内置 AI 知识库问答。
v1.0.0 · FastAPI + React 18 + MySQL 8 + Redis
</div>
---
## ✨ 核心特性
- 📁 **文件即真理**:文档正文以 Markdown 文件形式存放在磁盘(`storage/projects/<uuid>/…`),数据库只保存权限与元数据,备份/迁移只需拷目录。
- 📝 **Markdown 编辑**:基于 ByteMD 的编辑器,支持 **编辑 / 分栏 / 预览** 三态切换,右侧悬浮目录(TOC)在纯编辑模式下同样可用;支持 GFM、代码高亮、Frontmatter、emoji、图片上传。
- 🌲 **无限层级目录树**:文件/文件夹创建、重命名、拖拽移动、排序。
- 👥 **团队协作**:项目成员与项目内角色(admin / editor / viewer),公开项目与「参与项目」列表。
- 🔎 **双引擎检索**:本地全文检索(Whoosh + jieba 中文分词)+ 向量检索(ZVec / 远程 Embedding)。
- 🤖 **AI 知识库问答**:基于项目文档的 RAG 对话,返回引用文件与命中片段,可中断、可回看思考过程与耗时。
- 🧩 **模型配置中心**:在系统管理里维护 Chat / Embedding 模型(OpenAI 兼容接口、本地 sentence-transformers),运行时热切换。
- 🔗 **分享与预览**:项目/单文件分享链接(可带访问密码)、Markdown / PDF / 图片预览,PDF 支持服务端导出。
- 🔐 **RBAC**:用户 / 角色 / 菜单与按钮级权限点,侧边栏按授权动态生成。
- 📄 **通知与审计**:站内通知中心、全量操作日志检索。
- 🔄 **Git 双向同步**:项目可绑定 Git 仓库,按目录同步文档。
- 🛰️ **MCP 接入**:为 MCP Bot 提供凭证与文档读写能力。
- 🌗 **明暗双主题**:全站统一设计令牌(`styles/design-tokens.css` + antd 主题),跟随系统或手动切换。
## 🏗️ 技术栈
### 后端
| 组件 | 选型 |
| --- | --- |
| Web 框架 | FastAPI 0.109 + Uvicorn(全异步) |
| ORM | SQLAlchemy 2.0(asyncio + aiomysql) |
| 数据库 | MySQL 8.0(utf8mb4) |
| 缓存/队列 | Redis 7 |
| 认证 | JWT(python-jose)+ bcrypt 密码哈希 |
| 检索 | Whoosh3 + jieba(全文)、ZVec + sentence-transformers / 远程 Embedding(向量) |
| 文档处理 | markdown、weasyprint(PDF)、python-magic |
| 集成 | OpenAI 兼容 LLM 接口、系统 `git` 命令(subprocess 调用)、MCP SDK |
### 前端
| 组件 | 选型 |
| --- | --- |
| 框架 | React 18 + React Router v6 |
| 构建 | Vite 5(`manualChunks` 分包、全部路由 lazy 加载) |
| UI | Ant Design 5 + 自研设计令牌(无 Tailwind / postcss) |
| 状态 | Zustand + Axios 统一封装 |
| Markdown | ByteMD(`@bytemd/react` + gfm/highlight/frontmatter/breaks/gemoji)+ react-markdown 渲染 |
| 其它 | react-pdf / pdfjs-dist、react-virtuoso、antd-img-crop |
## 📦 项目结构
```
NexDocus/
├── backend/ # FastAPI 后端
│ ├── app/
│ │ ├── api/v1/ # API 路由(认证/项目/文件/检索/对话/分享/系统…)
│ │ ├── core/ # 配置、数据库、安全、依赖注入、幂等迁移
│ │ ├── models/ # SQLAlchemy 模型(18 张表)
│ │ ├── schemas/ # Pydantic Schema
│ │ ├── services/ # 业务逻辑(存储、检索、向量化、RAG、Git、导出…)
│ │ └── mcp/ # MCP Streamable HTTP 接入(凭证鉴权 + 工具注册)
│ ├── scripts/ # 数据库初始化脚本(随代码走,Docker 构建上下文需要)
│ ├── tests/ # pytest 用例
│ └── main.py # 应用入口
│
├── frontend/ # React 前端
│ └── src/
│ ├── api/ # 接口封装
│ ├── components/ # 通用组件(Feedback 统一提示、MainLayout…)
│ ├── data/ # 静态配置数据
│ ├── pages/ # 页面(全部 lazy 加载)
│ ├── stores/ # Zustand
│ ├── styles/ # design-tokens.css 等全局样式
│ ├── theme/ # antd 主题(明/暗)
│ └── utils/
│
├── scripts/ # 运维/开发脚本(start / stop / deploy)
├── docs/ # 全部文档(见 docs/README.md)
├── storage/ # 运行期文件存储(已 gitignore)
├── backup/ # 数据库备份产物(已 gitignore)
├── .run/ # 本地 pid / 日志(已 gitignore)
├── docker-compose.yml # 容器编排
└── .env.example # Docker 部署环境变量模板
```
## 🚀 快速开始
### 环境要求
- Python **3.10+**(推荐 3.12)
- Node.js **18+**
- MySQL **8.0**、Redis **7**(已有实例亦可,Docker 部署会自动拉起)
- 启用 Git 同步时需要本机存在 `git` 可执行文件(后端镜像已内置)
### 方式一:一键启动(本地开发,推荐)
```bash
./scripts/start.sh
```
首次运行会:创建 `backend/venv` → 生成 `backend/.env` 模板(**此时会停下**,请填好 MySQL/Redis 连接信息后重新执行)→ 安装前后端依赖 → 真实校验 MySQL/Redis 连通性 → 幂等初始化数据库 → 拉起后端与前端。
```bash
./scripts/start.sh --backend # 只启动后端
./scripts/start.sh --frontend # 只启动前端
./scripts/start.sh --install # 只准备环境,不启动服务
./scripts/start.sh --init-db # 强制重跑数据库初始化
./scripts/start.sh --port 8001 # 换端口(环境变量优先,不改 .env)
./scripts/start.sh --daemon # 启动后立即返回(后台常驻)
./scripts/stop.sh # 停止
```
启动完成后:前端 http://localhost:5173 · 后端 http://localhost:8000 · 接口文档 http://localhost:8000/docs
### 方式二:Docker Compose(服务器部署)
```bash
cp .env.example .env # 按注释修改密码/端口/存储路径
./scripts/deploy.sh init # 生成配置、构建镜像、初始化数据库
./scripts/deploy.sh start
./scripts/deploy.sh status
```
细节见 [docs/deploy/README.md](docs/deploy/README.md)。
### 默认账号
| 场景 | 用户名 | 密码 |
| --- | --- | --- |
| `scripts/start.sh` / `backend/scripts/init_db.py` | `admin` | `admin@123` |
| Docker 部署(`.env.example` 默认值) | `admin` | `Admin@123456` |
可用 `ADMIN_USERNAME` / `ADMIN_PASSWORD` / `ADMIN_EMAIL` / `ADMIN_NICKNAME` 覆盖;**首次登录后请立即修改密码**。
## 📖 文档索引
| 文档 | 内容 |
| --- | --- |
| [docs/README.md](docs/README.md) | 文档地图(从这里开始) |
| [docs/quickstart.md](docs/quickstart.md) | 开发环境快速上手、常见启动问题 |
| [docs/deploy/README.md](docs/deploy/README.md) | Docker 部署、升级、备份与恢复 |
| [docs/database.md](docs/database.md) | 数据库 18 张表结构与初始化链路 |
| [docs/manual/user-guide.md](docs/manual/user-guide.md) | 面向使用者的功能手册 |
| [docs/sdd/](docs/sdd/) | 规格驱动开发文档:愿景、架构、ADR、DV 规格、发布记录 |
| [scripts/README.md](scripts/README.md) | 脚本清单与约定 |
## 🧪 开发与质量
```bash
# 前端:静态检查与构建
cd frontend && npm run lint && npm run build
# 后端:pytest(用例较少,见发布报告 OI 清单)
cd backend && ./venv/bin/pip install -r requirements-dev.txt
cd backend && ./venv/bin/python -m pytest
```
- 前端统一使用 `@/` 别名指向 `frontend/src`;新页面必须在 `App.jsx` 用 `lazy()` 注册。
- 交互提示统一走 `components/Feedback` 的 `Toast`(`Toast.confirm` 替代 `Modal.confirm`)。
- 颜色/圆角/间距一律取 `styles/design-tokens.css` 与 antd token,禁止硬编码色值。
- 数据库结构变更:改 `app/models/`,并在 `app/core/migrations.py` 增加幂等补列逻辑;**不要**再往仓库里追加一次性 `.sql`。
## 🔒 安全要点
- 密码 bcrypt 存储;JWT 过期时间由 `ACCESS_TOKEN_EXPIRE_MINUTES` 控制。
- 文件路径全部经过规范化校验,拒绝路径穿越;上传大小与类型受限。
- `DEBUG=True` 会打印全量 SQL,**生产必须关闭**。
- `SECRET_KEY`、数据库/Redis 密码、Git Token 必须由环境注入,禁止提交到仓库;`backend/.env`、`.env` 已在 `.gitignore` 中。
- 分享链接的访问密码当前为明文存储于 `share_links.access_pass`,见发布报告 P2 项。
## 📄 许可证
Copyright © 2026 Mula.liu
---
<div align="center">
**Made with ❤️ by Mula.liu**
</div>