LinkToolDocs/web/dev/solution.md
2025-07-24 18:04:18 +08:00

267 lines
8.8 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.

# GIS与LLM结合Web应用设计与实施方案
## 一、数据库设计
### 1.1 核心数据表结构
#### 用户表users
| 字段名 | 类型 | 约束 | 描述 |
|--------|------|------|------|
| user_id | SERIAL | PRIMARY KEY | 用户唯一标识 |
| username | VARCHAR(50) | UNIQUE, NOT NULL | 用户名 |
| email | VARCHAR(100) | UNIQUE, NOT NULL | 用户邮箱 |
| password_hash | VARCHAR(255) | NOT NULL | 密码哈希 |
| api_key | VARCHAR(100) | UNIQUE | 第三方API密钥 |
| role | ENUM('admin', 'user') | DEFAULT 'user' | 用户角色 |
| created_at | TIMESTAMP | DEFAULT NOW() | 创建时间 |
| updated_at | TIMESTAMP | DEFAULT NOW() | 更新时间 |
#### 对话记录表conversations
| 字段名 | 类型 | 约束 | 描述 |
|--------|------|------|------|
| conversation_id | SERIAL | PRIMARY KEY | 对话唯一标识 |
| user_id | INTEGER | FOREIGN KEY(users.user_id) | 关联用户ID |
| title | VARCHAR(100) | NOT NULL | 对话标题 |
| created_at | TIMESTAMP | DEFAULT NOW() | 创建时间 |
| is_active | BOOLEAN | DEFAULT TRUE | 是否活跃 |
#### 对话消息表conversation_messages
| 字段名 | 类型 | 约束 | 描述 |
|--------|------|------|------|
| message_id | SERIAL | PRIMARY KEY | 消息唯一标识 |
| conversation_id | INTEGER | FOREIGN KEY(conversations.conversation_id) | 关联对话ID |
| sender | ENUM('user', 'system', 'llm') | NOT NULL | 发送者类型 |
| content | TEXT | NOT NULL | 消息内容 |
| content_type | ENUM('text', 'image', 'map') | DEFAULT 'text' | 内容类型 |
| timestamp | TIMESTAMP | DEFAULT NOW() | 发送时间 |
#### 空间分析任务表spatial_tasks
| 字段名 | 类型 | 约束 | 描述 |
|--------|------|------|------|
| task_id | SERIAL | PRIMARY KEY | 任务唯一标识 |
| user_id | INTEGER | FOREIGN KEY(users.user_id) | 关联用户ID |
| conversation_id | INTEGER | FOREIGN KEY(conversations.conversation_id) | 关联对话ID |
| mcp_service_name | VARCHAR(50) | NOT NULL | MCP服务名称 |
| tool_name | VARCHAR(50) | NOT NULL | 工具名称 |
| parameters | JSONB | NOT NULL | 任务参数 |
| status | ENUM('pending', 'executing', 'success', 'failed') | DEFAULT 'pending' | 任务状态 |
| result_path | VARCHAR(255) | NULL | 结果存储路径 |
| started_at | TIMESTAMP | NULL | 开始时间 |
| completed_at | TIMESTAMP | NULL | 完成时间 |
#### MCP服务配置表mcp_services
| 字段名 | 类型 | 约束 | 描述 |
|--------|------|------|------|
| service_id | SERIAL | PRIMARY KEY | 服务唯一标识 |
| name | VARCHAR(100) | NOT NULL | 服务名称 |
| service_type | ENUM('RESOURCE', 'PROMPT', 'TOOL') | NOT NULL | 服务类型 |
| description | TEXT | NULL | 服务描述 |
| url | VARCHAR(255) | NOT NULL | 服务URL |
| auth_method | ENUM('none', 'api_key', 'oauth2') | DEFAULT 'none' | 认证方式 |
| auth_config | JSONB | NULL | 认证配置 |
| schema | JSONB | NULL | 参数JSON Schema |
| is_official | BOOLEAN | DEFAULT FALSE | 是否官方认证 |
| created_at | TIMESTAMP | DEFAULT NOW() | 创建时间 |
#### 地图图层配置表map_layers
| 字段名 | 类型 | 约束 | 描述 |
|--------|------|------|------|
| layer_id | SERIAL | PRIMARY KEY | 图层唯一标识 |
| user_id | INTEGER | FOREIGN KEY(users.user_id) | 关联用户ID |
| name | VARCHAR(100) | NOT NULL | 图层名称 |
| data_source | VARCHAR(255) | NOT NULL | 数据源路径 |
| style_config | JSONB | NULL | 样式配置 |
| is_visible | BOOLEAN | DEFAULT TRUE | 是否可见 |
| z_index | INTEGER | DEFAULT 0 | 图层顺序 |
| created_at | TIMESTAMP | DEFAULT NOW() | 创建时间 |
### 1.2 数据库安全策略
#### 行级安全策略(RLS)
```sql
-- 启用RLS
ALTER TABLE spatial_tasks ENABLE ROW LEVEL SECURITY;
ALTER TABLE map_layers ENABLE ROW LEVEL SECURITY;
-- 创建策略
CREATE POLICY user_spatial_tasks_isolation ON spatial_tasks
FOR ALL USING (user_id = current_user_id());
CREATE POLICY user_layers_isolation ON map_layers
FOR ALL USING (user_id = current_user_id());
```
#### 索引设计
```sql
-- 性能优化索引
CREATE INDEX idx_spatial_tasks_user_id ON spatial_tasks(user_id);
CREATE INDEX idx_conversations_user_id ON conversations(user_id);
CREATE INDEX idx_mcp_services_type ON mcp_services(service_type);
```
## 二、系统模块设计
### 2.1 客户端模块
#### 2.1.1 UI层
| 模块 | 核心功能 | 关键函数 |
|------|----------|----------|
| 地图组件 | 图层渲染、交互控制 | `renderLayer(layerConfig)`、`handleMapClick(event)` |
| 对话窗口 | 消息展示、输入处理 | `appendMessage(message)`、`handleSend()` |
| 任务面板 | 任务列表、状态展示 | `updateTaskStatus(taskId, status)` |
| 设置面板 | 服务配置、参数调整 | `saveServiceConfig(config)` |
#### 2.1.2 Host层
| 模块 | 核心功能 | 关键函数 |
|------|----------|----------|
| LLM客户端 | 大模型请求、流式处理 | `requestStream(prompt, callbacks)` |
| 工具解析器 | XML解析、参数提取 | `parseToolCall(xmlContent)`、`validateParameters(params)` |
| 权限管理器 | 用户授权、操作审计 | `requestPermission(action)`、`logAction(action)` |
#### 2.1.3 Client层
| 模块 | 核心功能 | 关键函数 |
|------|----------|----------|
| MCP资源客户端 | 资源获取、缓存管理 | `getResource(uri, params)`、`cacheResource(resource)` |
| MCP工具客户端 | 工具调用、结果处理 | `callTool(toolName, params)`、`handleToolResponse(response)` |
| MCP提示客户端 | 模板加载、参数替换 | `getPromptTemplate(name)`、`renderPrompt(template, params)` |
### 2.2 服务端模块
#### 2.2.1 Server层
| 模块 | 核心功能 | 关键接口 |
|------|----------|----------|
| LLM服务 | 模型集成、流式响应 | `POST /api/v1/llm/chat` |
| MCP服务 | 服务注册、请求路由 | `POST /api/v1/mcp/execute` |
| 地图服务 | 图层管理、WMS发布 | `GET /api/v1/map/wms` |
| 用户服务 | 认证授权、配置管理 | `POST /api/v1/auth/login` |
#### 2.2.2 Resource层
| 模块 | 核心功能 | 技术实现 |
|------|----------|----------|
| 空间分析引擎 | 地理处理、数据转换 | GeoTools + JTS |
| 知识库服务 | 文档存储、检索 | PostgreSQL +向量索引 |
| 数据存储服务 | 文件管理、元数据 | MinIO + PostgreSQL |
## 三、API接口设计
### 3.1 客户端-服务端接口
#### LLM对话接口
```
POST /api/v1/llm/chat
Content-Type: application/json
Authorization: Bearer {token}
{
"conversation_id": "conv_123",
"prompt": "分析海珠区的建筑密度",
"stream": true,
"model": "deepseek-r1"
}
```
响应SSE
```
event: message
data: {"type": "text", "content": "正在调用空间分析工具..."}
event: tool_call
data: {
"service": "arcgis",
"tool": "density_analysis",
"parameters": {"region": "海珠区", "type": "building"}
}
event: message
data: {"type": "map", "content": "/api/v1/map/layers/result_456"}
```
#### MCP工具调用接口
```
POST /api/v1/mcp/execute
Content-Type: application/json
Authorization: Bearer {token}
{
"service_name": "arcgis",
"tool_name": "clip_analysis",
"parameters": {
"input_layer": "buildings",
"clip_layer": "haizhu_boundary"
}
}
```
响应:
```json
{
"request_id": "req_789",
"status": "success",
"result": {
"output_layer": "clipped_buildings",
"feature_count": 1562
}
}
```
### 3.2 MCP服务接口规范
#### 资源服务接口
```
GET /mcp/resources/{resource_uri}
Accept: application/json
Authorization: Bearer {token}
```
#### 工具服务接口
```
POST /mcp/tools/{tool_name}
Content-Type: application/json
Authorization: Bearer {token}
{
"parameters": {
"param1": "value1",
"param2": "value2"
}
}
```
## 四、安全实现
### 4.1 认证与授权
- OAuth 2.1授权框架集成
- JWT令牌管理访问令牌2小时刷新令牌7天
- 基于角色的访问控制(RBAC)
### 4.2 数据安全
- 所有API通信使用TLS 1.3加密
- 敏感数据存储加密AES-256
- 工具调用审计日志保留90天
### 4.3 MCP安全策略
- 用户明确授权机制(工具调用前弹窗确认)
- 资源访问白名单(仅允许访问指定目录)
- 第三方服务沙箱隔离Docker容器化部署
## 五、部署架构
### 5.1 容器化部署
```
├── docker-compose.yml
├── frontend/ # React应用
├── backend/ # Spring Boot服务
├── geoserver/ # 地图服务
├── postgres/ # 数据库
└── minio/ # 对象存储
```
### 5.2 服务交互流程
1. 用户在前端输入自然语言请求
2. 前端Host层调用LLM客户端获取响应
3. LLM返回工具调用指令XML格式
4. Host层解析指令并调用MCP工具客户端
5. 服务端MCP模块路由请求至对应工具
6. 工具执行完成后返回结果
7. Host层将结果整理后发送至LLM生成最终回答
8. 前端展示回答及地图结果