mirror of https://github.com/chaitin/PandaWiki.git
2190 lines
49 KiB
Markdown
2190 lines
49 KiB
Markdown
|
|
# PandaWiki 项目说明书
|
|||
|
|
|
|||
|
|
## 📋 目录
|
|||
|
|
|
|||
|
|
1. [项目概述](#项目概述)
|
|||
|
|
2. [核心特性](#核心特性)
|
|||
|
|
3. [技术架构](#技术架构)
|
|||
|
|
4. [系统要求](#系统要求)
|
|||
|
|
5. [安装部署](#安装部署)
|
|||
|
|
6. [开发指南](#开发指南)
|
|||
|
|
7. [API 文档](#api-文档)
|
|||
|
|
8. [配置说明](#配置说明)
|
|||
|
|
9. [安全策略](#安全策略)
|
|||
|
|
10. [贡献指南](#贡献指南)
|
|||
|
|
11. [许可证](#许可证)
|
|||
|
|
12. [社区支持](#社区支持)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 项目概述
|
|||
|
|
|
|||
|
|
### 🎯 项目简介
|
|||
|
|
|
|||
|
|
PandaWiki 是一款由 AI 大模型驱动的**开源知识库搭建系统**,旨在帮助用户快速构建智能化的产品文档、技术文档、FAQ 和博客系统。通过集成先进的大语言模型技术,PandaWiki 为用户提供 **AI 创作、AI 问答、AI 搜索** 等智能化功能。
|
|||
|
|
|
|||
|
|
### 🏢 开发团队
|
|||
|
|
|
|||
|
|
- **开发组织**: 长亭科技 (Chaitin Tech)
|
|||
|
|
- **项目仓库**: https://github.com/chaitin/PandaWiki
|
|||
|
|
- **官方网站**: https://ly.safepoint.cloud/Br48PoX
|
|||
|
|
- **当前版本**: v3.13.1
|
|||
|
|
|
|||
|
|
### 🎨 设计理念
|
|||
|
|
|
|||
|
|
PandaWiki 秉承"智能化、易用性、开放性"的设计理念:
|
|||
|
|
|
|||
|
|
- **智能化**: 深度集成 AI 大模型,提供智能创作、问答和搜索能力
|
|||
|
|
- **易用性**: 提供直观的管理界面和丰富的富文本编辑功能
|
|||
|
|
- **开放性**: 支持多种第三方集成和数据导入方式
|
|||
|
|
- **可扩展性**: 模块化架构设计,支持灵活的功能扩展
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 核心特性
|
|||
|
|
|
|||
|
|
### 🤖 AI 驱动功能
|
|||
|
|
|
|||
|
|
#### AI 辅助创作
|
|||
|
|
- 基于大语言模型的智能内容生成
|
|||
|
|
- 支持多种创作模式和风格调整
|
|||
|
|
- 实时内容优化和建议
|
|||
|
|
|
|||
|
|
#### AI 智能问答
|
|||
|
|
- 基于知识库内容的智能问答系统
|
|||
|
|
- 支持自然语言查询和上下文理解
|
|||
|
|
- 多轮对话和问题澄清能力
|
|||
|
|
|
|||
|
|
#### AI 增强搜索
|
|||
|
|
- 语义搜索和关键词搜索结合
|
|||
|
|
- 智能内容推荐和相关性排序
|
|||
|
|
- 支持模糊查询和同义词匹配
|
|||
|
|
|
|||
|
|
### 📝 内容管理功能
|
|||
|
|
|
|||
|
|
#### 富文本编辑器
|
|||
|
|
- **编辑器支持**: 兼容 Markdown 和 HTML 格式
|
|||
|
|
- **实时协作**: 基于 Tiptap 的多人实时编辑
|
|||
|
|
- **格式导出**: 支持导出为 Word、PDF、Markdown 等多种格式
|
|||
|
|
- **语法高亮**: 内置代码语法高亮和数学公式支持
|
|||
|
|
- **媒体支持**: 图片、视频、音频等多媒体内容管理
|
|||
|
|
|
|||
|
|
#### 内容组织
|
|||
|
|
- **知识库管理**: 支持多个独立知识库的创建和管理
|
|||
|
|
- **分类体系**: 灵活的文档分类和标签系统
|
|||
|
|
- **版本控制**: 文档版本历史和回滚功能
|
|||
|
|
- **权限控制**: 细粒度的访问权限管理
|
|||
|
|
|
|||
|
|
### 🔗 集成与扩展
|
|||
|
|
|
|||
|
|
#### 第三方应用集成
|
|||
|
|
- **网页挂件**: 支持嵌入到其他网站作为挂件
|
|||
|
|
- **聊天机器人**: 集成钉钉、飞书、企业微信等平台
|
|||
|
|
- **API 接口**: 完整的 RESTful API 支持
|
|||
|
|
- **Webhook**: 支持事件通知和自动化集成
|
|||
|
|
|
|||
|
|
#### 数据导入方式
|
|||
|
|
- **网页导入**: 根据 URL 直接导入网页内容
|
|||
|
|
- **批量导入**: 通过网站 Sitemap 批量导入
|
|||
|
|
- **RSS 订阅**: 自动同步 RSS 源内容
|
|||
|
|
- **文件导入**: 支持多种格式的离线文件导入
|
|||
|
|
- **第三方平台**: 支持从 Notion、语雀、Confluence 等平台导入
|
|||
|
|
|
|||
|
|
### 🎨 用户体验
|
|||
|
|
|
|||
|
|
#### 界面设计
|
|||
|
|
- **响应式设计**: 支持桌面端和移动端访问
|
|||
|
|
- **主题定制**: 支持明暗主题切换和自定义样式
|
|||
|
|
- **多语言支持**: 国际化界面设计
|
|||
|
|
- **无障碍访问**: 符合 Web 无障碍标准
|
|||
|
|
|
|||
|
|
#### 性能优化
|
|||
|
|
- **缓存机制**: 多层缓存提升访问速度
|
|||
|
|
- **CDN 支持**: 静态资源 CDN 加速
|
|||
|
|
- **懒加载**: 图片和内容的智能懒加载
|
|||
|
|
- **搜索优化**: 全文搜索和索引优化
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 技术架构
|
|||
|
|
|
|||
|
|
### 🏗️ 整体架构
|
|||
|
|
|
|||
|
|
PandaWiki 采用现代化的微服务架构设计,主要包含以下组件:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
|
|||
|
|
│ Web App │ │ Admin Panel │ │ API Gateway │
|
|||
|
|
│ (Next.js) │ │ (React+Vite) │ │ │
|
|||
|
|
└─────────────────┘ └─────────────────┘ └─────────────────┘
|
|||
|
|
│ │ │
|
|||
|
|
└───────────────────────┼───────────────────────┘
|
|||
|
|
│
|
|||
|
|
┌───────────────────────┼───────────────────────┐
|
|||
|
|
│ │ │
|
|||
|
|
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
|
|||
|
|
│ Backend API │ │ Consumer │ │ RAG Service │
|
|||
|
|
│ (Go) │ │ (Go) │ │ (Python) │
|
|||
|
|
└─────────────────┘ └─────────────────┘ └─────────────────┘
|
|||
|
|
│ │ │
|
|||
|
|
└───────────────────────┼───────────────────────┘
|
|||
|
|
│
|
|||
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|||
|
|
│ 基础设施层 │
|
|||
|
|
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
|
|||
|
|
│ │ PostgreSQL │ │ Redis │ │ MinIO │ │ NATS │ │
|
|||
|
|
│ │ (数据库) │ │ (缓存) │ │ (对象存储) │ │ (消息队列) │ │
|
|||
|
|
│ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │
|
|||
|
|
└─────────────────────────────────────────────────────────────────┘
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 🔧 后端技术栈
|
|||
|
|
|
|||
|
|
#### 核心框架
|
|||
|
|
- **编程语言**: Go 1.24.3
|
|||
|
|
- **Web 框架**: Echo v4.13.4
|
|||
|
|
- **依赖注入**: Google Wire v0.6.0
|
|||
|
|
- **配置管理**: Viper v1.20.1
|
|||
|
|
|
|||
|
|
#### 数据存储
|
|||
|
|
- **主数据库**: PostgreSQL (通过 GORM v1.26.1)
|
|||
|
|
- **缓存系统**: Redis v9.11.0
|
|||
|
|
- **对象存储**: MinIO v7.0.91
|
|||
|
|
- **消息队列**: NATS v1.42.0
|
|||
|
|
|
|||
|
|
#### AI 与机器学习
|
|||
|
|
- **模型集成**: ModelKit v2.0.6
|
|||
|
|
- **向量数据库**: 自研 RAG 服务
|
|||
|
|
- **多模型支持**:
|
|||
|
|
- OpenAI GPT 系列
|
|||
|
|
- DeepSeek 模型
|
|||
|
|
- Google Gemini
|
|||
|
|
- Ollama 本地模型
|
|||
|
|
- **Token 计算**: tiktoken-go v0.1.7
|
|||
|
|
|
|||
|
|
#### 第三方集成
|
|||
|
|
- **企业通讯**:
|
|||
|
|
- 钉钉 SDK v2.0.83
|
|||
|
|
- 飞书 SDK v3.4.20
|
|||
|
|
- 企业微信 API
|
|||
|
|
- Discord v0.29.0
|
|||
|
|
- **内容平台**:
|
|||
|
|
- Notion API v1.13.3
|
|||
|
|
- 语雀集成
|
|||
|
|
- Confluence 集成
|
|||
|
|
- **认证授权**:
|
|||
|
|
- JWT v5.3.0
|
|||
|
|
- LDAP v3.4.11
|
|||
|
|
- OAuth2 v0.30.0
|
|||
|
|
|
|||
|
|
#### 监控与可观测性
|
|||
|
|
- **链路追踪**: OpenTelemetry
|
|||
|
|
- **指标监控**: 自定义指标收集
|
|||
|
|
- **日志管理**: 结构化日志记录
|
|||
|
|
- **健康检查**: 内置健康检查端点
|
|||
|
|
|
|||
|
|
### 🎨 前端技术栈
|
|||
|
|
|
|||
|
|
#### 管理后台 (Admin Panel)
|
|||
|
|
- **框架**: React 19 + Vite 6.0.1
|
|||
|
|
- **UI 组件库**: Material-UI v6.2.0
|
|||
|
|
- **状态管理**: Redux Toolkit v2.5.0
|
|||
|
|
- **路由**: React Router DOM v7.0.2
|
|||
|
|
- **富文本编辑**: Tiptap v3.3.0
|
|||
|
|
- **表单处理**: React Hook Form v7.54.1
|
|||
|
|
- **数据可视化**: ECharts v5.6.0
|
|||
|
|
- **拖拽功能**: DnD Kit v6.3.1
|
|||
|
|
|
|||
|
|
#### 用户前台 (Web App)
|
|||
|
|
- **框架**: Next.js 15.4.6 + React 19.1.1
|
|||
|
|
- **UI 组件库**: Material-UI v7.1.0
|
|||
|
|
- **Markdown 渲染**: react-markdown v10.1.0
|
|||
|
|
- **代码高亮**: highlight.js v11.11.1
|
|||
|
|
- **数学公式**: KaTeX v0.16.22
|
|||
|
|
- **图表渲染**: Mermaid v11.9.0
|
|||
|
|
- **设备检测**: react-device-detect v2.2.3
|
|||
|
|
|
|||
|
|
#### 开发工具链
|
|||
|
|
- **包管理器**: pnpm 10.12.1
|
|||
|
|
- **类型检查**: TypeScript 5.8.3
|
|||
|
|
- **代码规范**: ESLint + Prettier
|
|||
|
|
- **API 生成**: cx-swagger-api v1.0.1
|
|||
|
|
- **Git 钩子**: Husky v9.1.7
|
|||
|
|
- **代码格式化**: lint-staged v16.1.5
|
|||
|
|
|
|||
|
|
### 🐳 容器化部署
|
|||
|
|
|
|||
|
|
#### Docker 配置
|
|||
|
|
- **API 服务**:
|
|||
|
|
- 开发版: `Dockerfile.api`
|
|||
|
|
- 生产版: `Dockerfile.api.pro`
|
|||
|
|
- **消费者服务**:
|
|||
|
|
- 开发版: `Dockerfile.consumer`
|
|||
|
|
- 生产版: `Dockerfile.consumer.pro`
|
|||
|
|
- **前端应用**:
|
|||
|
|
- 管理后台: `web/admin/Dockerfile`
|
|||
|
|
- 用户前台: `web/app/Dockerfile`
|
|||
|
|
|
|||
|
|
#### 构建工具
|
|||
|
|
- **后端构建**: Makefile + Go modules
|
|||
|
|
- **前端构建**: Vite (Admin) + Next.js (App)
|
|||
|
|
- **多阶段构建**: 优化镜像大小和安全性
|
|||
|
|
- **健康检查**: 内置容器健康检查
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 系统要求
|
|||
|
|
|
|||
|
|
### 🖥️ 硬件要求
|
|||
|
|
|
|||
|
|
#### 最低配置
|
|||
|
|
- **CPU**: 2 核心
|
|||
|
|
- **内存**: 4GB RAM
|
|||
|
|
- **存储**: 20GB 可用空间
|
|||
|
|
- **网络**: 稳定的互联网连接
|
|||
|
|
|
|||
|
|
#### 推荐配置
|
|||
|
|
- **CPU**: 4 核心或更多
|
|||
|
|
- **内存**: 8GB RAM 或更多
|
|||
|
|
- **存储**: 50GB SSD 存储
|
|||
|
|
- **网络**: 高速互联网连接
|
|||
|
|
|
|||
|
|
#### 生产环境配置
|
|||
|
|
- **CPU**: 8 核心或更多
|
|||
|
|
- **内存**: 16GB RAM 或更多
|
|||
|
|
- **存储**: 100GB+ SSD 存储
|
|||
|
|
- **网络**: 专用网络连接
|
|||
|
|
- **负载均衡**: 支持高可用部署
|
|||
|
|
|
|||
|
|
### 💻 软件要求
|
|||
|
|
|
|||
|
|
#### 操作系统
|
|||
|
|
- **Linux**: Ubuntu 20.04+ / CentOS 8+ / Debian 11+
|
|||
|
|
- **容器运行时**: Docker 20.x 或更高版本
|
|||
|
|
- **容器编排**: Docker Compose (可选)
|
|||
|
|
|
|||
|
|
#### 依赖服务
|
|||
|
|
- **数据库**: PostgreSQL 13+
|
|||
|
|
- **缓存**: Redis 6+
|
|||
|
|
- **对象存储**: MinIO 或兼容 S3 的存储服务
|
|||
|
|
- **消息队列**: NATS Server 2.8+
|
|||
|
|
|
|||
|
|
#### 开发环境
|
|||
|
|
- **Go**: 1.24.3 或更高版本
|
|||
|
|
- **Node.js**: 18+ (推荐使用 nvm 管理)
|
|||
|
|
- **pnpm**: 10.12.1 或更高版本
|
|||
|
|
- **Git**: 2.30+ 版本
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 安装部署
|
|||
|
|
|
|||
|
|
### 🚀 快速安装
|
|||
|
|
|
|||
|
|
#### 一键安装脚本
|
|||
|
|
|
|||
|
|
PandaWiki 提供了便捷的一键安装脚本,适用于大多数 Linux 系统:
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 使用 root 权限执行安装脚本
|
|||
|
|
bash -c "$(curl -fsSLk https://release.baizhi.cloud/panda-wiki/manager.sh)"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
安装过程说明:
|
|||
|
|
1. 脚本会自动检测系统环境
|
|||
|
|
2. 安装必要的依赖(Docker、Docker Compose 等)
|
|||
|
|
3. 下载并配置 PandaWiki 服务
|
|||
|
|
4. 初始化数据库和基础配置
|
|||
|
|
5. 启动所有必要的服务
|
|||
|
|
|
|||
|
|
#### 安装完成后的信息
|
|||
|
|
|
|||
|
|
安装成功后,终端会显示以下信息:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
SUCCESS 控制台信息:
|
|||
|
|
SUCCESS 访问地址(内网): http://192.168.1.100:2443
|
|||
|
|
SUCCESS 访问地址(外网): http://your-domain.com:2443
|
|||
|
|
SUCCESS 用户名: admin
|
|||
|
|
SUCCESS 密码: [随机生成的密码]
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 🔧 手动部署
|
|||
|
|
|
|||
|
|
#### 环境准备
|
|||
|
|
|
|||
|
|
1. **安装 Docker 和 Docker Compose**:
|
|||
|
|
```bash
|
|||
|
|
# Ubuntu/Debian
|
|||
|
|
curl -fsSL https://get.docker.com | sh
|
|||
|
|
sudo usermod -aG docker $USER
|
|||
|
|
|
|||
|
|
# 安装 Docker Compose
|
|||
|
|
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
|
|||
|
|
sudo chmod +x /usr/local/bin/docker-compose
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
2. **创建项目目录**:
|
|||
|
|
```bash
|
|||
|
|
mkdir -p /opt/pandawiki
|
|||
|
|
cd /opt/pandawiki
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 配置文件设置
|
|||
|
|
|
|||
|
|
1. **创建 docker-compose.yml**:
|
|||
|
|
```yaml
|
|||
|
|
version: '3.8'
|
|||
|
|
|
|||
|
|
services:
|
|||
|
|
postgres:
|
|||
|
|
image: postgres:15
|
|||
|
|
environment:
|
|||
|
|
POSTGRES_DB: pandawiki
|
|||
|
|
POSTGRES_USER: pandawiki
|
|||
|
|
POSTGRES_PASSWORD: your_password
|
|||
|
|
volumes:
|
|||
|
|
- postgres_data:/var/lib/postgresql/data
|
|||
|
|
ports:
|
|||
|
|
- "5432:5432"
|
|||
|
|
|
|||
|
|
redis:
|
|||
|
|
image: redis:7-alpine
|
|||
|
|
volumes:
|
|||
|
|
- redis_data:/data
|
|||
|
|
ports:
|
|||
|
|
- "6379:6379"
|
|||
|
|
|
|||
|
|
minio:
|
|||
|
|
image: minio/minio:latest
|
|||
|
|
command: server /data --console-address ":9001"
|
|||
|
|
environment:
|
|||
|
|
MINIO_ROOT_USER: minioadmin
|
|||
|
|
MINIO_ROOT_PASSWORD: minioadmin123
|
|||
|
|
volumes:
|
|||
|
|
- minio_data:/data
|
|||
|
|
ports:
|
|||
|
|
- "9000:9000"
|
|||
|
|
- "9001:9001"
|
|||
|
|
|
|||
|
|
nats:
|
|||
|
|
image: nats:2.10-alpine
|
|||
|
|
ports:
|
|||
|
|
- "4222:4222"
|
|||
|
|
- "8222:8222"
|
|||
|
|
|
|||
|
|
pandawiki-api:
|
|||
|
|
image: chaitin/pandawiki-api:latest
|
|||
|
|
environment:
|
|||
|
|
- DATABASE_URL=postgres://pandawiki:your_password@postgres:5432/pandawiki
|
|||
|
|
- REDIS_URL=redis://redis:6379
|
|||
|
|
- MINIO_ENDPOINT=minio:9000
|
|||
|
|
- NATS_URL=nats://nats:4222
|
|||
|
|
depends_on:
|
|||
|
|
- postgres
|
|||
|
|
- redis
|
|||
|
|
- minio
|
|||
|
|
- nats
|
|||
|
|
ports:
|
|||
|
|
- "8000:8000"
|
|||
|
|
|
|||
|
|
pandawiki-consumer:
|
|||
|
|
image: chaitin/pandawiki-consumer:latest
|
|||
|
|
environment:
|
|||
|
|
- DATABASE_URL=postgres://pandawiki:your_password@postgres:5432/pandawiki
|
|||
|
|
- REDIS_URL=redis://redis:6379
|
|||
|
|
- MINIO_ENDPOINT=minio:9000
|
|||
|
|
- NATS_URL=nats://nats:4222
|
|||
|
|
depends_on:
|
|||
|
|
- postgres
|
|||
|
|
- redis
|
|||
|
|
- minio
|
|||
|
|
- nats
|
|||
|
|
|
|||
|
|
pandawiki-admin:
|
|||
|
|
image: chaitin/pandawiki-admin:latest
|
|||
|
|
environment:
|
|||
|
|
- TARGET=http://pandawiki-api:8000
|
|||
|
|
depends_on:
|
|||
|
|
- pandawiki-api
|
|||
|
|
ports:
|
|||
|
|
- "3000:3000"
|
|||
|
|
|
|||
|
|
pandawiki-app:
|
|||
|
|
image: chaitin/pandawiki-app:latest
|
|||
|
|
environment:
|
|||
|
|
- TARGET=http://pandawiki-api:8000
|
|||
|
|
depends_on:
|
|||
|
|
- pandawiki-api
|
|||
|
|
ports:
|
|||
|
|
- "3010:3010"
|
|||
|
|
|
|||
|
|
volumes:
|
|||
|
|
postgres_data:
|
|||
|
|
redis_data:
|
|||
|
|
minio_data:
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
2. **启动服务**:
|
|||
|
|
```bash
|
|||
|
|
docker-compose up -d
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
3. **检查服务状态**:
|
|||
|
|
```bash
|
|||
|
|
docker-compose ps
|
|||
|
|
docker-compose logs -f pandawiki-api
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 🔐 初始配置
|
|||
|
|
|
|||
|
|
#### 首次登录
|
|||
|
|
|
|||
|
|
1. 访问管理后台: `http://your-server:3000`
|
|||
|
|
2. 使用默认账户登录:
|
|||
|
|
- 用户名: `admin`
|
|||
|
|
- 密码: 查看安装日志或重置密码
|
|||
|
|
|
|||
|
|
#### AI 模型配置
|
|||
|
|
|
|||
|
|
PandaWiki 的核心功能依赖 AI 大模型,首次使用需要配置模型:
|
|||
|
|
|
|||
|
|
1. **登录管理后台**
|
|||
|
|
2. **进入系统设置 > AI 模型配置**
|
|||
|
|
3. **配置 Chat 模型**:
|
|||
|
|
- 选择模型提供商(OpenAI、百智云、DeepSeek 等)
|
|||
|
|
- 填入 API Key 和相关配置
|
|||
|
|
- 测试连接确保配置正确
|
|||
|
|
|
|||
|
|
推荐的模型配置:
|
|||
|
|
- **百智云模型广场**: 注册即可获得免费额度
|
|||
|
|
- **OpenAI GPT-4**: 功能最全面,需要 API Key
|
|||
|
|
- **DeepSeek**: 性价比高,支持中文优化
|
|||
|
|
- **本地 Ollama**: 私有化部署,无需网络
|
|||
|
|
|
|||
|
|
#### 创建知识库
|
|||
|
|
|
|||
|
|
1. **进入知识库管理**
|
|||
|
|
2. **点击"创建知识库"**
|
|||
|
|
3. **填写基本信息**:
|
|||
|
|
- 知识库名称
|
|||
|
|
- 描述信息
|
|||
|
|
- 访问权限设置
|
|||
|
|
- 主题样式配置
|
|||
|
|
4. **保存并发布**
|
|||
|
|
|
|||
|
|
### 🌐 域名和 SSL 配置
|
|||
|
|
|
|||
|
|
#### Nginx 反向代理配置
|
|||
|
|
|
|||
|
|
```nginx
|
|||
|
|
server {
|
|||
|
|
listen 80;
|
|||
|
|
server_name your-domain.com;
|
|||
|
|
return 301 https://$server_name$request_uri;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
server {
|
|||
|
|
listen 443 ssl http2;
|
|||
|
|
server_name your-domain.com;
|
|||
|
|
|
|||
|
|
ssl_certificate /path/to/your/certificate.crt;
|
|||
|
|
ssl_certificate_key /path/to/your/private.key;
|
|||
|
|
|
|||
|
|
# 管理后台
|
|||
|
|
location /admin {
|
|||
|
|
proxy_pass http://localhost:3000;
|
|||
|
|
proxy_set_header Host $host;
|
|||
|
|
proxy_set_header X-Real-IP $remote_addr;
|
|||
|
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|||
|
|
proxy_set_header X-Forwarded-Proto $scheme;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# API 接口
|
|||
|
|
location /api {
|
|||
|
|
proxy_pass http://localhost:8000;
|
|||
|
|
proxy_set_header Host $host;
|
|||
|
|
proxy_set_header X-Real-IP $remote_addr;
|
|||
|
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|||
|
|
proxy_set_header X-Forwarded-Proto $scheme;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# Wiki 前台
|
|||
|
|
location / {
|
|||
|
|
proxy_pass http://localhost:3010;
|
|||
|
|
proxy_set_header Host $host;
|
|||
|
|
proxy_set_header X-Real-IP $remote_addr;
|
|||
|
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|||
|
|
proxy_set_header X-Forwarded-Proto $scheme;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 开发指南
|
|||
|
|
|
|||
|
|
### 🛠️ 开发环境搭建
|
|||
|
|
|
|||
|
|
#### 环境要求
|
|||
|
|
|
|||
|
|
确保你的开发环境满足以下要求:
|
|||
|
|
|
|||
|
|
- **Go**: 1.24.3+
|
|||
|
|
- **Node.js**: 18+ (推荐使用 nvm)
|
|||
|
|
- **pnpm**: 10.12.1+
|
|||
|
|
- **Docker**: 20.x+ (用于本地服务)
|
|||
|
|
- **Git**: 2.30+
|
|||
|
|
|
|||
|
|
#### 克隆项目
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 克隆项目
|
|||
|
|
git clone https://github.com/chaitin/PandaWiki.git
|
|||
|
|
cd PandaWiki
|
|||
|
|
|
|||
|
|
# 初始化子模块
|
|||
|
|
git submodule update --init --recursive
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 后端开发环境
|
|||
|
|
|
|||
|
|
1. **进入后端目录**:
|
|||
|
|
```bash
|
|||
|
|
cd backend
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
2. **安装 Go 依赖**:
|
|||
|
|
```bash
|
|||
|
|
go mod download
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
3. **启动依赖服务**:
|
|||
|
|
```bash
|
|||
|
|
# 使用 Docker Compose 启动数据库等服务
|
|||
|
|
docker-compose -f docker-compose.dev.yml up -d postgres redis minio nats
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
4. **配置环境变量**:
|
|||
|
|
```bash
|
|||
|
|
# 复制配置文件
|
|||
|
|
cp config/config.example.yaml config/config.yaml
|
|||
|
|
|
|||
|
|
# 编辑配置文件,填入数据库连接等信息
|
|||
|
|
vim config/config.yaml
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
5. **运行数据库迁移**:
|
|||
|
|
```bash
|
|||
|
|
make migrate-up
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
6. **启动 API 服务**:
|
|||
|
|
```bash
|
|||
|
|
make run-api
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
7. **启动消费者服务**:
|
|||
|
|
```bash
|
|||
|
|
make run-consumer
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 前端开发环境
|
|||
|
|
|
|||
|
|
##### 管理后台开发
|
|||
|
|
|
|||
|
|
1. **进入管理后台目录**:
|
|||
|
|
```bash
|
|||
|
|
cd web/admin
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
2. **安装依赖**:
|
|||
|
|
```bash
|
|||
|
|
pnpm install
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
3. **配置环境变量**:
|
|||
|
|
```bash
|
|||
|
|
# 创建环境配置文件
|
|||
|
|
cp .env.example .env.local
|
|||
|
|
|
|||
|
|
# 编辑配置文件
|
|||
|
|
vim .env.local
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
示例 `.env.local` 配置:
|
|||
|
|
```env
|
|||
|
|
# 后端服务地址
|
|||
|
|
TARGET=http://localhost:8000
|
|||
|
|
|
|||
|
|
# 静态文件服务地址
|
|||
|
|
STATIC_FILE_TARGET=http://localhost:2443
|
|||
|
|
|
|||
|
|
# 开发环境知识库ID
|
|||
|
|
DEV_KB_ID=your_dev_kb_id
|
|||
|
|
|
|||
|
|
# Swagger 配置
|
|||
|
|
SWAGGER_BASE_URL=http://localhost:8000
|
|||
|
|
SWAGGER_AUTH_TOKEN=your_swagger_token
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
4. **启动开发服务器**:
|
|||
|
|
```bash
|
|||
|
|
pnpm dev
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
##### 用户前台开发
|
|||
|
|
|
|||
|
|
1. **进入用户前台目录**:
|
|||
|
|
```bash
|
|||
|
|
cd web/app
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
2. **安装依赖**:
|
|||
|
|
```bash
|
|||
|
|
pnpm install
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
3. **配置环境变量**:
|
|||
|
|
```bash
|
|||
|
|
# 创建环境配置文件
|
|||
|
|
cp .env.example .env.local
|
|||
|
|
|
|||
|
|
# 编辑配置文件
|
|||
|
|
vim .env.local
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
4. **启动开发服务器**:
|
|||
|
|
```bash
|
|||
|
|
pnpm dev
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 📁 项目结构
|
|||
|
|
|
|||
|
|
#### 后端结构
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
backend/
|
|||
|
|
├── api/ # API 路由定义
|
|||
|
|
├── cmd/ # 应用程序入口
|
|||
|
|
├── config/ # 配置文件和配置管理
|
|||
|
|
├── consts/ # 常量定义
|
|||
|
|
├── docs/ # API 文档 (Swagger)
|
|||
|
|
├── domain/ # 领域模型和接口定义
|
|||
|
|
├── handler/ # HTTP 处理器
|
|||
|
|
├── middleware/ # 中间件
|
|||
|
|
├── migration/ # 数据库迁移文件
|
|||
|
|
├── mq/ # 消息队列相关
|
|||
|
|
├── pkg/ # 公共包和工具
|
|||
|
|
├── repo/ # 数据访问层
|
|||
|
|
├── server/ # 服务器配置
|
|||
|
|
├── store/ # 存储层抽象
|
|||
|
|
├── usecase/ # 业务逻辑层
|
|||
|
|
├── utils/ # 工具函数
|
|||
|
|
├── go.mod # Go 模块定义
|
|||
|
|
├── go.sum # Go 依赖校验
|
|||
|
|
└── Makefile # 构建脚本
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 前端结构
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
web/
|
|||
|
|
├── admin/ # 管理后台
|
|||
|
|
│ ├── src/
|
|||
|
|
│ │ ├── components/ # 可复用组件
|
|||
|
|
│ │ ├── pages/ # 页面组件
|
|||
|
|
│ │ ├── store/ # Redux 状态管理
|
|||
|
|
│ │ ├── themes/ # 主题配置
|
|||
|
|
│ │ ├── constant/ # 常量定义
|
|||
|
|
│ │ └── utils/ # 工具函数
|
|||
|
|
│ ├── public/ # 静态资源
|
|||
|
|
│ ├── package.json # 依赖配置
|
|||
|
|
│ └── vite.config.ts # Vite 配置
|
|||
|
|
└── app/ # 用户前台
|
|||
|
|
├── src/
|
|||
|
|
│ ├── components/ # 可复用组件
|
|||
|
|
│ ├── views/ # 页面视图
|
|||
|
|
│ ├── hooks/ # 自定义 Hooks
|
|||
|
|
│ ├── utils/ # 工具函数
|
|||
|
|
│ └── middleware/ # 中间件
|
|||
|
|
├── public/ # 静态资源
|
|||
|
|
├── package.json # 依赖配置
|
|||
|
|
└── next.config.ts # Next.js 配置
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 🔄 开发工作流
|
|||
|
|
|
|||
|
|
#### 代码提交流程
|
|||
|
|
|
|||
|
|
1. **创建功能分支**:
|
|||
|
|
```bash
|
|||
|
|
git checkout -b feat/your-feature-name
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
2. **开发和测试**:
|
|||
|
|
```bash
|
|||
|
|
# 后端测试
|
|||
|
|
cd backend
|
|||
|
|
make test
|
|||
|
|
make lint
|
|||
|
|
|
|||
|
|
# 前端测试
|
|||
|
|
cd web/admin
|
|||
|
|
pnpm test
|
|||
|
|
pnpm lint
|
|||
|
|
|
|||
|
|
cd web/app
|
|||
|
|
pnpm test
|
|||
|
|
pnpm lint
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
3. **提交代码**:
|
|||
|
|
```bash
|
|||
|
|
git add .
|
|||
|
|
git commit -m "feat: add new feature description"
|
|||
|
|
git push origin feat/your-feature-name
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
4. **创建 Pull Request**:
|
|||
|
|
- 确保 PR 有清晰的标题和描述
|
|||
|
|
- 关联相关 Issue
|
|||
|
|
- 遵循 PR 模板要求
|
|||
|
|
|
|||
|
|
#### 代码规范
|
|||
|
|
|
|||
|
|
##### Go 代码规范
|
|||
|
|
- 使用 `gofmt` 格式化代码
|
|||
|
|
- 遵循 [Effective Go](https://golang.org/doc/effective_go.html) 指南
|
|||
|
|
- 保持函数简洁(<80 行)
|
|||
|
|
- 添加必要的注释和文档
|
|||
|
|
|
|||
|
|
##### TypeScript 代码规范
|
|||
|
|
- 使用 ESLint 检查代码质量
|
|||
|
|
- 遵循标准 React 最佳实践
|
|||
|
|
- 使用 Prettier 格式化代码
|
|||
|
|
- 保持组件的单一职责原则
|
|||
|
|
|
|||
|
|
#### 测试要求
|
|||
|
|
|
|||
|
|
##### 后端测试
|
|||
|
|
- 所有主要功能应有单元测试
|
|||
|
|
- 测试覆盖率不应低于 80%
|
|||
|
|
- 运行测试命令: `make test`
|
|||
|
|
|
|||
|
|
##### 前端测试
|
|||
|
|
- 重要组件应包含基本测试
|
|||
|
|
- 关键交互逻辑应有测试覆盖
|
|||
|
|
- 运行测试命令: `pnpm test`
|
|||
|
|
|
|||
|
|
### 🔧 常用开发命令
|
|||
|
|
|
|||
|
|
#### 后端命令
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 构建项目
|
|||
|
|
make build
|
|||
|
|
|
|||
|
|
# 运行 API 服务
|
|||
|
|
make run-api
|
|||
|
|
|
|||
|
|
# 运行消费者服务
|
|||
|
|
make run-consumer
|
|||
|
|
|
|||
|
|
# 运行测试
|
|||
|
|
make test
|
|||
|
|
|
|||
|
|
# 代码检查
|
|||
|
|
make lint
|
|||
|
|
|
|||
|
|
# 数据库迁移
|
|||
|
|
make migrate-up
|
|||
|
|
make migrate-down
|
|||
|
|
|
|||
|
|
# 生成 API 文档
|
|||
|
|
make swagger
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 前端命令
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 管理后台
|
|||
|
|
cd web/admin
|
|||
|
|
pnpm dev # 开发模式
|
|||
|
|
pnpm build # 构建生产版本
|
|||
|
|
pnpm lint # 代码检查
|
|||
|
|
pnpm format # 代码格式化
|
|||
|
|
pnpm api # 生成 API 类型定义
|
|||
|
|
|
|||
|
|
# 用户前台
|
|||
|
|
cd web/app
|
|||
|
|
pnpm dev # 开发模式 (端口 3010)
|
|||
|
|
pnpm build # 构建生产版本
|
|||
|
|
pnpm start # 启动生产服务器
|
|||
|
|
pnpm lint # 代码检查
|
|||
|
|
pnpm format # 代码格式化
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## API 文档
|
|||
|
|
|
|||
|
|
### 📚 API 概览
|
|||
|
|
|
|||
|
|
PandaWiki 提供完整的 RESTful API,支持所有核心功能的编程访问。API 文档通过 Swagger 自动生成,提供交互式的接口测试环境。
|
|||
|
|
|
|||
|
|
#### API 基础信息
|
|||
|
|
|
|||
|
|
- **Base URL**: `http://your-domain.com/api`
|
|||
|
|
- **API 版本**: v1
|
|||
|
|
- **认证方式**: JWT Token
|
|||
|
|
- **数据格式**: JSON
|
|||
|
|
- **字符编码**: UTF-8
|
|||
|
|
|
|||
|
|
#### 访问 API 文档
|
|||
|
|
|
|||
|
|
- **Swagger UI**: `http://your-domain.com/api/swagger/index.html`
|
|||
|
|
- **OpenAPI 规范**: `http://your-domain.com/api/swagger/doc.json`
|
|||
|
|
|
|||
|
|
### 🔐 认证授权
|
|||
|
|
|
|||
|
|
#### JWT Token 认证
|
|||
|
|
|
|||
|
|
所有需要认证的 API 请求都需要在 Header 中包含 JWT Token:
|
|||
|
|
|
|||
|
|
```http
|
|||
|
|
Authorization: Bearer <your-jwt-token>
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 获取 Token
|
|||
|
|
|
|||
|
|
```http
|
|||
|
|
POST /api/auth/login
|
|||
|
|
Content-Type: application/json
|
|||
|
|
|
|||
|
|
{
|
|||
|
|
"username": "admin",
|
|||
|
|
"password": "your-password"
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
响应示例:
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"code": 0,
|
|||
|
|
"message": "success",
|
|||
|
|
"data": {
|
|||
|
|
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
|
|||
|
|
"expires_at": "2024-01-01T00:00:00Z",
|
|||
|
|
"user": {
|
|||
|
|
"id": "user-id",
|
|||
|
|
"username": "admin",
|
|||
|
|
"email": "admin@example.com"
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 📖 核心 API 接口
|
|||
|
|
|
|||
|
|
#### 知识库管理
|
|||
|
|
|
|||
|
|
##### 获取知识库列表
|
|||
|
|
```http
|
|||
|
|
GET /api/knowledge-bases
|
|||
|
|
Authorization: Bearer <token>
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
##### 创建知识库
|
|||
|
|
```http
|
|||
|
|
POST /api/knowledge-bases
|
|||
|
|
Authorization: Bearer <token>
|
|||
|
|
Content-Type: application/json
|
|||
|
|
|
|||
|
|
{
|
|||
|
|
"name": "我的知识库",
|
|||
|
|
"description": "知识库描述",
|
|||
|
|
"is_public": true,
|
|||
|
|
"settings": {
|
|||
|
|
"theme": "default",
|
|||
|
|
"language": "zh-CN"
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
##### 更新知识库
|
|||
|
|
```http
|
|||
|
|
PUT /api/knowledge-bases/{kb_id}
|
|||
|
|
Authorization: Bearer <token>
|
|||
|
|
Content-Type: application/json
|
|||
|
|
|
|||
|
|
{
|
|||
|
|
"name": "更新后的名称",
|
|||
|
|
"description": "更新后的描述"
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
##### 删除知识库
|
|||
|
|
```http
|
|||
|
|
DELETE /api/knowledge-bases/{kb_id}
|
|||
|
|
Authorization: Bearer <token>
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 文档管理
|
|||
|
|
|
|||
|
|
##### 获取文档列表
|
|||
|
|
```http
|
|||
|
|
GET /api/knowledge-bases/{kb_id}/nodes
|
|||
|
|
Authorization: Bearer <token>
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
##### 创建文档
|
|||
|
|
```http
|
|||
|
|
POST /api/knowledge-bases/{kb_id}/nodes
|
|||
|
|
Authorization: Bearer <token>
|
|||
|
|
Content-Type: application/json
|
|||
|
|
|
|||
|
|
{
|
|||
|
|
"title": "文档标题",
|
|||
|
|
"content": "文档内容(Markdown 格式)",
|
|||
|
|
"parent_id": "parent-node-id",
|
|||
|
|
"tags": ["标签1", "标签2"]
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
##### 更新文档
|
|||
|
|
```http
|
|||
|
|
PUT /api/nodes/{node_id}
|
|||
|
|
Authorization: Bearer <token>
|
|||
|
|
Content-Type: application/json
|
|||
|
|
|
|||
|
|
{
|
|||
|
|
"title": "更新后的标题",
|
|||
|
|
"content": "更新后的内容"
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
##### 删除文档
|
|||
|
|
```http
|
|||
|
|
DELETE /api/nodes/{node_id}
|
|||
|
|
Authorization: Bearer <token>
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### AI 功能接口
|
|||
|
|
|
|||
|
|
##### AI 创作
|
|||
|
|
```http
|
|||
|
|
POST /api/ai/create
|
|||
|
|
Authorization: Bearer <token>
|
|||
|
|
Content-Type: application/json
|
|||
|
|
|
|||
|
|
{
|
|||
|
|
"prompt": "请帮我写一篇关于 Go 语言的技术文档",
|
|||
|
|
"knowledge_base_id": "kb-id",
|
|||
|
|
"style": "technical",
|
|||
|
|
"length": "medium"
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
##### AI 问答
|
|||
|
|
```http
|
|||
|
|
POST /api/ai/chat
|
|||
|
|
Authorization: Bearer <token>
|
|||
|
|
Content-Type: application/json
|
|||
|
|
|
|||
|
|
{
|
|||
|
|
"question": "如何在 Go 中处理错误?",
|
|||
|
|
"knowledge_base_id": "kb-id",
|
|||
|
|
"conversation_id": "conv-id"
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
##### AI 搜索
|
|||
|
|
```http
|
|||
|
|
POST /api/ai/search
|
|||
|
|
Authorization: Bearer <token>
|
|||
|
|
Content-Type: application/json
|
|||
|
|
|
|||
|
|
{
|
|||
|
|
"query": "Go 语言并发编程",
|
|||
|
|
"knowledge_base_id": "kb-id",
|
|||
|
|
"limit": 10
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 文件管理
|
|||
|
|
|
|||
|
|
##### 上传文件
|
|||
|
|
```http
|
|||
|
|
POST /api/files/upload
|
|||
|
|
Authorization: Bearer <token>
|
|||
|
|
Content-Type: multipart/form-data
|
|||
|
|
|
|||
|
|
file: <binary-data>
|
|||
|
|
knowledge_base_id: kb-id
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
##### 获取文件信息
|
|||
|
|
```http
|
|||
|
|
GET /api/files/{file_id}
|
|||
|
|
Authorization: Bearer <token>
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
##### 删除文件
|
|||
|
|
```http
|
|||
|
|
DELETE /api/files/{file_id}
|
|||
|
|
Authorization: Bearer <token>
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 📊 响应格式
|
|||
|
|
|
|||
|
|
#### 标准响应格式
|
|||
|
|
|
|||
|
|
所有 API 响应都遵循统一的格式:
|
|||
|
|
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"code": 0,
|
|||
|
|
"message": "success",
|
|||
|
|
"data": {
|
|||
|
|
// 具体的响应数据
|
|||
|
|
},
|
|||
|
|
"timestamp": "2024-01-01T00:00:00Z"
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 错误响应格式
|
|||
|
|
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"code": 400,
|
|||
|
|
"message": "参数错误",
|
|||
|
|
"error": "详细错误信息",
|
|||
|
|
"timestamp": "2024-01-01T00:00:00Z"
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 常见状态码
|
|||
|
|
|
|||
|
|
| 状态码 | 说明 |
|
|||
|
|
|--------|------|
|
|||
|
|
| 0 | 成功 |
|
|||
|
|
| 400 | 请求参数错误 |
|
|||
|
|
| 401 | 未授权访问 |
|
|||
|
|
| 403 | 权限不足 |
|
|||
|
|
| 404 | 资源不存在 |
|
|||
|
|
| 500 | 服务器内部错误 |
|
|||
|
|
|
|||
|
|
### 🔄 分页和过滤
|
|||
|
|
|
|||
|
|
#### 分页参数
|
|||
|
|
|
|||
|
|
```http
|
|||
|
|
GET /api/nodes?page=1&page_size=20&sort=created_at&order=desc
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 过滤参数
|
|||
|
|
|
|||
|
|
```http
|
|||
|
|
GET /api/nodes?title=关键词&tags=标签1,标签2&created_after=2024-01-01
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 分页响应格式
|
|||
|
|
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"code": 0,
|
|||
|
|
"message": "success",
|
|||
|
|
"data": {
|
|||
|
|
"items": [...],
|
|||
|
|
"pagination": {
|
|||
|
|
"page": 1,
|
|||
|
|
"page_size": 20,
|
|||
|
|
"total": 100,
|
|||
|
|
"total_pages": 5
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 配置说明
|
|||
|
|
|
|||
|
|
### ⚙️ 系统配置
|
|||
|
|
|
|||
|
|
#### 配置文件结构
|
|||
|
|
|
|||
|
|
PandaWiki 使用 YAML 格式的配置文件,主要配置文件位于 `backend/config/config.yaml`:
|
|||
|
|
|
|||
|
|
```yaml
|
|||
|
|
# 服务器配置
|
|||
|
|
server:
|
|||
|
|
host: "0.0.0.0"
|
|||
|
|
port: 8000
|
|||
|
|
mode: "production" # development, production
|
|||
|
|
cors:
|
|||
|
|
enabled: true
|
|||
|
|
origins: ["*"]
|
|||
|
|
methods: ["GET", "POST", "PUT", "DELETE", "OPTIONS"]
|
|||
|
|
|
|||
|
|
# 数据库配置
|
|||
|
|
database:
|
|||
|
|
driver: "postgres"
|
|||
|
|
host: "localhost"
|
|||
|
|
port: 5432
|
|||
|
|
name: "pandawiki"
|
|||
|
|
username: "pandawiki"
|
|||
|
|
password: "your_password"
|
|||
|
|
ssl_mode: "disable"
|
|||
|
|
max_open_conns: 100
|
|||
|
|
max_idle_conns: 10
|
|||
|
|
conn_max_lifetime: "1h"
|
|||
|
|
|
|||
|
|
# Redis 配置
|
|||
|
|
redis:
|
|||
|
|
host: "localhost"
|
|||
|
|
port: 6379
|
|||
|
|
password: ""
|
|||
|
|
database: 0
|
|||
|
|
pool_size: 10
|
|||
|
|
min_idle_conns: 5
|
|||
|
|
|
|||
|
|
# 对象存储配置
|
|||
|
|
storage:
|
|||
|
|
provider: "minio" # minio, s3, local
|
|||
|
|
endpoint: "localhost:9000"
|
|||
|
|
access_key: "minioadmin"
|
|||
|
|
secret_key: "minioadmin123"
|
|||
|
|
bucket: "pandawiki"
|
|||
|
|
region: "us-east-1"
|
|||
|
|
use_ssl: false
|
|||
|
|
|
|||
|
|
# 消息队列配置
|
|||
|
|
message_queue:
|
|||
|
|
provider: "nats" # nats, redis
|
|||
|
|
url: "nats://localhost:4222"
|
|||
|
|
cluster_id: "pandawiki"
|
|||
|
|
client_id: "pandawiki-api"
|
|||
|
|
|
|||
|
|
# AI 模型配置
|
|||
|
|
ai:
|
|||
|
|
default_provider: "openai"
|
|||
|
|
providers:
|
|||
|
|
openai:
|
|||
|
|
api_key: "your-openai-api-key"
|
|||
|
|
base_url: "https://api.openai.com/v1"
|
|||
|
|
model: "gpt-4"
|
|||
|
|
max_tokens: 4000
|
|||
|
|
temperature: 0.7
|
|||
|
|
|
|||
|
|
deepseek:
|
|||
|
|
api_key: "your-deepseek-api-key"
|
|||
|
|
base_url: "https://api.deepseek.com/v1"
|
|||
|
|
model: "deepseek-chat"
|
|||
|
|
max_tokens: 4000
|
|||
|
|
temperature: 0.7
|
|||
|
|
|
|||
|
|
# 认证配置
|
|||
|
|
auth:
|
|||
|
|
jwt:
|
|||
|
|
secret: "your-jwt-secret"
|
|||
|
|
expires_in: "24h"
|
|||
|
|
refresh_expires_in: "168h"
|
|||
|
|
|
|||
|
|
ldap:
|
|||
|
|
enabled: false
|
|||
|
|
host: "ldap.example.com"
|
|||
|
|
port: 389
|
|||
|
|
bind_dn: "cn=admin,dc=example,dc=com"
|
|||
|
|
bind_password: "admin_password"
|
|||
|
|
search_base: "ou=users,dc=example,dc=com"
|
|||
|
|
search_filter: "(uid=%s)"
|
|||
|
|
|
|||
|
|
# 日志配置
|
|||
|
|
logging:
|
|||
|
|
level: "info" # debug, info, warn, error
|
|||
|
|
format: "json" # json, text
|
|||
|
|
output: "stdout" # stdout, file
|
|||
|
|
file_path: "/var/log/pandawiki/app.log"
|
|||
|
|
max_size: 100 # MB
|
|||
|
|
max_backups: 10
|
|||
|
|
max_age: 30 # days
|
|||
|
|
|
|||
|
|
# 监控配置
|
|||
|
|
monitoring:
|
|||
|
|
enabled: true
|
|||
|
|
metrics:
|
|||
|
|
enabled: true
|
|||
|
|
path: "/metrics"
|
|||
|
|
|
|||
|
|
tracing:
|
|||
|
|
enabled: true
|
|||
|
|
endpoint: "http://jaeger:14268/api/traces"
|
|||
|
|
service_name: "pandawiki-api"
|
|||
|
|
|
|||
|
|
# 安全配置
|
|||
|
|
security:
|
|||
|
|
rate_limit:
|
|||
|
|
enabled: true
|
|||
|
|
requests_per_minute: 100
|
|||
|
|
burst: 200
|
|||
|
|
|
|||
|
|
captcha:
|
|||
|
|
enabled: true
|
|||
|
|
provider: "recaptcha" # recaptcha, hcaptcha
|
|||
|
|
site_key: "your-site-key"
|
|||
|
|
secret_key: "your-secret-key"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 🌐 环境变量
|
|||
|
|
|
|||
|
|
#### 核心环境变量
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 数据库连接
|
|||
|
|
DATABASE_URL=postgres://user:password@host:port/dbname
|
|||
|
|
|
|||
|
|
# Redis 连接
|
|||
|
|
REDIS_URL=redis://host:port/database
|
|||
|
|
|
|||
|
|
# 对象存储
|
|||
|
|
MINIO_ENDPOINT=localhost:9000
|
|||
|
|
MINIO_ACCESS_KEY=minioadmin
|
|||
|
|
MINIO_SECRET_KEY=minioadmin123
|
|||
|
|
|
|||
|
|
# AI 模型
|
|||
|
|
OPENAI_API_KEY=your-openai-api-key
|
|||
|
|
DEEPSEEK_API_KEY=your-deepseek-api-key
|
|||
|
|
|
|||
|
|
# JWT 密钥
|
|||
|
|
JWT_SECRET=your-jwt-secret
|
|||
|
|
|
|||
|
|
# 服务端口
|
|||
|
|
SERVER_PORT=8000
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 前端环境变量
|
|||
|
|
|
|||
|
|
##### 管理后台 (.env.local)
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 后端服务地址
|
|||
|
|
TARGET=http://localhost:8000
|
|||
|
|
|
|||
|
|
# 静态文件服务地址
|
|||
|
|
STATIC_FILE_TARGET=http://localhost:2443
|
|||
|
|
|
|||
|
|
# 开发环境知识库ID
|
|||
|
|
DEV_KB_ID=your_dev_kb_id
|
|||
|
|
|
|||
|
|
# Swagger 配置
|
|||
|
|
SWAGGER_BASE_URL=http://localhost:8000
|
|||
|
|
SWAGGER_AUTH_TOKEN=your_swagger_token
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
##### 用户前台 (.env.local)
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 后端服务地址
|
|||
|
|
TARGET=http://localhost:8000
|
|||
|
|
|
|||
|
|
# 静态文件服务地址
|
|||
|
|
STATIC_FILE_TARGET=http://localhost:2443
|
|||
|
|
|
|||
|
|
# 开发环境知识库ID
|
|||
|
|
DEV_KB_ID=your_dev_kb_id
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 🔧 高级配置
|
|||
|
|
|
|||
|
|
#### 负载均衡配置
|
|||
|
|
|
|||
|
|
```nginx
|
|||
|
|
upstream pandawiki_api {
|
|||
|
|
server 127.0.0.1:8000;
|
|||
|
|
server 127.0.0.1:8001;
|
|||
|
|
server 127.0.0.1:8002;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
upstream pandawiki_admin {
|
|||
|
|
server 127.0.0.1:3000;
|
|||
|
|
server 127.0.0.1:3001;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
upstream pandawiki_app {
|
|||
|
|
server 127.0.0.1:3010;
|
|||
|
|
server 127.0.0.1:3011;
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 缓存配置
|
|||
|
|
|
|||
|
|
```yaml
|
|||
|
|
cache:
|
|||
|
|
# 内存缓存
|
|||
|
|
memory:
|
|||
|
|
enabled: true
|
|||
|
|
max_size: "100MB"
|
|||
|
|
ttl: "1h"
|
|||
|
|
|
|||
|
|
# Redis 缓存
|
|||
|
|
redis:
|
|||
|
|
enabled: true
|
|||
|
|
key_prefix: "pandawiki:"
|
|||
|
|
default_ttl: "24h"
|
|||
|
|
|
|||
|
|
# 缓存策略
|
|||
|
|
strategies:
|
|||
|
|
nodes: "1h"
|
|||
|
|
search_results: "30m"
|
|||
|
|
user_sessions: "24h"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 搜索引擎配置
|
|||
|
|
|
|||
|
|
```yaml
|
|||
|
|
search:
|
|||
|
|
# 全文搜索
|
|||
|
|
full_text:
|
|||
|
|
enabled: true
|
|||
|
|
language: "chinese"
|
|||
|
|
min_word_length: 2
|
|||
|
|
max_results: 100
|
|||
|
|
|
|||
|
|
# 向量搜索
|
|||
|
|
vector:
|
|||
|
|
enabled: true
|
|||
|
|
model: "text-embedding-ada-002"
|
|||
|
|
dimension: 1536
|
|||
|
|
similarity_threshold: 0.7
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 安全策略
|
|||
|
|
|
|||
|
|
### 🔒 安全概述
|
|||
|
|
|
|||
|
|
PandaWiki 高度重视系统安全,采用多层次的安全防护措施,确保用户数据和系统的安全性。
|
|||
|
|
|
|||
|
|
### 🛡️ 安全措施
|
|||
|
|
|
|||
|
|
#### 认证与授权
|
|||
|
|
|
|||
|
|
1. **多因素认证**:
|
|||
|
|
- JWT Token 认证
|
|||
|
|
- LDAP 企业认证集成
|
|||
|
|
- OAuth2 第三方登录
|
|||
|
|
- 可选的双因素认证 (2FA)
|
|||
|
|
|
|||
|
|
2. **权限控制**:
|
|||
|
|
- 基于角色的访问控制 (RBAC)
|
|||
|
|
- 细粒度的资源权限管理
|
|||
|
|
- 知识库级别的访问控制
|
|||
|
|
- API 接口权限验证
|
|||
|
|
|
|||
|
|
#### 数据安全
|
|||
|
|
|
|||
|
|
1. **数据加密**:
|
|||
|
|
- 传输层 TLS/SSL 加密
|
|||
|
|
- 敏感数据库字段加密存储
|
|||
|
|
- 文件上传安全检查
|
|||
|
|
- API 密钥安全存储
|
|||
|
|
|
|||
|
|
2. **数据备份**:
|
|||
|
|
- 自动化数据库备份
|
|||
|
|
- 文件存储备份策略
|
|||
|
|
- 灾难恢复计划
|
|||
|
|
- 数据完整性验证
|
|||
|
|
|
|||
|
|
#### 网络安全
|
|||
|
|
|
|||
|
|
1. **防护措施**:
|
|||
|
|
- 请求频率限制 (Rate Limiting)
|
|||
|
|
- DDoS 攻击防护
|
|||
|
|
- SQL 注入防护
|
|||
|
|
- XSS 攻击防护
|
|||
|
|
- CSRF 攻击防护
|
|||
|
|
|
|||
|
|
2. **监控与审计**:
|
|||
|
|
- 访问日志记录
|
|||
|
|
- 异常行为检测
|
|||
|
|
- 安全事件告警
|
|||
|
|
- 操作审计跟踪
|
|||
|
|
|
|||
|
|
### 🚨 漏洞报告
|
|||
|
|
|
|||
|
|
#### 报告流程
|
|||
|
|
|
|||
|
|
我们鼓励安全研究人员和用户报告发现的安全漏洞:
|
|||
|
|
|
|||
|
|
1. **私下报告**: 通过 [GitHub Security Advisory](https://github.com/chaitin/PandaWiki/security/advisories) 提交漏洞
|
|||
|
|
2. **响应时间**: 我们会在 **3 个工作日内**确认收到报告
|
|||
|
|
3. **修复计划**: 在 **7 天内**提供详细的修复时间表
|
|||
|
|
4. **公开披露**: 修复完成后发布安全公告并感谢报告者
|
|||
|
|
|
|||
|
|
#### 报告内容
|
|||
|
|
|
|||
|
|
请在报告中包含以下信息:
|
|||
|
|
|
|||
|
|
- 漏洞的详细描述
|
|||
|
|
- 重现步骤和概念验证
|
|||
|
|
- 潜在的影响和风险评估
|
|||
|
|
- 建议的修复方案(如有)
|
|||
|
|
|
|||
|
|
#### 负责任的披露
|
|||
|
|
|
|||
|
|
- 请勿在漏洞修复前公开披露
|
|||
|
|
- 避免访问或修改他人数据
|
|||
|
|
- 不要进行破坏性测试
|
|||
|
|
- 遵守当地法律法规
|
|||
|
|
|
|||
|
|
### 🔐 安全最佳实践
|
|||
|
|
|
|||
|
|
#### 部署安全
|
|||
|
|
|
|||
|
|
1. **服务器安全**:
|
|||
|
|
- 定期更新操作系统和依赖
|
|||
|
|
- 配置防火墙规则
|
|||
|
|
- 禁用不必要的服务
|
|||
|
|
- 使用非 root 用户运行服务
|
|||
|
|
|
|||
|
|
2. **容器安全**:
|
|||
|
|
- 使用最小化的基础镜像
|
|||
|
|
- 定期扫描镜像漏洞
|
|||
|
|
- 配置容器资源限制
|
|||
|
|
- 实施容器网络隔离
|
|||
|
|
|
|||
|
|
#### 配置安全
|
|||
|
|
|
|||
|
|
1. **密钥管理**:
|
|||
|
|
- 使用强密码和复杂密钥
|
|||
|
|
- 定期轮换 API 密钥
|
|||
|
|
- 避免在代码中硬编码密钥
|
|||
|
|
- 使用密钥管理服务
|
|||
|
|
|
|||
|
|
2. **网络配置**:
|
|||
|
|
- 启用 HTTPS/TLS 加密
|
|||
|
|
- 配置安全的 HTTP 头
|
|||
|
|
- 限制跨域访问
|
|||
|
|
- 使用 VPN 或专网访问
|
|||
|
|
|
|||
|
|
#### 运维安全
|
|||
|
|
|
|||
|
|
1. **监控告警**:
|
|||
|
|
- 设置安全事件告警
|
|||
|
|
- 监控异常登录行为
|
|||
|
|
- 跟踪 API 调用异常
|
|||
|
|
- 定期安全审计
|
|||
|
|
|
|||
|
|
2. **备份恢复**:
|
|||
|
|
- 定期测试备份恢复
|
|||
|
|
- 加密备份数据
|
|||
|
|
- 异地备份存储
|
|||
|
|
- 制定应急响应计划
|
|||
|
|
|
|||
|
|
### 📋 安全检查清单
|
|||
|
|
|
|||
|
|
#### 部署前检查
|
|||
|
|
|
|||
|
|
- [ ] 更新所有依赖到最新安全版本
|
|||
|
|
- [ ] 配置强密码和密钥
|
|||
|
|
- [ ] 启用 HTTPS/TLS 加密
|
|||
|
|
- [ ] 配置防火墙规则
|
|||
|
|
- [ ] 设置访问日志和监控
|
|||
|
|
- [ ] 测试备份和恢复流程
|
|||
|
|
|
|||
|
|
#### 运行时检查
|
|||
|
|
|
|||
|
|
- [ ] 定期检查安全日志
|
|||
|
|
- [ ] 监控系统资源使用
|
|||
|
|
- [ ] 验证用户权限配置
|
|||
|
|
- [ ] 检查 API 调用异常
|
|||
|
|
- [ ] 更新安全补丁
|
|||
|
|
- [ ] 执行安全扫描
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 贡献指南
|
|||
|
|
|
|||
|
|
### 🤝 参与贡献
|
|||
|
|
|
|||
|
|
我们欢迎所有形式的贡献,包括但不限于:
|
|||
|
|
|
|||
|
|
- 🐛 Bug 报告和修复
|
|||
|
|
- ✨ 新功能开发
|
|||
|
|
- 📚 文档改进
|
|||
|
|
- 🌐 国际化翻译
|
|||
|
|
- 🎨 UI/UX 改进
|
|||
|
|
- 🧪 测试用例编写
|
|||
|
|
|
|||
|
|
### 📋 贡献流程
|
|||
|
|
|
|||
|
|
#### 1. 准备工作
|
|||
|
|
|
|||
|
|
1. **Fork 项目**: 在 GitHub 上 Fork PandaWiki 项目
|
|||
|
|
2. **克隆代码**: 克隆你的 Fork 到本地
|
|||
|
|
```bash
|
|||
|
|
git clone https://github.com/your-username/PandaWiki.git
|
|||
|
|
cd PandaWiki
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
3. **配置上游仓库**:
|
|||
|
|
```bash
|
|||
|
|
git remote add upstream https://github.com/chaitin/PandaWiki.git
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 2. 开发流程
|
|||
|
|
|
|||
|
|
1. **同步最新代码**:
|
|||
|
|
```bash
|
|||
|
|
git fetch upstream
|
|||
|
|
git checkout main
|
|||
|
|
git merge upstream/main
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
2. **创建功能分支**:
|
|||
|
|
```bash
|
|||
|
|
git checkout -b feat/your-feature-name
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
3. **开发和测试**:
|
|||
|
|
- 编写代码并确保功能正常
|
|||
|
|
- 添加或更新相关测试
|
|||
|
|
- 确保代码符合项目规范
|
|||
|
|
|
|||
|
|
4. **提交代码**:
|
|||
|
|
```bash
|
|||
|
|
git add .
|
|||
|
|
git commit -m "feat: add your feature description"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 3. 提交 Pull Request
|
|||
|
|
|
|||
|
|
1. **推送分支**:
|
|||
|
|
```bash
|
|||
|
|
git push origin feat/your-feature-name
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
2. **创建 PR**:
|
|||
|
|
- 在 GitHub 上创建 Pull Request
|
|||
|
|
- 填写详细的 PR 描述
|
|||
|
|
- 关联相关的 Issue
|
|||
|
|
|
|||
|
|
3. **代码审查**:
|
|||
|
|
- 响应审查意见
|
|||
|
|
- 根据反馈修改代码
|
|||
|
|
- 确保 CI 检查通过
|
|||
|
|
|
|||
|
|
### 📝 代码规范
|
|||
|
|
|
|||
|
|
#### 提交信息规范
|
|||
|
|
|
|||
|
|
我们使用 [Conventional Commits](https://www.conventionalcommits.org/) 规范:
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
<type>[optional scope]: <description>
|
|||
|
|
|
|||
|
|
[optional body]
|
|||
|
|
|
|||
|
|
[optional footer(s)]
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**类型说明**:
|
|||
|
|
- `feat`: 新功能
|
|||
|
|
- `fix`: Bug 修复
|
|||
|
|
- `docs`: 文档更新
|
|||
|
|
- `style`: 代码格式调整
|
|||
|
|
- `refactor`: 代码重构
|
|||
|
|
- `test`: 测试相关
|
|||
|
|
- `chore`: 构建或工具相关
|
|||
|
|
|
|||
|
|
**示例**:
|
|||
|
|
```
|
|||
|
|
feat(api): add user authentication endpoint
|
|||
|
|
|
|||
|
|
Add JWT-based authentication for user login and registration.
|
|||
|
|
Includes password hashing and token validation.
|
|||
|
|
|
|||
|
|
Closes #123
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### Go 代码规范
|
|||
|
|
|
|||
|
|
1. **格式化**: 使用 `gofmt` 格式化代码
|
|||
|
|
2. **命名**: 遵循 Go 命名约定
|
|||
|
|
3. **注释**: 为公开的函数和类型添加注释
|
|||
|
|
4. **错误处理**: 正确处理和传播错误
|
|||
|
|
5. **测试**: 为新功能编写单元测试
|
|||
|
|
|
|||
|
|
示例:
|
|||
|
|
```go
|
|||
|
|
// UserService provides user management functionality.
|
|||
|
|
type UserService struct {
|
|||
|
|
repo UserRepository
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// CreateUser creates a new user with the given information.
|
|||
|
|
func (s *UserService) CreateUser(ctx context.Context, req CreateUserRequest) (*User, error) {
|
|||
|
|
if err := req.Validate(); err != nil {
|
|||
|
|
return nil, fmt.Errorf("invalid request: %w", err)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
user, err := s.repo.Create(ctx, req)
|
|||
|
|
if err != nil {
|
|||
|
|
return nil, fmt.Errorf("failed to create user: %w", err)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return user, nil
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### TypeScript 代码规范
|
|||
|
|
|
|||
|
|
1. **ESLint**: 使用 ESLint 检查代码质量
|
|||
|
|
2. **Prettier**: 使用 Prettier 格式化代码
|
|||
|
|
3. **类型安全**: 充分利用 TypeScript 类型系统
|
|||
|
|
4. **组件设计**: 遵循 React 最佳实践
|
|||
|
|
5. **性能优化**: 合理使用 memo、useMemo 等
|
|||
|
|
|
|||
|
|
示例:
|
|||
|
|
```typescript
|
|||
|
|
interface UserCardProps {
|
|||
|
|
user: User;
|
|||
|
|
onEdit?: (user: User) => void;
|
|||
|
|
onDelete?: (userId: string) => void;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
export const UserCard: React.FC<UserCardProps> = memo(({
|
|||
|
|
user,
|
|||
|
|
onEdit,
|
|||
|
|
onDelete
|
|||
|
|
}) => {
|
|||
|
|
const handleEdit = useCallback(() => {
|
|||
|
|
onEdit?.(user);
|
|||
|
|
}, [user, onEdit]);
|
|||
|
|
|
|||
|
|
const handleDelete = useCallback(() => {
|
|||
|
|
onDelete?.(user.id);
|
|||
|
|
}, [user.id, onDelete]);
|
|||
|
|
|
|||
|
|
return (
|
|||
|
|
<Card>
|
|||
|
|
<CardContent>
|
|||
|
|
<Typography variant="h6">{user.name}</Typography>
|
|||
|
|
<Typography variant="body2">{user.email}</Typography>
|
|||
|
|
</CardContent>
|
|||
|
|
<CardActions>
|
|||
|
|
<Button onClick={handleEdit}>编辑</Button>
|
|||
|
|
<Button onClick={handleDelete} color="error">删除</Button>
|
|||
|
|
</CardActions>
|
|||
|
|
</Card>
|
|||
|
|
);
|
|||
|
|
});
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 🧪 测试要求
|
|||
|
|
|
|||
|
|
#### 后端测试
|
|||
|
|
|
|||
|
|
1. **单元测试**: 覆盖核心业务逻辑
|
|||
|
|
2. **集成测试**: 测试 API 端点
|
|||
|
|
3. **覆盖率**: 保持 80% 以上的测试覆盖率
|
|||
|
|
|
|||
|
|
```go
|
|||
|
|
func TestUserService_CreateUser(t *testing.T) {
|
|||
|
|
tests := []struct {
|
|||
|
|
name string
|
|||
|
|
req CreateUserRequest
|
|||
|
|
want *User
|
|||
|
|
wantErr bool
|
|||
|
|
}{
|
|||
|
|
{
|
|||
|
|
name: "valid user",
|
|||
|
|
req: CreateUserRequest{
|
|||
|
|
Name: "John Doe",
|
|||
|
|
Email: "john@example.com",
|
|||
|
|
Password: "password123",
|
|||
|
|
},
|
|||
|
|
want: &User{
|
|||
|
|
Name: "John Doe",
|
|||
|
|
Email: "john@example.com",
|
|||
|
|
},
|
|||
|
|
wantErr: false,
|
|||
|
|
},
|
|||
|
|
// 更多测试用例...
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
for _, tt := range tests {
|
|||
|
|
t.Run(tt.name, func(t *testing.T) {
|
|||
|
|
// 测试实现...
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 前端测试
|
|||
|
|
|
|||
|
|
1. **组件测试**: 测试组件渲染和交互
|
|||
|
|
2. **Hook 测试**: 测试自定义 Hook
|
|||
|
|
3. **集成测试**: 测试页面级功能
|
|||
|
|
|
|||
|
|
```typescript
|
|||
|
|
import { render, screen, fireEvent } from '@testing-library/react';
|
|||
|
|
import { UserCard } from './UserCard';
|
|||
|
|
|
|||
|
|
describe('UserCard', () => {
|
|||
|
|
const mockUser = {
|
|||
|
|
id: '1',
|
|||
|
|
name: 'John Doe',
|
|||
|
|
email: 'john@example.com',
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
it('renders user information', () => {
|
|||
|
|
render(<UserCard user={mockUser} />);
|
|||
|
|
|
|||
|
|
expect(screen.getByText('John Doe')).toBeInTheDocument();
|
|||
|
|
expect(screen.getByText('john@example.com')).toBeInTheDocument();
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
it('calls onEdit when edit button is clicked', () => {
|
|||
|
|
const onEdit = jest.fn();
|
|||
|
|
render(<UserCard user={mockUser} onEdit={onEdit} />);
|
|||
|
|
|
|||
|
|
fireEvent.click(screen.getByText('编辑'));
|
|||
|
|
expect(onEdit).toHaveBeenCalledWith(mockUser);
|
|||
|
|
});
|
|||
|
|
});
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 📚 文档贡献
|
|||
|
|
|
|||
|
|
#### 文档类型
|
|||
|
|
|
|||
|
|
1. **API 文档**: Swagger/OpenAPI 规范
|
|||
|
|
2. **用户文档**: 使用指南和教程
|
|||
|
|
3. **开发文档**: 技术文档和架构说明
|
|||
|
|
4. **README**: 项目介绍和快速开始
|
|||
|
|
|
|||
|
|
#### 文档规范
|
|||
|
|
|
|||
|
|
1. **清晰简洁**: 使用简单明了的语言
|
|||
|
|
2. **结构化**: 合理的标题层级和目录
|
|||
|
|
3. **示例丰富**: 提供代码示例和截图
|
|||
|
|
4. **及时更新**: 与代码变更保持同步
|
|||
|
|
|
|||
|
|
### 🌐 国际化贡献
|
|||
|
|
|
|||
|
|
我们欢迎社区贡献多语言支持:
|
|||
|
|
|
|||
|
|
1. **翻译文件**: 位于 `locales/` 目录
|
|||
|
|
2. **支持语言**: 中文、英文、日文等
|
|||
|
|
3. **翻译规范**: 保持术语一致性
|
|||
|
|
4. **文化适配**: 考虑本地化需求
|
|||
|
|
|
|||
|
|
### 🎯 Issue 管理
|
|||
|
|
|
|||
|
|
#### 报告 Bug
|
|||
|
|
|
|||
|
|
使用 Bug 报告模板,包含:
|
|||
|
|
- 问题描述和重现步骤
|
|||
|
|
- 期望行为和实际行为
|
|||
|
|
- 环境信息(版本、操作系统等)
|
|||
|
|
- 相关日志和截图
|
|||
|
|
|
|||
|
|
#### 功能建议
|
|||
|
|
|
|||
|
|
使用功能建议模板,包含:
|
|||
|
|
- 功能描述和使用场景
|
|||
|
|
- 预期收益和影响
|
|||
|
|
- 实现建议(可选)
|
|||
|
|
- 相关参考资料
|
|||
|
|
|
|||
|
|
### 🏆 贡献者认可
|
|||
|
|
|
|||
|
|
我们重视每一位贡献者的努力:
|
|||
|
|
|
|||
|
|
1. **贡献者列表**: 在 README 中展示
|
|||
|
|
2. **发布说明**: 在版本发布中致谢
|
|||
|
|
3. **社区活动**: 邀请参与社区活动
|
|||
|
|
4. **技术交流**: 提供技术交流机会
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 许可证
|
|||
|
|
|
|||
|
|
### 📄 许可证信息
|
|||
|
|
|
|||
|
|
PandaWiki 采用 **GNU Affero General Public License v3.0 (AGPL-3.0)** 许可证。
|
|||
|
|
|
|||
|
|
### 🔍 许可证详情
|
|||
|
|
|
|||
|
|
#### 权利
|
|||
|
|
|
|||
|
|
根据 AGPL-3.0 许可证,您享有以下权利:
|
|||
|
|
|
|||
|
|
1. **使用权**: 可以自由使用本软件
|
|||
|
|
2. **修改权**: 可以修改源代码以满足您的需求
|
|||
|
|
3. **分发权**: 可以分发原始软件或修改后的版本
|
|||
|
|
4. **专利权**: 获得贡献者的专利许可
|
|||
|
|
|
|||
|
|
#### 义务
|
|||
|
|
|
|||
|
|
使用本软件时,您需要遵守以下义务:
|
|||
|
|
|
|||
|
|
1. **开源义务**:
|
|||
|
|
- 分发软件时必须提供源代码
|
|||
|
|
- 修改后的版本也必须采用相同许可证
|
|||
|
|
- 必须保留原始的版权声明和许可证信息
|
|||
|
|
|
|||
|
|
2. **网络服务义务**:
|
|||
|
|
- 如果您通过网络提供基于本软件的服务
|
|||
|
|
- 必须向用户提供完整的源代码
|
|||
|
|
- 包括您对软件所做的任何修改
|
|||
|
|
|
|||
|
|
3. **通知义务**:
|
|||
|
|
- 在软件界面中显示适当的版权声明
|
|||
|
|
- 告知用户他们可以获取源代码的方式
|
|||
|
|
|
|||
|
|
#### 商业使用
|
|||
|
|
|
|||
|
|
AGPL-3.0 允许商业使用,但有特殊要求:
|
|||
|
|
|
|||
|
|
1. **SaaS 服务**: 如果您提供基于 PandaWiki 的 SaaS 服务,必须开源您的修改
|
|||
|
|
2. **内部使用**: 企业内部使用不需要开源,但网络服务需要
|
|||
|
|
3. **分发软件**: 分发包含 PandaWiki 的软件产品时必须开源
|
|||
|
|
|
|||
|
|
### ⚖️ 许可证对比
|
|||
|
|
|
|||
|
|
| 许可证类型 | 使用 | 修改 | 分发 | 商业使用 | 开源要求 | 网络服务开源 |
|
|||
|
|
|------------|------|------|------|----------|----------|--------------|
|
|||
|
|
| MIT | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ |
|
|||
|
|
| GPL-3.0 | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ |
|
|||
|
|
| AGPL-3.0 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
|
|||
|
|
|
|||
|
|
### 📋 合规指南
|
|||
|
|
|
|||
|
|
#### 开源合规
|
|||
|
|
|
|||
|
|
如果您需要开源您的修改:
|
|||
|
|
|
|||
|
|
1. **源代码管理**:
|
|||
|
|
- 在公开的代码仓库中维护源代码
|
|||
|
|
- 确保代码可以被用户访问和下载
|
|||
|
|
- 提供构建和部署说明
|
|||
|
|
|
|||
|
|
2. **许可证文件**:
|
|||
|
|
- 在项目根目录包含 LICENSE 文件
|
|||
|
|
- 在每个源文件头部包含许可证声明
|
|||
|
|
- 更新 COPYRIGHT 文件记录修改
|
|||
|
|
|
|||
|
|
3. **变更记录**:
|
|||
|
|
- 记录您对原始软件的修改
|
|||
|
|
- 在 CHANGELOG 中说明变更内容
|
|||
|
|
- 标明修改的作者和时间
|
|||
|
|
|
|||
|
|
#### 商业合规
|
|||
|
|
|
|||
|
|
对于商业使用场景:
|
|||
|
|
|
|||
|
|
1. **内部部署**: 企业内部使用无需开源
|
|||
|
|
2. **客户部署**: 为客户部署需要提供源代码
|
|||
|
|
3. **SaaS 服务**: 提供网络服务必须开源修改
|
|||
|
|
4. **软件分发**: 分发软件产品必须开源
|
|||
|
|
|
|||
|
|
#### 法律建议
|
|||
|
|
|
|||
|
|
我们建议:
|
|||
|
|
|
|||
|
|
1. **咨询律师**: 对于复杂的商业场景,请咨询专业律师
|
|||
|
|
2. **许可证审查**: 定期审查您的许可证合规性
|
|||
|
|
3. **文档记录**: 保留详细的使用和修改记录
|
|||
|
|
4. **社区沟通**: 与社区保持开放的沟通
|
|||
|
|
|
|||
|
|
### 🤝 双重许可
|
|||
|
|
|
|||
|
|
对于有特殊需求的商业用户,我们可能提供双重许可选项:
|
|||
|
|
|
|||
|
|
1. **AGPL-3.0**: 免费使用,需要开源
|
|||
|
|
2. **商业许可**: 付费使用,无需开源
|
|||
|
|
|
|||
|
|
如需商业许可,请联系:
|
|||
|
|
- 邮箱: [商业许可联系邮箱]
|
|||
|
|
- 官网: [商业许可页面]
|
|||
|
|
|
|||
|
|
### 📞 许可证咨询
|
|||
|
|
|
|||
|
|
如果您对许可证有任何疑问:
|
|||
|
|
|
|||
|
|
1. **常见问题**: 查看 [许可证 FAQ]
|
|||
|
|
2. **社区讨论**: 在 GitHub Discussions 中提问
|
|||
|
|
3. **官方支持**: 联系官方技术支持
|
|||
|
|
4. **法律咨询**: 咨询专业的开源许可证律师
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 社区支持
|
|||
|
|
|
|||
|
|
### 🌟 社区概览
|
|||
|
|
|
|||
|
|
PandaWiki 拥有活跃的开源社区,我们致力于为用户和开发者提供全方位的支持和交流平台。
|
|||
|
|
|
|||
|
|
### 💬 交流渠道
|
|||
|
|
|
|||
|
|
#### 官方渠道
|
|||
|
|
|
|||
|
|
1. **GitHub Discussions**:
|
|||
|
|
- 地址: https://github.com/chaitin/PandaWiki/discussions
|
|||
|
|
- 用途: 技术讨论、功能建议、使用经验分享
|
|||
|
|
|
|||
|
|
2. **GitHub Issues**:
|
|||
|
|
- 地址: https://github.com/chaitin/PandaWiki/issues
|
|||
|
|
- 用途: Bug 报告、功能请求、技术支持
|
|||
|
|
|
|||
|
|
3. **官方网站**:
|
|||
|
|
- 地址: https://ly.safepoint.cloud/Br48PoX
|
|||
|
|
- 内容: 产品介绍、文档、下载链接
|
|||
|
|
|
|||
|
|
#### 中文社区
|
|||
|
|
|
|||
|
|
1. **微信交流群**:
|
|||
|
|
- 扫描二维码加入: [微信群二维码]
|
|||
|
|
- 群内讨论: 使用问题、技术交流、版本更新
|
|||
|
|
|
|||
|
|
2. **QQ 交流群**:
|
|||
|
|
- 群号: [QQ群号]
|
|||
|
|
- 适合: 实时技术讨论和问题解答
|
|||
|
|
|
|||
|
|
#### 国际社区
|
|||
|
|
|
|||
|
|
1. **Discord 服务器**:
|
|||
|
|
- 邀请链接: [Discord邀请链接]
|
|||
|
|
- 频道: 技术支持、开发讨论、公告通知
|
|||
|
|
|
|||
|
|
2. **Reddit 社区**:
|
|||
|
|
- 地址: r/PandaWiki
|
|||
|
|
- 内容: 用户分享、技术讨论、新闻更新
|
|||
|
|
|
|||
|
|
### 📚 学习资源
|
|||
|
|
|
|||
|
|
#### 官方文档
|
|||
|
|
|
|||
|
|
1. **用户手册**:
|
|||
|
|
- 快速开始指南
|
|||
|
|
- 功能使用教程
|
|||
|
|
- 常见问题解答
|
|||
|
|
- 最佳实践指南
|
|||
|
|
|
|||
|
|
2. **开发者文档**:
|
|||
|
|
- API 参考文档
|
|||
|
|
- 架构设计说明
|
|||
|
|
- 插件开发指南
|
|||
|
|
- 贡献者指南
|
|||
|
|
|
|||
|
|
3. **部署指南**:
|
|||
|
|
- 安装部署教程
|
|||
|
|
- 配置参数说明
|
|||
|
|
- 运维最佳实践
|
|||
|
|
- 故障排除指南
|
|||
|
|
|
|||
|
|
#### 视频教程
|
|||
|
|
|
|||
|
|
1. **官方教程**:
|
|||
|
|
- 产品介绍视频
|
|||
|
|
- 功能演示视频
|
|||
|
|
- 部署安装教程
|
|||
|
|
- 高级配置指南
|
|||
|
|
|
|||
|
|
2. **社区贡献**:
|
|||
|
|
- 用户使用经验分享
|
|||
|
|
- 开发者技术分享
|
|||
|
|
- 实际案例分析
|
|||
|
|
- 问题解决方案
|
|||
|
|
|
|||
|
|
#### 博客文章
|
|||
|
|
|
|||
|
|
1. **技术博客**:
|
|||
|
|
- 架构设计思路
|
|||
|
|
- 技术实现细节
|
|||
|
|
- 性能优化经验
|
|||
|
|
- 安全最佳实践
|
|||
|
|
|
|||
|
|
2. **用户故事**:
|
|||
|
|
- 企业使用案例
|
|||
|
|
- 个人项目分享
|
|||
|
|
- 迁移经验总结
|
|||
|
|
- 定制开发案例
|
|||
|
|
|
|||
|
|
### 🎯 获取帮助
|
|||
|
|
|
|||
|
|
#### 技术支持
|
|||
|
|
|
|||
|
|
1. **问题分类**:
|
|||
|
|
- 🐛 Bug 报告: 使用 GitHub Issues
|
|||
|
|
- ❓ 使用问题: 使用 GitHub Discussions
|
|||
|
|
- 💡 功能建议: 使用 GitHub Issues
|
|||
|
|
- 🔧 技术讨论: 使用社区群组
|
|||
|
|
|
|||
|
|
2. **响应时间**:
|
|||
|
|
- 紧急问题: 24 小时内响应
|
|||
|
|
- 一般问题: 3 个工作日内响应
|
|||
|
|
- 功能建议: 1 周内评估反馈
|
|||
|
|
|
|||
|
|
3. **支持范围**:
|
|||
|
|
- 安装部署问题
|
|||
|
|
- 功能使用指导
|
|||
|
|
- 配置参数说明
|
|||
|
|
- 故障排除协助
|
|||
|
|
|
|||
|
|
#### 商业支持
|
|||
|
|
|
|||
|
|
1. **企业服务**:
|
|||
|
|
- 专业技术支持
|
|||
|
|
- 定制开发服务
|
|||
|
|
- 培训和咨询
|
|||
|
|
- SLA 保障服务
|
|||
|
|
|
|||
|
|
2. **联系方式**:
|
|||
|
|
- 邮箱: [企业服务邮箱]
|
|||
|
|
- 电话: [企业服务电话]
|
|||
|
|
- 在线咨询: [企业服务网站]
|
|||
|
|
|
|||
|
|
### 🤝 参与社区
|
|||
|
|
|
|||
|
|
#### 贡献方式
|
|||
|
|
|
|||
|
|
1. **代码贡献**:
|
|||
|
|
- 修复 Bug
|
|||
|
|
- 开发新功能
|
|||
|
|
- 改进性能
|
|||
|
|
- 重构代码
|
|||
|
|
|
|||
|
|
2. **文档贡献**:
|
|||
|
|
- 完善文档
|
|||
|
|
- 翻译内容
|
|||
|
|
- 编写教程
|
|||
|
|
- 制作视频
|
|||
|
|
|
|||
|
|
3. **社区建设**:
|
|||
|
|
- 回答问题
|
|||
|
|
- 分享经验
|
|||
|
|
- 组织活动
|
|||
|
|
- 推广项目
|
|||
|
|
|
|||
|
|
#### 社区活动
|
|||
|
|
|
|||
|
|
1. **定期活动**:
|
|||
|
|
- 月度技术分享会
|
|||
|
|
- 季度开发者大会
|
|||
|
|
- 年度用户大会
|
|||
|
|
- 在线研讨会
|
|||
|
|
|
|||
|
|
2. **特殊活动**:
|
|||
|
|
- 黑客马拉松
|
|||
|
|
- 代码贡献竞赛
|
|||
|
|
- 文档改进活动
|
|||
|
|
- 社区建设奖励
|
|||
|
|
|
|||
|
|
### 🏆 社区荣誉
|
|||
|
|
|
|||
|
|
#### 贡献者认可
|
|||
|
|
|
|||
|
|
1. **贡献者徽章**:
|
|||
|
|
- 代码贡献者
|
|||
|
|
- 文档贡献者
|
|||
|
|
- 社区建设者
|
|||
|
|
- 长期支持者
|
|||
|
|
|
|||
|
|
2. **年度奖项**:
|
|||
|
|
- 最佳贡献者
|
|||
|
|
- 最佳新人
|
|||
|
|
- 最佳文档
|
|||
|
|
- 最佳社区建设
|
|||
|
|
|
|||
|
|
#### 企业合作
|
|||
|
|
|
|||
|
|
1. **合作伙伴**:
|
|||
|
|
- 技术合作伙伴
|
|||
|
|
- 解决方案合作伙伴
|
|||
|
|
- 培训合作伙伴
|
|||
|
|
- 生态合作伙伴
|
|||
|
|
|
|||
|
|
2. **案例展示**:
|
|||
|
|
- 成功案例分享
|
|||
|
|
- 最佳实践展示
|
|||
|
|
- 技术创新案例
|
|||
|
|
- 行业解决方案
|
|||
|
|
|
|||
|
|
### 📈 社区数据
|
|||
|
|
|
|||
|
|
#### 项目统计
|
|||
|
|
|
|||
|
|
- **GitHub Stars**: [实时数据]
|
|||
|
|
- **Fork 数量**: [实时数据]
|
|||
|
|
- **贡献者数量**: [实时数据]
|
|||
|
|
- **Issue 解决率**: [实时数据]
|
|||
|
|
|
|||
|
|
#### 社区规模
|
|||
|
|
|
|||
|
|
- **微信群成员**: [实时数据]
|
|||
|
|
- **Discord 成员**: [实时数据]
|
|||
|
|
- **月活跃用户**: [实时数据]
|
|||
|
|
- **文档访问量**: [实时数据]
|
|||
|
|
|
|||
|
|
### 📞 联系我们
|
|||
|
|
|
|||
|
|
#### 官方联系
|
|||
|
|
|
|||
|
|
- **项目主页**: https://github.com/chaitin/PandaWiki
|
|||
|
|
- **官方网站**: https://ly.safepoint.cloud/Br48PoX
|
|||
|
|
- **技术支持**: [技术支持邮箱]
|
|||
|
|
- **商务合作**: [商务合作邮箱]
|
|||
|
|
|
|||
|
|
#### 社交媒体
|
|||
|
|
|
|||
|
|
- **微博**: @PandaWiki
|
|||
|
|
- **Twitter**: @PandaWiki
|
|||
|
|
- **LinkedIn**: PandaWiki
|
|||
|
|
- **YouTube**: PandaWiki Channel
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📊 附录
|
|||
|
|
|
|||
|
|
### 🔗 相关链接
|
|||
|
|
|
|||
|
|
- **项目仓库**: https://github.com/chaitin/PandaWiki
|
|||
|
|
- **官方网站**: https://ly.safepoint.cloud/Br48PoX
|
|||
|
|
- **在线文档**: https://pandawiki.docs.baizhi.cloud
|
|||
|
|
- **API 文档**: [Swagger UI 地址]
|
|||
|
|
- **发布页面**: https://github.com/chaitin/PandaWiki/releases
|
|||
|
|
|
|||
|
|
### 📋 版本历史
|
|||
|
|
|
|||
|
|
| 版本 | 发布日期 | 主要更新 |
|
|||
|
|
|------|----------|----------|
|
|||
|
|
| v3.13.1 | 2024-01-01 | Bug 修复和性能优化 |
|
|||
|
|
| v3.12.1 | 2023-12-15 | 新增 AI 搜索功能 |
|
|||
|
|
| v3.12.0 | 2023-12-01 | 重构前端架构 |
|
|||
|
|
| v3.11.0 | 2023-11-15 | 新增多语言支持 |
|
|||
|
|
|
|||
|
|
### 🙏 致谢
|
|||
|
|
|
|||
|
|
感谢所有为 PandaWiki 项目做出贡献的开发者、用户和社区成员。特别感谢:
|
|||
|
|
|
|||
|
|
- 长亭科技团队的核心开发
|
|||
|
|
- 社区贡献者的代码和文档贡献
|
|||
|
|
- 用户反馈和建议
|
|||
|
|
- 开源社区的支持和帮助
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
**文档版本**: v1.0
|
|||
|
|
**最后更新**: 2024年1月1日
|
|||
|
|
**维护团队**: PandaWiki 开发团队
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
*本文档基于 PandaWiki v3.13.1 版本编写,如有疑问或建议,请通过 GitHub Issues 或社区群组联系我们。*
|