add ai-docs folder
This commit is contained in:
parent
461617d8a6
commit
209f1403b5
143
apps/jingrow/ai-docs/README.md
Normal file
143
apps/jingrow/ai-docs/README.md
Normal file
@ -0,0 +1,143 @@
|
|||||||
|
# Jlocal AI开发文档
|
||||||
|
|
||||||
|
## 项目概述
|
||||||
|
|
||||||
|
Jlocal是Jingrow的本地版,与SaaS版Jingrow共享数据库,通过API保持通信。核心目标是实现本地运行智能体、触发钩子、定时任务等功能。
|
||||||
|
|
||||||
|
**与SaaS版Jingrow的关系**:
|
||||||
|
- 共享数据库:数据层完全共享
|
||||||
|
- API通信:通过HTTP API与SaaS版后端交互
|
||||||
|
- 前端兼容:前端代码与SaaS版保持一致,无需修改
|
||||||
|
|
||||||
|
**技术栈**:
|
||||||
|
- 后端: Python 3.10+ / FastAPI / MariaDB / Redis / Dramatiq
|
||||||
|
- 前端: Vue 3 / Naive UI / Pinia / Vue Router / Vite / TypeScript (与SaaS版相同)
|
||||||
|
|
||||||
|
## 架构概览
|
||||||
|
|
||||||
|
```
|
||||||
|
┌─────────────────────────────────────────────────────────────────────────┐
|
||||||
|
│ 前端 (Vue 3) │
|
||||||
|
│ 与SaaS版前端代码完全一致 │
|
||||||
|
└─────────────────────────────────────────────────────────────────────────┘
|
||||||
|
│
|
||||||
|
▼
|
||||||
|
┌─────────────────────────────────────────────────────────────────────────┐
|
||||||
|
│ Jlocal 本地后端 (FastAPI) │
|
||||||
|
│ ┌───────────────────────────────────────────────────────────────────┐ │
|
||||||
|
│ │ 路由分发层 │ │
|
||||||
|
│ │ ┌─────────────────────┐ ┌─────────────────────────────────┐ │ │
|
||||||
|
│ │ │ 本地路由 │ │ 代理路由 (转发到JINGROW) │ │ │
|
||||||
|
│ │ │ /jingrow/* │ │ /api/action/* (白名单外) │ │ │
|
||||||
|
│ │ │ /api/action/login │ │ /api/data/* │ │ │
|
||||||
|
│ │ │ /api/action/logout │ │ /api/v2/* │ │ │
|
||||||
|
│ │ │ 白名单内方法 │ └─────────────────────────────────┘ │ │
|
||||||
|
│ │ └─────────────────────┘ │ │ │
|
||||||
|
│ │ │ ▼ │ │
|
||||||
|
│ │ ▼ ┌─────────────────────────────┐ │ │
|
||||||
|
│ │ ┌─────────────────────┐ │ ApiAdapter │ │ │
|
||||||
|
│ │ │ 本地执行逻辑 │ │ (HTTP请求转发) │ │ │
|
||||||
|
│ │ │ - 智能体执行引擎 │ └─────────────────────────────┘ │ │
|
||||||
|
│ │ │ - 定时任务调度 │ │ │ │
|
||||||
|
│ │ │ - 本地任务队列 │ │ │ │
|
||||||
|
│ │ │ - 环境配置管理 │ ▼ │ │
|
||||||
|
│ │ └─────────────────────┘ ┌─────────────────────────────┐ │ │
|
||||||
|
│ └──────────────────────────────│ JINGROW_SERVER_URL │────┘ │
|
||||||
|
│ │ (SaaS版Jingrow后端) │ │
|
||||||
|
│ └─────────────────────────────┘ │
|
||||||
|
└────────────────────────────────────────────────────────────────────────┘
|
||||||
|
│
|
||||||
|
▼
|
||||||
|
┌─────────────────────────────────────────────────────────────────────────┐
|
||||||
|
│ 共享数据库 (MariaDB) │
|
||||||
|
│ - 所有数据表共享,包括:Local Ai Agent、Scheduled Job Type等 │
|
||||||
|
└─────────────────────────────────────────────────────────────────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
## 目录结构
|
||||||
|
|
||||||
|
```
|
||||||
|
jlocal/apps/jingrow/
|
||||||
|
├── jingrow/ # 后端核心
|
||||||
|
│ ├── __init__.py # 框架入口,白名单装饰器
|
||||||
|
│ ├── main.py # FastAPI应用入口
|
||||||
|
│ ├── config.py # 配置管理
|
||||||
|
│ ├── dramatiq.py # 任务队列入口
|
||||||
|
│ ├── app.py # 应用启动
|
||||||
|
│ ├── hooks.py # 钩子配置
|
||||||
|
│ ├── model/ # 数据模型层
|
||||||
|
│ │ └── page.py # Page基类
|
||||||
|
│ ├── core/ # 核心模块
|
||||||
|
│ │ ├── adapters/ # API适配器
|
||||||
|
│ │ │ └── api_adapter.py # JINGROW API转发
|
||||||
|
│ │ └── hooks/ # 钩子系统
|
||||||
|
│ ├── services/ # 服务层
|
||||||
|
│ │ ├── whitelist.py # 白名单路由服务
|
||||||
|
│ │ └── scheduler.py # 定时任务服务
|
||||||
|
│ ├── api/ # API路由
|
||||||
|
│ │ ├── auth_api.py # 认证API
|
||||||
|
│ │ ├── agents.py # 智能体API
|
||||||
|
│ │ ├── system.py # 系统配置API
|
||||||
|
│ │ └── ... # 其他API
|
||||||
|
│ ├── ai/ # AI模块
|
||||||
|
│ │ └── pagetype/ # AI Agent相关
|
||||||
|
│ ├── utils/ # 工具函数
|
||||||
|
│ │ ├── auth.py # 认证工具
|
||||||
|
│ │ ├── jingrow_api.py # JINGROW API调用
|
||||||
|
│ │ └── ... # 其他工具
|
||||||
|
│ └── tools/ # AI工具
|
||||||
|
├── frontend/ # 新版前端 (与SaaS版相同)
|
||||||
|
├── frontend_old/ # 旧版前端 (已废弃)
|
||||||
|
├── ai-docs/ # 本文档
|
||||||
|
└── pyproject.toml # 项目配置
|
||||||
|
```
|
||||||
|
|
||||||
|
## 核心概念
|
||||||
|
|
||||||
|
### 路由分流策略
|
||||||
|
|
||||||
|
**本地处理的路由**:
|
||||||
|
- `/jingrow/*` - 本地专用API (环境配置、本地任务等)
|
||||||
|
- `/api/action/login` - 登录 (需要设置本地cookie)
|
||||||
|
- `/api/action/logout` - 登出 (需要清除本地cookie)
|
||||||
|
- 白名单内的RPC方法 - 本地执行的函数
|
||||||
|
|
||||||
|
**转发到JINGROW的路由**:
|
||||||
|
- `/api/data/*` - CRUD操作
|
||||||
|
- `/api/v2/*` - RESTful API
|
||||||
|
- `/api/action/*` - 白名单外的RPC方法
|
||||||
|
|
||||||
|
### 白名单机制
|
||||||
|
|
||||||
|
使用 `@jingrow.whitelist()` 装饰器暴露API:
|
||||||
|
```python
|
||||||
|
@jingrow.whitelist()
|
||||||
|
def my_local_method(arg1, arg2):
|
||||||
|
return {"result": "data"}
|
||||||
|
|
||||||
|
# 允许访客访问
|
||||||
|
@jingrow.whitelist(allow_guest=True)
|
||||||
|
def public_method():
|
||||||
|
pass
|
||||||
|
```
|
||||||
|
|
||||||
|
### 配置管理
|
||||||
|
|
||||||
|
环境变量配置 (`.env`):
|
||||||
|
```
|
||||||
|
JINGROW_SERVER_URL=https://admin.jingrow.com
|
||||||
|
JINGROW_API_KEY=xxx
|
||||||
|
JINGROW_API_SECRET=xxx
|
||||||
|
BACKEND_HOST=0.0.0.0
|
||||||
|
BACKEND_PORT=9001
|
||||||
|
```
|
||||||
|
|
||||||
|
## 文档索引
|
||||||
|
|
||||||
|
| 文档 | 说明 |
|
||||||
|
|------|------|
|
||||||
|
| [架构设计](guides/architecture.md) | 系统架构/路由分流/数据流 |
|
||||||
|
| [路由分流策略](guides/routing.md) | 本地路由与转发路由详解 |
|
||||||
|
| [后端API](backend/api.md) | 本地API/白名单机制 |
|
||||||
|
| [前端API](frontend/api.md) | API封装/状态管理 |
|
||||||
|
| [开发规范](guides/best-practices.md) | 代码规范/最佳实践 |
|
||||||
193
apps/jingrow/ai-docs/guides/architecture.md
Normal file
193
apps/jingrow/ai-docs/guides/architecture.md
Normal file
@ -0,0 +1,193 @@
|
|||||||
|
# 系统架构
|
||||||
|
|
||||||
|
## Jlocal与Jingrow的关系
|
||||||
|
|
||||||
|
### 设计理念
|
||||||
|
|
||||||
|
Jlocal作为Jingrow的本地版,核心设计理念是:
|
||||||
|
|
||||||
|
1. **前端完全兼容**:前端代码与SaaS版完全一致,无需任何修改
|
||||||
|
2. **数据层共享**:与SaaS版共享同一数据库
|
||||||
|
3. **本地执行优先**:智能体执行、定时任务等需要本地资源的操作在本地完成
|
||||||
|
4. **API透明转发**:其他API请求透明转发到SaaS版后端
|
||||||
|
|
||||||
|
### 架构图
|
||||||
|
|
||||||
|
```
|
||||||
|
┌─────────────────────────────────────────────────────────────────────────────┐
|
||||||
|
│ 用户浏览器 │
|
||||||
|
└─────────────────────────────────────────────────────────────────────────────┘
|
||||||
|
│
|
||||||
|
▼
|
||||||
|
┌─────────────────────────────────────────────────────────────────────────────┐
|
||||||
|
│ 前端 (Vue 3 + Naive UI) │
|
||||||
|
│ │
|
||||||
|
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
|
||||||
|
│ │ shared/api/ │ │shared/stores│ │ views/ │ │ core/ │ │
|
||||||
|
│ │ API封装 │ │ 状态管理 │ │ 页面组件 │ │ 核心组件 │ │
|
||||||
|
│ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │
|
||||||
|
│ │
|
||||||
|
│ API调用格式: /api/action/{module.path.method} │
|
||||||
|
│ /api/data/{pagetype} │
|
||||||
|
└─────────────────────────────────────────────────────────────────────────────┘
|
||||||
|
│
|
||||||
|
▼
|
||||||
|
┌─────────────────────────────────────────────────────────────────────────────┐
|
||||||
|
│ Jlocal 本地后端 (FastAPI) │
|
||||||
|
│ │
|
||||||
|
│ ┌───────────────────────────────────────────────────────────────────────┐ │
|
||||||
|
│ │ 路由分发层 │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ 请求进入 → 路由匹配 → 本地处理 or 转发JINGROW │ │
|
||||||
|
│ └───────────────────────────────────────────────────────────────────────┘ │
|
||||||
|
│ │ │
|
||||||
|
│ ┌───────────────────────┼───────────────────────┐ │
|
||||||
|
│ ▼ ▼ ▼ │
|
||||||
|
│ ┌───────────────────┐ ┌───────────────────┐ ┌───────────────────┐ │
|
||||||
|
│ │ 本地路由 │ │ 白名单路由 │ │ 代理路由 │ │
|
||||||
|
│ │ /jingrow/* │ │ /api/action/* │ │ /api/data/* │ │
|
||||||
|
│ │ │ │ (白名单内) │ │ /api/v2/* │ │
|
||||||
|
│ │ - login │ │ │ │ /api/action/* │ │
|
||||||
|
│ │ - logout │ │ 本地执行函数 │ │ (白名单外) │ │
|
||||||
|
│ │ - system │ │ │ │ │ │
|
||||||
|
│ │ - agents │ └───────────────────┘ └───────────────────┘ │
|
||||||
|
│ │ - scheduler │ │ │
|
||||||
|
│ │ - local_jobs │ │ │
|
||||||
|
│ └───────────────────┘ ▼ │
|
||||||
|
│ ┌───────────────────┐ │
|
||||||
|
│ │ ApiAdapter │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ HTTP请求转发到 │ │
|
||||||
|
│ │ JINGROW_SERVER │ │
|
||||||
|
│ └───────────────────┘ │
|
||||||
|
└─────────────────────────────────────────────────────────────────────────────┘
|
||||||
|
│
|
||||||
|
┌───────────────────────┼───────────────────────┐
|
||||||
|
▼ ▼ ▼
|
||||||
|
┌─────────────────────┐ ┌─────────────────────┐ ┌─────────────────────┐
|
||||||
|
│ 本地执行引擎 │ │ 共享数据库 │ │ JINGROW_SERVER │
|
||||||
|
│ │ │ (MariaDB) │ │ (SaaS版后端) │
|
||||||
|
│ - 智能体执行 │ │ │ │ │
|
||||||
|
│ - 定时任务调度 │ │ 所有数据表共享 │ │ - 完整业务逻辑 │
|
||||||
|
│ - 钩子触发 │ │ │ │ - 权限验证 │
|
||||||
|
│ - 本地任务队列 │ │ │ │ - 数据操作 │
|
||||||
|
│ - Dramatiq Worker│ │ │ │ │
|
||||||
|
└─────────────────────┘ └─────────────────────┘ └─────────────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
## 路由分流详解
|
||||||
|
|
||||||
|
### 分流规则
|
||||||
|
|
||||||
|
| 路由模式 | 处理位置 | 说明 |
|
||||||
|
|----------|----------|------|
|
||||||
|
| `/jingrow/login` | 本地 | 登录,设置本地cookie |
|
||||||
|
| `/jingrow/logout` | 本地 | 登出,清除本地cookie |
|
||||||
|
| `/jingrow/system/*` | 本地 | 环境配置管理 |
|
||||||
|
| `/jingrow/agents/*` | 本地 | 智能体执行 |
|
||||||
|
| `/jingrow/scheduler/*` | 本地 | 调度器管理 |
|
||||||
|
| `/jingrow/local_jobs/*` | 本地 | 本地任务管理 |
|
||||||
|
| `/api/action/login` | 本地 | 兼容SaaS版前端登录 |
|
||||||
|
| `/api/action/logout` | 本地 | 兼容SaaS版前端登出 |
|
||||||
|
| `/api/action/{method}` | 白名单判断 | 白名单内→本地,白名单外→转发 |
|
||||||
|
| `/api/data/*` | 转发JINGROW | CRUD操作 |
|
||||||
|
| `/api/v2/*` | 转发JINGROW | RESTful API |
|
||||||
|
|
||||||
|
### 白名单机制
|
||||||
|
|
||||||
|
白名单用于标记哪些RPC方法需要在本地执行:
|
||||||
|
|
||||||
|
```python
|
||||||
|
# 注册白名单函数
|
||||||
|
@jingrow.whitelist()
|
||||||
|
def local_method(arg1, arg2):
|
||||||
|
"""这个方法会在本地执行"""
|
||||||
|
return {"result": "data"}
|
||||||
|
|
||||||
|
# 允许访客访问
|
||||||
|
@jingrow.whitelist(allow_guest=True)
|
||||||
|
def public_method():
|
||||||
|
pass
|
||||||
|
|
||||||
|
# 限制HTTP方法
|
||||||
|
@jingrow.whitelist(methods=["POST"])
|
||||||
|
def post_only_method():
|
||||||
|
pass
|
||||||
|
```
|
||||||
|
|
||||||
|
**路由处理流程**:
|
||||||
|
|
||||||
|
```
|
||||||
|
请求: /api/action/jingrow.realtime.get_user_info
|
||||||
|
↓
|
||||||
|
路由分发层
|
||||||
|
↓
|
||||||
|
检查是否在白名单中?
|
||||||
|
↙ ↘
|
||||||
|
是 否
|
||||||
|
↓ ↓
|
||||||
|
本地执行 转发JINGROW
|
||||||
|
```
|
||||||
|
|
||||||
|
## 数据流
|
||||||
|
|
||||||
|
### 登录流程
|
||||||
|
|
||||||
|
```
|
||||||
|
1. 前端 → POST /api/action/login {usr, pwd}
|
||||||
|
2. Jlocal → JINGROW: POST /api/action/login
|
||||||
|
3. JINGROW → 返回 session_cookie
|
||||||
|
4. Jlocal → 设置本地cookie (sid)
|
||||||
|
5. Jlocal → 返回 {message: "Logged In"}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 智能体执行流程
|
||||||
|
|
||||||
|
```
|
||||||
|
1. 前端 → POST /jingrow/agents/execute {agent_id}
|
||||||
|
2. Jlocal → 创建 Local Job 记录
|
||||||
|
3. Jlocal → Dramatiq 队列入队
|
||||||
|
4. Worker → 执行智能体流程
|
||||||
|
5. Worker → 更新 Local Job 状态
|
||||||
|
6. Worker → 同步状态到 JINGROW (可选)
|
||||||
|
```
|
||||||
|
|
||||||
|
### 定时任务流程
|
||||||
|
|
||||||
|
```
|
||||||
|
1. APScheduler → 触发定时任务
|
||||||
|
2. Jlocal → 检查 Local Ai Agent 配置
|
||||||
|
3. Jlocal → 执行智能体
|
||||||
|
4. Jlocal → 记录执行结果
|
||||||
|
```
|
||||||
|
|
||||||
|
## 模块职责
|
||||||
|
|
||||||
|
### 后端模块
|
||||||
|
|
||||||
|
| 模块 | 职责 |
|
||||||
|
|------|------|
|
||||||
|
| `main.py` | FastAPI应用入口,路由注册 |
|
||||||
|
| `services/whitelist.py` | 白名单路由服务,RPC方法分发 |
|
||||||
|
| `services/scheduler.py` | APScheduler定时任务管理 |
|
||||||
|
| `core/adapters/api_adapter.py` | JINGROW API转发适配器 |
|
||||||
|
| `api/auth_api.py` | 认证相关API |
|
||||||
|
| `api/agents.py` | 智能体执行API |
|
||||||
|
| `api/system.py` | 系统配置API |
|
||||||
|
| `utils/auth.py` | 认证工具函数 |
|
||||||
|
| `utils/jingrow_api.py` | JINGROW API调用封装 |
|
||||||
|
|
||||||
|
### 前端模块
|
||||||
|
|
||||||
|
前端模块与SaaS版完全相同,详见 [frontend/api.md](../frontend/api.md)
|
||||||
|
|
||||||
|
## 与SaaS版差异
|
||||||
|
|
||||||
|
| 功能 | SaaS版 | Jlocal |
|
||||||
|
|------|--------|--------|
|
||||||
|
| 后端框架 | Werkzeug + jingrow ORM | FastAPI |
|
||||||
|
| 任务队列 | Celery + Redis | Dramatiq + Redis |
|
||||||
|
| 定时任务 | jingrow scheduler | APScheduler |
|
||||||
|
| 智能体执行 | 后端执行 | 本地执行 |
|
||||||
|
| 数据库 | 独立 | 共享 |
|
||||||
|
| 前端 | Vue 3 | 相同代码 |
|
||||||
191
apps/jingrow/ai-docs/guides/routing.md
Normal file
191
apps/jingrow/ai-docs/guides/routing.md
Normal file
@ -0,0 +1,191 @@
|
|||||||
|
# Jlocal 路由机制
|
||||||
|
|
||||||
|
## 概述
|
||||||
|
|
||||||
|
Jlocal 基于 FastAPI 实现路由系统,采用**静态路由 + 动态路由**双层架构:
|
||||||
|
|
||||||
|
```
|
||||||
|
请求 → FastAPI
|
||||||
|
↓
|
||||||
|
┌────┴────┐
|
||||||
|
↓ ↓
|
||||||
|
静态路由 动态路由
|
||||||
|
(api/*) (whitelist)
|
||||||
|
↓ ↓
|
||||||
|
本地处理 白名单判断
|
||||||
|
```
|
||||||
|
|
||||||
|
## 路由注册顺序
|
||||||
|
|
||||||
|
```python
|
||||||
|
# main.py
|
||||||
|
|
||||||
|
def create_app():
|
||||||
|
# 1. 自动注册 api 目录下的静态路由
|
||||||
|
include_routers_from_package(app, "jingrow.api")
|
||||||
|
|
||||||
|
# 2. 手动注册动态路由(最后注册,避免冲突)
|
||||||
|
app.include_router(router) # whitelist.py 的 router
|
||||||
|
```
|
||||||
|
|
||||||
|
**重要**:注册顺序决定路由匹配优先级,静态路由优先于动态路由。
|
||||||
|
|
||||||
|
## 一、静态路由(api 目录)
|
||||||
|
|
||||||
|
### 自动注册机制
|
||||||
|
|
||||||
|
`jingrow/api/` 目录下的模块会被自动扫描注册:
|
||||||
|
|
||||||
|
```python
|
||||||
|
# utils/router_auto_register.py
|
||||||
|
|
||||||
|
def include_routers_from_package(app: FastAPI, package: str):
|
||||||
|
pkg = importlib.import_module(package)
|
||||||
|
modules = list(pkgutil.iter_modules(pkg.__path__, package + "."))
|
||||||
|
|
||||||
|
for module_info in modules:
|
||||||
|
mod = importlib.import_module(module_info.name)
|
||||||
|
router = getattr(mod, "router", None)
|
||||||
|
if router is not None:
|
||||||
|
app.include_router(router)
|
||||||
|
```
|
||||||
|
|
||||||
|
### 模块规范
|
||||||
|
|
||||||
|
每个路由模块必须:
|
||||||
|
|
||||||
|
1. 定义 `router = APIRouter()` 变量
|
||||||
|
2. 使用明确的路由路径(避免通配符冲突)
|
||||||
|
|
||||||
|
```python
|
||||||
|
# api/auth_api.py 示例
|
||||||
|
|
||||||
|
router = APIRouter()
|
||||||
|
|
||||||
|
@router.post("/api/action/login")
|
||||||
|
async def login_route(login_data: LoginRequest):
|
||||||
|
# 本地处理登录逻辑
|
||||||
|
result = login(login_data.username, login_data.password)
|
||||||
|
return create_response_with_cookie(result, result.get("session_cookie"))
|
||||||
|
```
|
||||||
|
|
||||||
|
## 二、动态路由(whitelist)
|
||||||
|
|
||||||
|
### 路由定义
|
||||||
|
|
||||||
|
```python
|
||||||
|
# services/whitelist.py
|
||||||
|
|
||||||
|
router = APIRouter() # 无前缀
|
||||||
|
|
||||||
|
@router.api_route("/{module_path:path}", methods=["GET", "POST", "PUT", "DELETE"])
|
||||||
|
async def handle_request(request: Request, module_path: str):
|
||||||
|
# 验证格式:必须包含点(如 jingrow.sessions.get_boot_info)
|
||||||
|
if '.' not in module_path:
|
||||||
|
raise HTTPException(status_code=404, detail="Not Found")
|
||||||
|
|
||||||
|
return await _process_whitelist_call(request, module_path)
|
||||||
|
```
|
||||||
|
|
||||||
|
### 处理流程
|
||||||
|
|
||||||
|
```
|
||||||
|
请求: /jingrow.sessions.get_boot_info
|
||||||
|
↓
|
||||||
|
动态导入模块
|
||||||
|
↓
|
||||||
|
检查白名单装饰器
|
||||||
|
↙ ↘
|
||||||
|
有 无
|
||||||
|
↓ ↓
|
||||||
|
本地执行 返回 404
|
||||||
|
```
|
||||||
|
|
||||||
|
### 白名单装饰器
|
||||||
|
|
||||||
|
```python
|
||||||
|
# 在任意模块中使用
|
||||||
|
|
||||||
|
import jingrow
|
||||||
|
|
||||||
|
@jingrow.whitelist()
|
||||||
|
def local_method(arg1, arg2):
|
||||||
|
"""需要登录才能调用"""
|
||||||
|
return {"result": "data"}
|
||||||
|
|
||||||
|
@jingrow.whitelist(allow_guest=True)
|
||||||
|
def public_method():
|
||||||
|
"""允许访客调用"""
|
||||||
|
return {"result": "public"}
|
||||||
|
|
||||||
|
@jingrow.whitelist(methods=["POST"])
|
||||||
|
def post_only_method():
|
||||||
|
"""只允许 POST 请求"""
|
||||||
|
return {"result": "created"}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 四、开发指南
|
||||||
|
|
||||||
|
### 添加白名单函数
|
||||||
|
|
||||||
|
1. 在任意模块中定义函数
|
||||||
|
2. 添加 `@jingrow.whitelist()` 装饰器
|
||||||
|
3. 确保模块被导入(在 main.py 或其他入口导入)
|
||||||
|
|
||||||
|
```python
|
||||||
|
# services/my_service.py
|
||||||
|
|
||||||
|
import jingrow
|
||||||
|
|
||||||
|
@jingrow.whitelist()
|
||||||
|
def my_rpc_method(param1: str):
|
||||||
|
return {"result": param1}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 路由冲突处理
|
||||||
|
|
||||||
|
1. 静态路由优先于动态路由
|
||||||
|
2. 精确匹配优先于通配符
|
||||||
|
3. 后注册的路由不会覆盖先注册的
|
||||||
|
|
||||||
|
## 五、注意事项
|
||||||
|
|
||||||
|
1. **不要在 whitelist.py 中添加业务逻辑**,它只负责路由分发
|
||||||
|
2. **本地特有功能使用 api 目录**,自动注册
|
||||||
|
3. **需要动态 RPC 调用使用白名单装饰器**
|
||||||
|
4. **路由路径要明确**,避免通配符冲突
|
||||||
|
|
||||||
|
## 六、SaaS 端转发
|
||||||
|
|
||||||
|
对于 SaaS 端已有的 API,需要在本地添加代理路由:
|
||||||
|
|
||||||
|
### 方式一:在 api 目录添加代理路由
|
||||||
|
|
||||||
|
```python
|
||||||
|
# api/data.py - 代理 /api/data/* 到 SaaS 端
|
||||||
|
|
||||||
|
from fastapi import APIRouter, Request
|
||||||
|
from fastapi.responses import JSONResponse
|
||||||
|
import requests
|
||||||
|
from jingrow.config import Config
|
||||||
|
|
||||||
|
router = APIRouter(prefix="/api/data")
|
||||||
|
|
||||||
|
@router.api_route("/{path:path}", methods=["GET", "POST", "PUT", "DELETE"])
|
||||||
|
async def proxy_data(request: Request, path: str):
|
||||||
|
url = f"{Config.jingrow_server_url}/api/data/{path}"
|
||||||
|
# 转发请求到 SaaS 端
|
||||||
|
resp = requests.get(url, headers={...}, timeout=30)
|
||||||
|
return JSONResponse(content=resp.json(), status_code=resp.status_code)
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### 常见需要转发的路由
|
||||||
|
|
||||||
|
| 路由 | 说明 |
|
||||||
|
|------|------|
|
||||||
|
| `/api/data/*` | CRUD 数据操作 |
|
||||||
|
| `/api/action/jingrow.sessions.*` | 会话相关 |
|
||||||
|
| `/api/action/jingrow.client.*` | 客户端数据获取 |
|
||||||
|
| `/api/action/jingrow.realtime.*` | 实时通信 |
|
||||||
Loading…
x
Reference in New Issue
Block a user