feat: 新增 teams 目录
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
92
teams/web/columns-api.md
Normal file
92
teams/web/columns-api.md
Normal file
@@ -0,0 +1,92 @@
|
||||
# 后端需求 - 表结构返回 columns 数据
|
||||
|
||||
## 问题描述
|
||||
|
||||
前端在 Edit Mapping 页面需要展示表的列信息(字段名、类型、COMMENT等),但前端自行解析 DDL 存在困难。
|
||||
|
||||
## 需求
|
||||
|
||||
后端在获取表结构列表时,需要同时返回:
|
||||
|
||||
1. **DDL 语句**(已有的需求,继续保留)
|
||||
2. **结构化的 columns 数据**(新增)
|
||||
|
||||
### 返回数据结构
|
||||
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"tables": [
|
||||
{
|
||||
"table_name": "exam_scores",
|
||||
"table_comment": "考试成绩表",
|
||||
"ddl": "CREATE TABLE `exam_scores` (...)",
|
||||
"columns": [
|
||||
{
|
||||
"column_name": "id",
|
||||
"data_type": "int",
|
||||
"column_type": "int(10) unsigned",
|
||||
"is_nullable": "NO",
|
||||
"default_value": null,
|
||||
"column_key": "PRI",
|
||||
"extra": "auto_increment",
|
||||
"column_comment": ""
|
||||
},
|
||||
{
|
||||
"column_name": "student_id",
|
||||
"data_type": "int",
|
||||
"column_type": "int(10) unsigned",
|
||||
"is_nullable": "NO",
|
||||
"default_value": null,
|
||||
"column_key": "",
|
||||
"extra": "",
|
||||
"column_comment": ""
|
||||
},
|
||||
{
|
||||
"column_name": "subject",
|
||||
"data_type": "varchar",
|
||||
"column_type": "varchar(50)",
|
||||
"is_nullable": "NO",
|
||||
"default_value": null,
|
||||
"column_key": "",
|
||||
"extra": "",
|
||||
"column_comment": "科目"
|
||||
},
|
||||
{
|
||||
"column_name": "score",
|
||||
"data_type": "double",
|
||||
"column_type": "double",
|
||||
"is_nullable": "YES",
|
||||
"default_value": null,
|
||||
"column_key": "",
|
||||
"extra": "",
|
||||
"column_comment": "分数"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### 字段说明
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| column_name | string | 列名 |
|
||||
| data_type | string | 数据类型(如 int, varchar, double) |
|
||||
| column_type | string | 完整列类型(如 int(10) unsigned) |
|
||||
| is_nullable | string | 是否可空(YES/NO) |
|
||||
| default_value | string | 默认值 |
|
||||
| column_key | string | 主键标识(PRI/MUL/UNI) |
|
||||
| extra | string | 额外信息(如 auto_increment) |
|
||||
| column_comment | string | 列注释 |
|
||||
|
||||
## 影响范围
|
||||
|
||||
- 文件:`server/internal/service/database_service.go`
|
||||
- 函数:`getMySQLTables`, `getPostgresTables`
|
||||
- 数据模型:`server/internal/model/sub_table_info.go` 的 `ColumnInfo` 结构体
|
||||
|
||||
## 优先级
|
||||
|
||||
高 - 前端 Edit Mapping 页面字段映射功能依赖此数据
|
||||
66
teams/web/ddl-edit.md
Normal file
66
teams/web/ddl-edit.md
Normal file
@@ -0,0 +1,66 @@
|
||||
# 后端需求 - DDL 编辑功能
|
||||
|
||||
## 问题描述
|
||||
|
||||
前端 Database 页面的 Table Mapping 功能已从"字段映射"改为"DDL 编辑"模式。后端需要支持保存和读取 DDL 数据。
|
||||
|
||||
## 需求
|
||||
|
||||
### 1. 保存 DDL
|
||||
|
||||
前端保存时发送 `ddl` 字段而非 `fields` 字段。
|
||||
|
||||
请求结构:
|
||||
```json
|
||||
{
|
||||
"name": "数据库名",
|
||||
"sub_tables": [
|
||||
{
|
||||
"parent_table": "users",
|
||||
"sub_table_name": "用户表",
|
||||
"sub_table_comment": "用户表",
|
||||
"ddl": "CREATE TABLE users (...)"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### 2. 后端处理
|
||||
|
||||
- `CreateSubTableRequest` 已有 `DDL string` 字段(已添加)
|
||||
- `UpdateSubTableRequest` 已有 `DDL string` 字段(已添加)
|
||||
- `UpdateDatabaseRequest` 已有 `SubTables []CreateSubTableRequest` 字段(已添加)
|
||||
|
||||
### 3. Service 层修改
|
||||
|
||||
**sub_table_service.go**:
|
||||
|
||||
1. `Create` 函数 - 添加 DDL 字段赋值:
|
||||
```go
|
||||
info := &model.SubTableInfo{
|
||||
// ... 现有字段
|
||||
DDL: req.DDL,
|
||||
}
|
||||
```
|
||||
|
||||
2. `Update` 函数 - 添加 DDL 更新逻辑:
|
||||
```go
|
||||
// 更新 DDL
|
||||
info.DDL = req.DDL
|
||||
```
|
||||
|
||||
**database_service.go 或 handler**:
|
||||
|
||||
在 `Update` 方法中处理 `SubTables` 字段:
|
||||
- 当前端传入 `sub_tables` 时,需要创建或更新对应的子表记录(包括 DDL)
|
||||
- 遍历 `sub_tables`,调用 `SubTableService.Create` 或 `SubTableService.Update`
|
||||
|
||||
## 影响范围
|
||||
|
||||
- `server/internal/service/sub_table_service.go` - Create/Update 方法
|
||||
- `server/internal/service/database_service.go` 或 handler - Update 方法处理 SubTables
|
||||
|
||||
## 状态
|
||||
|
||||
- [x] 前端修改完成
|
||||
- [x] 后端修改已完成
|
||||
89
teams/web/field-mapping.md
Normal file
89
teams/web/field-mapping.md
Normal file
@@ -0,0 +1,89 @@
|
||||
# 后端需求 - 字段映射保存与读取
|
||||
|
||||
## 问题描述
|
||||
|
||||
前端 Edit Mapping 页面中,用户输入的字段中文映射名(mapped_name)在保存后,第二次打开时丢失了。
|
||||
|
||||
## 原因分析
|
||||
|
||||
1. **保存时**:前端只保存了表级别信息,没有保存字段的中文映射
|
||||
2. **加载时**:前端每次都从 `/database/check` 重新获取表结构,没有读取已保存的映射数据
|
||||
|
||||
## 需求
|
||||
|
||||
### 1. 保存字段映射
|
||||
|
||||
前端保存时需要传递每个字段的中文映射名,后端需要存储这些数据。
|
||||
|
||||
请求结构:
|
||||
```json
|
||||
{
|
||||
"name": "数据库名",
|
||||
"sub_tables": [
|
||||
{
|
||||
"parent_table": "users",
|
||||
"sub_table_name": "用户表",
|
||||
"sub_table_comment": "用户表",
|
||||
"fields": [
|
||||
{
|
||||
"column_name": "id",
|
||||
"mapped_name": "编号"
|
||||
},
|
||||
{
|
||||
"column_name": "username",
|
||||
"mapped_name": "用户名"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### 2. 返回字段映射
|
||||
|
||||
后端在返回表结构时,需要同时返回已保存的字段映射信息。
|
||||
|
||||
返回结构:
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"tables": [
|
||||
{
|
||||
"table_name": "users",
|
||||
"table_comment": "用户表",
|
||||
"ddl": "...",
|
||||
"columns": [
|
||||
{
|
||||
"column_name": "id",
|
||||
"data_type": "int",
|
||||
"column_type": "int(10)",
|
||||
"column_comment": "",
|
||||
"mapped_name": "编号"
|
||||
},
|
||||
{
|
||||
"column_name": "username",
|
||||
"data_type": "varchar",
|
||||
"column_type": "varchar(50)",
|
||||
"column_comment": "用户名",
|
||||
"mapped_name": "用户名"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### 3. 数据存储
|
||||
|
||||
- 可以在 `sub_table_info` 表中增加 `fields` JSON 字段存储字段映射
|
||||
- 或者创建新的关联表 `sub_table_fields`
|
||||
|
||||
## 影响范围
|
||||
|
||||
- `server/internal/service/database_service.go` - Create/Update 方法
|
||||
- `server/internal/model/` - 数据模型修改
|
||||
- 子表映射的数据存储结构
|
||||
|
||||
## 优先级
|
||||
|
||||
高 - 用户输入的映射数据丢失影响使用体验
|
||||
375
teams/web/knowledge-base-api.md
Normal file
375
teams/web/knowledge-base-api.md
Normal file
@@ -0,0 +1,375 @@
|
||||
# 知识库创建 API
|
||||
|
||||
## 基础信息
|
||||
|
||||
| 项目 | 说明 |
|
||||
|------|------|
|
||||
| 基础URL | `http://localhost:8082` |
|
||||
| 前端页面 | Knowledge Base 创建弹窗 |
|
||||
|
||||
## 接口列表
|
||||
|
||||
### 1. 创建知识库
|
||||
|
||||
**请求**
|
||||
|
||||
```
|
||||
POST /api/knowledge/create
|
||||
Content-Type: application/json
|
||||
```
|
||||
|
||||
| 参数 | 类型 | 必填 | 说明 |
|
||||
|------|------|------|------|
|
||||
| name | String | 是 | 知识库名称 |
|
||||
| description | String | 否 | 知识库描述 |
|
||||
| llm_model_id | String | 是 | LLM 模型 ID(来自 model 表) |
|
||||
| embedding_model_id | String | 是 | Embedding 模型 ID(来自 model 表) |
|
||||
| parsing_config | Object | 是 | 解析配置 |
|
||||
| - engine | String | 是 | 解析引擎:markitdown / docling |
|
||||
| - docling_url | String | 条件必填 | Docling 服务 URL(engine=docling 时必填) |
|
||||
| - enable_pdf | Boolean | 否 | 是否启用 PDF 解析(默认 true) |
|
||||
| - pandoc | Boolean | 否 | 是否启用 Pandoc(默认 true) |
|
||||
| storage_config | Object | 否 | 存储配置(默认 local) |
|
||||
| - type | String | 是 | 存储类型:local / minio / s3 |
|
||||
| - endpoint | String | 否 | MinIO Endpoint(如 minio:9000) |
|
||||
| - access_key_id | String | 否 | MinIO Access Key ID |
|
||||
| - secret_access_key | String | 否 | MinIO Secret Access Key |
|
||||
| - bucket | String | 否 | MinIO Bucket 名称 |
|
||||
|
||||
**请求示例**
|
||||
|
||||
本地存储:
|
||||
```json
|
||||
{
|
||||
"name": "产品文档知识库",
|
||||
"description": "用于存储产品手册和文档",
|
||||
"llm_model_id": "model_001",
|
||||
"embedding_model_id": "model_002",
|
||||
"parsing_config": {
|
||||
"engine": "markitdown",
|
||||
"enable_pdf": true,
|
||||
"pandoc": true
|
||||
},
|
||||
"storage_config": {
|
||||
"type": "local"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
使用 Docling + MinIO:
|
||||
```json
|
||||
{
|
||||
"name": "产品文档知识库",
|
||||
"description": "用于存储产品手册和文档",
|
||||
"llm_model_id": "model_001",
|
||||
"embedding_model_id": "model_002",
|
||||
"parsing_config": {
|
||||
"engine": "docling",
|
||||
"docling_url": "http://localhost:8501",
|
||||
"enable_pdf": true,
|
||||
"pandoc": true
|
||||
},
|
||||
"storage_config": {
|
||||
"type": "minio",
|
||||
"endpoint": "localhost:9000",
|
||||
"access_key_id": "minioadmin",
|
||||
"secret_access_key": "minioadmin",
|
||||
"bucket": "x-agents"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**成功响应**
|
||||
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"id": "kb_abc123",
|
||||
"message": "Knowledge base created successfully"
|
||||
}
|
||||
```
|
||||
|
||||
**错误响应**
|
||||
|
||||
```json
|
||||
{
|
||||
"success": false,
|
||||
"message": "LLM model not found"
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 2. 获取知识库列表
|
||||
|
||||
**请求**
|
||||
|
||||
```
|
||||
GET /api/knowledge/list
|
||||
```
|
||||
|
||||
**响应**
|
||||
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"data": [
|
||||
{
|
||||
"id": "kb_001",
|
||||
"name": "产品文档知识库",
|
||||
"description": "用于存储产品手册",
|
||||
"llm_model_id": "model_001",
|
||||
"embedding_model_id": "model_002",
|
||||
"status": "active",
|
||||
"document_count": 15,
|
||||
"chunk_count": 156,
|
||||
"created_at": "2024-01-15T10:30:00Z",
|
||||
"updated_at": "2024-01-15T10:30:00Z"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 3. 获取知识库详情
|
||||
|
||||
**请求**
|
||||
|
||||
```
|
||||
GET /api/knowledge/:id
|
||||
```
|
||||
|
||||
| 参数 | 类型 | 必填 | 说明 |
|
||||
|------|------|------|------|
|
||||
| id | String | 是 | 知识库 ID |
|
||||
|
||||
**响应**
|
||||
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"data": {
|
||||
"id": "kb_001",
|
||||
"name": "产品文档知识库",
|
||||
"description": "用于存储产品手册",
|
||||
"llm_model_id": "model_001",
|
||||
"embedding_model_id": "model_002",
|
||||
"parsing_config": {
|
||||
"engine": "markitdown",
|
||||
"enable_pdf": true,
|
||||
"pandoc": true
|
||||
},
|
||||
"status": "active",
|
||||
"document_count": 15,
|
||||
"chunk_count": 156,
|
||||
"created_at": "2024-01-15T10:30:00Z",
|
||||
"updated_at": "2024-01-15T10:30:00Z"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 4. 删除知识库
|
||||
|
||||
**请求**
|
||||
|
||||
```
|
||||
DELETE /api/knowledge/:id
|
||||
```
|
||||
|
||||
| 参数 | 类型 | 必填 | 说明 |
|
||||
|------|------|------|------|
|
||||
| id | String | 是 | 知识库 ID |
|
||||
|
||||
**响应**
|
||||
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"message": "Knowledge base deleted"
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 5. 获取知识库下的文档列表
|
||||
|
||||
**请求**
|
||||
|
||||
```
|
||||
GET /api/knowledge/:id/documents
|
||||
```
|
||||
|
||||
| 参数 | 类型 | 必填 | 说明 |
|
||||
|------|------|------|------|
|
||||
| id | String | 是 | 知识库 ID |
|
||||
|
||||
**查询参数**
|
||||
|
||||
| 参数 | 类型 | 必填 | 说明 |
|
||||
|------|------|------|------|
|
||||
| status | String | 否 | 过滤状态:all / parsed / parsing / failed |
|
||||
|
||||
**响应**
|
||||
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"data": [
|
||||
{
|
||||
"id": "doc_001",
|
||||
"knowledge_base_id": "kb_001",
|
||||
"name": "产品手册_v2.0.pdf",
|
||||
"file_key": "abc123.pdf",
|
||||
"file_url": "http://localhost:8082/files/abc123.pdf",
|
||||
"file_size": 2516582,
|
||||
"status": "parsed",
|
||||
"chunk_count": 156,
|
||||
"uploaded_at": "2024-01-15T10:30:00Z"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 6. 上传文档到知识库
|
||||
|
||||
**请求**
|
||||
|
||||
```
|
||||
POST /api/knowledge/:id/documents
|
||||
Content-Type: multipart/form-data
|
||||
```
|
||||
|
||||
| 参数 | 类型 | 必填 | 说明 |
|
||||
|------|------|------|------|
|
||||
| id | String | 是 | 知识库 ID |
|
||||
| file | File | 是 | 要上传的文件 |
|
||||
|
||||
**响应**
|
||||
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"dataid": "doc_001",
|
||||
": {
|
||||
" "name": "产品手册_v2.0.pdf",
|
||||
"status": "parsing"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 7. 删除知识库文档
|
||||
|
||||
**请求**
|
||||
|
||||
```
|
||||
DELETE /api/knowledge/:id/documents/:doc_id
|
||||
```
|
||||
|
||||
| 参数 | 类型 | 必填 | 说明 |
|
||||
|------|------|------|------|
|
||||
| id | String | 是 | 知识库 ID |
|
||||
| doc_id | String | 是 | 文档 ID |
|
||||
|
||||
**响应**
|
||||
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"message": "Document deleted"
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 8. 重新解析文档
|
||||
|
||||
**请求**
|
||||
|
||||
```
|
||||
POST /api/knowledge/:id/documents/:doc_id/reparse
|
||||
```
|
||||
|
||||
| 参数 | 类型 | 必填 | 说明 |
|
||||
|------|------|------|------|
|
||||
| id | String | 是 | 知识库 ID |
|
||||
| doc_id | String | 是 | 文档 ID |
|
||||
|
||||
**响应**
|
||||
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"message": "Document reparse started"
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 9. 获取文档预览内容
|
||||
|
||||
**请求**
|
||||
|
||||
```
|
||||
GET /api/knowledge/:id/documents/:doc_id/preview
|
||||
```
|
||||
|
||||
| 参数 | 类型 | 必填 | 说明 |
|
||||
|------|------|------|------|
|
||||
| id | String | 是 | 知识库 ID |
|
||||
| doc_id | String | 是 | 文档 ID |
|
||||
| page | Number | 否 | 页码(默认 1) |
|
||||
|
||||
**响应**
|
||||
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"data": {
|
||||
"total_pages": 3,
|
||||
"current_page": 1,
|
||||
"content": "第一章 产品介绍\n\n欢迎使用我们的产品手册..."
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 数据库表设计(参考)
|
||||
|
||||
### knowledge_base 表
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| id | String | 主键 |
|
||||
| name | String | 知识库名称 |
|
||||
| description | Text | 描述 |
|
||||
| llm_model_id | String | LLM 模型 ID |
|
||||
| embedding_model_id | String | Embedding 模型 ID |
|
||||
| parsing_config | JSON | 解析配置 |
|
||||
| storage_config | JSON | 存储配置(包含 type, endpoint, access_key_id, secret_access_key, bucket) |
|
||||
| status | String | 状态:active / inactive |
|
||||
| document_count | Integer | 文档数量 |
|
||||
| chunk_count | Integer | 切片数量 |
|
||||
| created_at | Timestamp | 创建时间 |
|
||||
| updated_at | Timestamp | 更新时间 |
|
||||
|
||||
### knowledge_document 表
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| id | String | 主键 |
|
||||
| knowledge_base_id | String | 知识库 ID |
|
||||
| name | String | 文档名称 |
|
||||
| file_key | String | 文件存储 key |
|
||||
| file_url | String | 文件访问 URL(本地路径或 MinIO 预签名 URL) |
|
||||
| file_size | BigInteger | 文件大小 |
|
||||
| status | String | 状态:parsing / parsed / failed |
|
||||
| chunk_count | Integer | 切片数量 |
|
||||
| uploaded_at | Timestamp | 上传时间 |
|
||||
43
teams/web/mapping-state.md
Normal file
43
teams/web/mapping-state.md
Normal file
@@ -0,0 +1,43 @@
|
||||
# 后端需求 - 保存和恢复映射状态
|
||||
|
||||
## 问题描述
|
||||
|
||||
用户第一次选择表并设置字段映射后,第二次点击 "Map Tables" 按钮进入界面时,之前选择的表和设置的字段映射都丢失了。
|
||||
|
||||
## 需求
|
||||
|
||||
前端打开已存在的数据库映射时,需要恢复以下状态:
|
||||
|
||||
### 1. 已选择的表列表
|
||||
|
||||
后端需要在数据库记录中保存用户选择了哪些表(不仅仅是子表信息),或者在查询时返回该数据库关联的所有子表。
|
||||
|
||||
### 2. 字段映射
|
||||
|
||||
每个子表保存的字段映射(mapped_name)需要在前端重新加载时显示。
|
||||
|
||||
## 期望的行为
|
||||
|
||||
1. 用户点击已存在的数据库的 "Map Tables" 按钮
|
||||
2. 前端获取实时表结构
|
||||
3. 同时加载该数据库已保存的子表信息(包括选择的表和字段映射)
|
||||
4. 前端合并数据,显示:
|
||||
- 已选择的表(勾选状态)
|
||||
- 每个字段之前设置的 mapped_name
|
||||
|
||||
## 技术实现建议
|
||||
|
||||
在数据库表中增加或利用已有字段:
|
||||
|
||||
- `sub_table_info` 表已包含 `Fields` JSON 字段存储字段映射
|
||||
- 需要在创建/更新数据库时保存选择的表列表
|
||||
- 或者在查询时返回该数据库下所有已创建的子表
|
||||
|
||||
## 影响范围
|
||||
|
||||
- 数据库创建/更新接口
|
||||
- 子表映射查询接口
|
||||
|
||||
## 优先级
|
||||
|
||||
高 - 影响用户体验,第二次进入无法看到之前的工作成果
|
||||
193
teams/web/model-settings.md
Normal file
193
teams/web/model-settings.md
Normal file
@@ -0,0 +1,193 @@
|
||||
# Model Settings 需求文档
|
||||
|
||||
## 需求概述
|
||||
|
||||
Model Settings 页面用于管理 AI 模型配置,支持添加、编辑、删除和测试模型连接。
|
||||
|
||||
## 功能列表
|
||||
|
||||
### 1. 模型列表展示
|
||||
|
||||
展示已配置的模型列表,包含以下字段:
|
||||
- Model Name(模型名称)
|
||||
- Model Type(模型类型):Chat / Embedding / Rerank / VLM
|
||||
- API Endpoint(API 端点)
|
||||
- Status(状态):Active / Inactive
|
||||
|
||||
### 2. 添加新模型
|
||||
|
||||
点击 "Add New Model" 按钮,弹出表单包含以下字段:
|
||||
- Model Name(必填)
|
||||
- Model Type(必选):Chat / Embedding / Rerank / VLM
|
||||
- Provider(必选):OpenAI / Ollama
|
||||
- Model(必填):模型名称,如 gpt-4o
|
||||
- API Key(必填)
|
||||
- Base URL(必填)
|
||||
- API Endpoint(可选)
|
||||
|
||||
### 3. 测试连接
|
||||
|
||||
在添加模型表单中提供 "Test Connection" 按钮,用于验证模型连接是否可用。
|
||||
|
||||
### 4. 编辑模型
|
||||
|
||||
点击编辑按钮,弹出编辑表单,可修改模型信息。
|
||||
|
||||
### 5. 删除模型
|
||||
|
||||
点击删除按钮,确认后删除模型记录。
|
||||
|
||||
---
|
||||
|
||||
## 后端接口需求
|
||||
|
||||
### 1. 获取模型列表
|
||||
|
||||
**接口地址:** `GET /api/models` 或 `GET /model/list`
|
||||
|
||||
**返回参数:**
|
||||
```json
|
||||
{
|
||||
"list": [
|
||||
{
|
||||
"id": "1",
|
||||
"name": "OpenAI",
|
||||
"model_type": "chat",
|
||||
"provider": "OpenAI",
|
||||
"model": "gpt-4o",
|
||||
"api_key": "sk-xxx",
|
||||
"base_url": "https://api.openai.com",
|
||||
"api_endpoint": "/v1/chat/completions",
|
||||
"status": "active",
|
||||
"created_at": "2024-01-01T00:00:00Z",
|
||||
"updated_at": "2024-01-01T00:00:00Z"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### 2. 添加模型
|
||||
|
||||
**接口地址:** `POST /api/models` 或 `POST /model/add`
|
||||
|
||||
**请求参数:**
|
||||
```json
|
||||
{
|
||||
"name": "OpenAI",
|
||||
"model_type": "chat",
|
||||
"provider": "OpenAI",
|
||||
"model": "gpt-4o",
|
||||
"api_key": "sk-xxx",
|
||||
"base_url": "https://api.openai.com",
|
||||
"api_endpoint": "/v1/chat/completions"
|
||||
}
|
||||
```
|
||||
|
||||
**返回参数:**
|
||||
```json
|
||||
{
|
||||
"id": "1",
|
||||
"name": "OpenAI",
|
||||
"model_type": "chat",
|
||||
...
|
||||
}
|
||||
```
|
||||
|
||||
### 3. 更新模型
|
||||
|
||||
**接口地址:** `PUT /api/models/{id}` 或 `PUT /model/{id}`
|
||||
|
||||
**请求参数:**
|
||||
```json
|
||||
{
|
||||
"name": "OpenAI Updated",
|
||||
"model_type": "chat",
|
||||
"provider": "OpenAI",
|
||||
"model": "gpt-4o",
|
||||
"api_key": "sk-xxx",
|
||||
"base_url": "https://api.openai.com",
|
||||
"api_endpoint": "/v1/chat/completions",
|
||||
"status": "active"
|
||||
}
|
||||
```
|
||||
|
||||
### 4. 删除模型
|
||||
|
||||
**接口地址:** `DELETE /api/models/{id}` 或 `DELETE /model/{id}`
|
||||
|
||||
**返回参数:**
|
||||
```json
|
||||
{
|
||||
"success": true
|
||||
}
|
||||
```
|
||||
|
||||
### 5. 测试连接
|
||||
|
||||
**接口地址:** `POST /api/models/test` 或 `POST /model/test`
|
||||
|
||||
**请求参数:**
|
||||
```json
|
||||
{
|
||||
"provider": "OpenAI",
|
||||
"model": "gpt-4o",
|
||||
"api_key": "sk-xxx",
|
||||
"base_url": "https://api.openai.com",
|
||||
"api_endpoint": "/v1/chat/completions"
|
||||
}
|
||||
```
|
||||
|
||||
**返回参数:**
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"message": "Connection successful"
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 数据结构
|
||||
|
||||
### Model 表结构(参考)
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| id | string | 主键 UUID |
|
||||
| name | string | 模型名称 |
|
||||
| model_type | string | 模型类型:chat/embedding/rerank/vlm |
|
||||
| provider | string | 提供商:OpenAI/Ollama |
|
||||
| model | string | 模型标识 |
|
||||
| api_key | string | API 密钥(加密存储) |
|
||||
| base_url | string | 基础 URL |
|
||||
| api_endpoint | string | API 端点路径 |
|
||||
| status | string | 状态:active/inactive |
|
||||
| created_at | datetime | 创建时间 |
|
||||
| updated_at | datetime | 更新时间 |
|
||||
|
||||
---
|
||||
|
||||
## 前端组件状态
|
||||
|
||||
### 表单数据 (newModelForm)
|
||||
```typescript
|
||||
{
|
||||
name: string,
|
||||
apiKey: string,
|
||||
apiEndpoint: string,
|
||||
baseUrl: string,
|
||||
provider: string,
|
||||
model: string,
|
||||
modelType: string
|
||||
}
|
||||
```
|
||||
|
||||
### 模型类型选项 (modelTypeOptions)
|
||||
- Chat
|
||||
- Embedding
|
||||
- Rerank
|
||||
- VLM
|
||||
|
||||
### 提供商选项 (providerOptions)
|
||||
- OpenAI
|
||||
- Ollama
|
||||
110
teams/web/neo4j-api-requirement.md
Normal file
110
teams/web/neo4j-api-requirement.md
Normal file
@@ -0,0 +1,110 @@
|
||||
# Neo4j 接口后端需求
|
||||
|
||||
## 需求说明
|
||||
|
||||
前端 Neo4j 图谱功能已完成,后端接口需要匹配前端调用。
|
||||
|
||||
---
|
||||
|
||||
## 1. 新增 `/neo4j/graphs` 接口
|
||||
|
||||
### 接口地址
|
||||
```
|
||||
POST /neo4j/graphs
|
||||
```
|
||||
|
||||
### 请求参数
|
||||
```json
|
||||
{
|
||||
"uri": "bolt://localhost:7687",
|
||||
"username": "neo4j",
|
||||
"password": "password",
|
||||
"database": "neo4j"
|
||||
}
|
||||
```
|
||||
|
||||
| 参数 | 类型 | 必填 | 说明 |
|
||||
|------|------|------|------|
|
||||
| uri | string | 是 | Neo4j 连接地址,如 bolt://localhost:7687 |
|
||||
| username | string | 是 | 用户名 |
|
||||
| password | string | 是 | 密码 |
|
||||
| database | string | 否 | 数据库名(默认 neo4j) |
|
||||
|
||||
### 返回参数
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"graphs": {
|
||||
"labels": [
|
||||
{"name": "User", "count": 1523},
|
||||
{"name": "Order", "count": 856}
|
||||
],
|
||||
"relationshipTypes": [
|
||||
{"name": "KNOWS", "count": 2341},
|
||||
{"name": "BOUGHT", "count": 5678}
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 2. 修改路由路径
|
||||
|
||||
### 当前状态
|
||||
- `/database/neo4j/nodes` → 需要改为 → `/neo4j/nodes`
|
||||
- `/database/neo4j/relationships` → 需要改为 → `/neo4j/relationships`
|
||||
|
||||
---
|
||||
|
||||
## 总结
|
||||
|
||||
后端需要修改以下内容:
|
||||
|
||||
1. **新增** `/neo4j/graphs` 接口
|
||||
2. **修改** `/database/neo4j/nodes` → `/neo4j/nodes`
|
||||
3. **修改** `/database/neo4j/relationships` → `/neo4j/relationships`
|
||||
|
||||
---
|
||||
|
||||
## 附:前端 API 调用示例
|
||||
|
||||
```javascript
|
||||
// 获取图谱概览
|
||||
fetch('/neo4j/graphs', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({
|
||||
uri: 'bolt://10.10.10.189:7687',
|
||||
username: 'neo4j',
|
||||
password: 'neo4j',
|
||||
database: 'neo4j'
|
||||
})
|
||||
})
|
||||
|
||||
// 获取节点详情
|
||||
fetch('/neo4j/nodes', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({
|
||||
uri: 'bolt://10.10.10.189:7687',
|
||||
username: 'neo4j',
|
||||
password: 'neo4j',
|
||||
label: 'User',
|
||||
limit: 10
|
||||
})
|
||||
})
|
||||
|
||||
// 获取关系详情
|
||||
fetch('/neo4j/relationships', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({
|
||||
uri: 'bolt://10.10.10.189:7687',
|
||||
username: 'neo4j',
|
||||
password: 'neo4j',
|
||||
relationship_type: 'KNOWS',
|
||||
limit: 10
|
||||
})
|
||||
})
|
||||
```
|
||||
99
teams/web/neo4j-check-return-id.md
Normal file
99
teams/web/neo4j-check-return-id.md
Normal file
@@ -0,0 +1,99 @@
|
||||
# Neo4j 连接成功后返回数据库 ID
|
||||
|
||||
## 需求说明
|
||||
|
||||
当前端 Connect 测试 Neo4j 连接成功后,后端需要返回数据库的 ID,以便前端保存图谱配置。
|
||||
|
||||
---
|
||||
|
||||
## 问题
|
||||
|
||||
当前 `/neo4j/check` 接口返回:
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"message": "connection successful",
|
||||
"version": "5.14.0",
|
||||
"databases": ["neo4j", "system"]
|
||||
}
|
||||
```
|
||||
|
||||
**没有返回 `databaseId`**,导致后续保存图谱时缺少 `databaseId`。
|
||||
|
||||
---
|
||||
|
||||
## 需求内容
|
||||
|
||||
修改 `/neo4j/check` 接口,在连接成功时:
|
||||
|
||||
1. **检查数据库是否已存在** - 根据 URI(bolt://host:port)、username、database 查询
|
||||
2. **如果存在** - 返回已有的 `databaseId`
|
||||
3. **如果不存在** - 自动创建一条数据库记录,并返回新的 `databaseId`
|
||||
|
||||
### 返回格式
|
||||
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"message": "connection successful",
|
||||
"version": "5.14.0",
|
||||
"databases": ["neo4j", "system"],
|
||||
"databaseId": "xxx-xxx-xxx",
|
||||
"name": "Neo4j-neo4j",
|
||||
"description": "Neo4j neo4j@10.10.10.189:7687"
|
||||
}
|
||||
```
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| success | bool | 是否成功 |
|
||||
| message | string | 消息 |
|
||||
| version | string | Neo4j 版本 |
|
||||
| databases | array | 数据库列表 |
|
||||
| databaseId | string | 数据库记录 ID |
|
||||
| name | string | 数据库名称 |
|
||||
| description | string | 数据库描述 |
|
||||
|
||||
### 请求参数
|
||||
|
||||
当前 `/neo4j/check` 请求:
|
||||
```json
|
||||
{
|
||||
"db_type": "Neo4j",
|
||||
"host": "10.10.10.189",
|
||||
"port": 7687,
|
||||
"username": "neo4j",
|
||||
"password": "neo4j",
|
||||
"database": "neo4j"
|
||||
}
|
||||
```
|
||||
|
||||
后端需要增加 `name` 字段用于数据库名称(可选):
|
||||
```json
|
||||
{
|
||||
"name": "My Neo4j Database"
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 涉及文件
|
||||
|
||||
- `server/internal/service/neo4j_service.go`
|
||||
- 函数:`Check()` - 第 81-128 行
|
||||
- 函数:`ensureNeo4jDatabase()` - 第 131-175 行(已有代码但可能有问题)
|
||||
|
||||
- `server/internal/model/neo4j_info.go`
|
||||
- 结构体:`Neo4jCheckResponse` - 需要确保 `databaseId` 字段正确返回
|
||||
|
||||
---
|
||||
|
||||
## 前端使用
|
||||
|
||||
前端代码已实现兼容处理:
|
||||
```javascript
|
||||
const dbId = result.databaseId || result.id || result.database_id || ''
|
||||
```
|
||||
|
||||
所以后端返回 `databaseId`、`id` 或 `database_id` 都可以被正确识别。
|
||||
|
||||
196
teams/web/neo4j-graphs.md
Normal file
196
teams/web/neo4j-graphs.md
Normal file
@@ -0,0 +1,196 @@
|
||||
# 后端需求 - Neo4j 图谱数据获取(完善版)
|
||||
|
||||
## 需求描述
|
||||
|
||||
Neo4j 连接成功后,需要获取图谱数据供前端可视化展示。前端使用 ECharts 力导向图谱展示科幻风格效果。
|
||||
|
||||
## Neo4j 图谱核心概念
|
||||
|
||||
Neo4j 是图数据库,与关系型数据库概念不同:
|
||||
- **Node(节点)** - 类似于表,但不需要固定结构
|
||||
- **Label(标签)** - 类似于表的类型名(如 User, Order)
|
||||
- **Relationship(关系)** - 节点之间的边
|
||||
- **Relationship Type(关系类型)** - 关系的类型(如 KNOWS, OWNS)
|
||||
|
||||
## 后端需要提供的接口
|
||||
|
||||
### 1. 获取图谱概览数据(核心接口)
|
||||
|
||||
返回所有 Label(标签)和 Relationship Type(关系类型)的统计信息。这是前端图谱可视化的核心数据来源。
|
||||
|
||||
**接口地址:** `POST /database/check` (复用现有接口,在 db_type 为 Neo4j 时返回图谱数据)
|
||||
|
||||
**请求参数:**
|
||||
```json
|
||||
{
|
||||
"db_type": "Neo4j",
|
||||
"uri": "bolt://localhost:7687",
|
||||
"username": "neo4j",
|
||||
"password": "password",
|
||||
"database": "neo4j"
|
||||
}
|
||||
```
|
||||
|
||||
**返回参数:**
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"graphs": {
|
||||
"labels": [
|
||||
{"name": "User", "count": 1523},
|
||||
{"name": "Order", "count": 856},
|
||||
{"name": "Product", "count": 2341},
|
||||
{"name": "Category", "count": 45},
|
||||
{"name": "Review", "count": 5678}
|
||||
],
|
||||
"relationshipTypes": [
|
||||
{"name": "KNOWS", "count": 2341},
|
||||
{"name": "BOUGHT", "count": 5678},
|
||||
{"name": "BELONGS_TO", "count": 2341},
|
||||
{"name": "HAS_REVIEW", "count": 5678},
|
||||
{"name": "LOCATED_IN", "count": 1523}
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 2. 获取节点详情(可选,用于点击显示)
|
||||
|
||||
点击某个 Label 节点时,获取该类型节点的样本数据用于详情展示。
|
||||
|
||||
**接口地址:** `POST /database/neo4j/nodes`
|
||||
|
||||
**请求参数:**
|
||||
```json
|
||||
{
|
||||
"uri": "bolt://localhost:7687",
|
||||
"username": "neo4j",
|
||||
"password": "password",
|
||||
"database": "neo4j",
|
||||
"label": "User",
|
||||
"limit": 5
|
||||
}
|
||||
```
|
||||
|
||||
**返回参数:**
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"nodes": [
|
||||
{"id": "1", "name": "张三", "email": "zhangsan@example.com", "created_at": "2024-01-01"},
|
||||
{"id": "2", "name": "李四", "email": "lisi@example.com", "created_at": "2024-01-02"}
|
||||
],
|
||||
"properties": [
|
||||
{"name": "id", "type": "string"},
|
||||
{"name": "name", "type": "string"},
|
||||
{"name": "email", "type": "string"},
|
||||
{"name": "created_at", "type": "datetime"}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### 3. 获取关系详情(可选)
|
||||
|
||||
获取两个节点之间的关系数据。
|
||||
|
||||
**接口地址:** `POST /database/neo4j/relationships`
|
||||
|
||||
**请求参数:**
|
||||
```json
|
||||
{
|
||||
"uri": "bolt://localhost:7687",
|
||||
"username": "neo4j",
|
||||
"password": "password",
|
||||
"database": "neo4j",
|
||||
"relationshipType": "KNOWS",
|
||||
"limit": 10
|
||||
}
|
||||
```
|
||||
|
||||
**返回参数:**
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"relationships": [
|
||||
{
|
||||
"id": "rel-1",
|
||||
"source": "1",
|
||||
"target": "2",
|
||||
"properties": {"since": "2020-01-01"}
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
## 数据结构说明
|
||||
|
||||
### graphs.labels[] - 标签列表(前端图谱节点)
|
||||
| 字段 | 类型 | 说明 | 用途 |
|
||||
|------|------|------|------|
|
||||
| name | string | 标签名称(如 User, Order) | 作为图谱节点显示 |
|
||||
| count | int | 该标签的节点数量 | 计算节点大小 symbolSize |
|
||||
|
||||
### graphs.relationshipTypes[] - 关系类型列表(前端图谱边)
|
||||
| 字段 | 类型 | 说明 | 用途 |
|
||||
|------|------|------|------|
|
||||
| name | string | 关系类型(如 KNOWS, OWNS) | 作为图谱边的标签 |
|
||||
| count | int | 该关系的数量 | 可能影响边的粗细 |
|
||||
|
||||
### nodes[] - 节点详情
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| id | string | 节点唯一标识 |
|
||||
| (其他) | any | 节点的其他属性 |
|
||||
|
||||
### relationships[] - 关系详情
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| id | string | 关系唯一标识 |
|
||||
| source | string | 起始节点ID |
|
||||
| target | string | 目标节点ID |
|
||||
| properties | object | 关系属性 |
|
||||
|
||||
## 前端图谱展示逻辑
|
||||
|
||||
前端使用 ECharts 力导向图谱(force-directed graph),展示方式如下:
|
||||
|
||||
1. **节点生成**:
|
||||
- 根据 `graphs.labels` 数组生成节点
|
||||
- `name` 作为节点显示名称
|
||||
- `count` 决定节点大小(symbolSize = log2(count+1) * 12)
|
||||
- 节点颜色按索引分配科幻配色(紫、蓝、绿、橙、粉、青)
|
||||
- 节点带发光效果(shadowBlur: 20)
|
||||
|
||||
2. **边生成**:
|
||||
- 根据 `graphs.relationshipTypes` 生成边
|
||||
- 边 label 显示关系类型名称
|
||||
- 曲线连接(curveness: 0.2)
|
||||
- 带箭头
|
||||
|
||||
3. **交互效果**:
|
||||
- 弹簧物理效果(force layout)
|
||||
- 节点可拖拽
|
||||
- 滚轮缩放
|
||||
- hover 相邻节点高亮
|
||||
|
||||
## 优先级
|
||||
|
||||
高 - Neo4j 可视化的核心数据
|
||||
|
||||
## 注意事项
|
||||
|
||||
1. Neo4j 连接使用官方 Go 驱动:`github.com/neo4j/neo4j-go-driver`
|
||||
2. 注意处理连接超时和认证失败的情况
|
||||
3. 大数据量时需要限制返回数量(limit 参数)
|
||||
4. **建议返回足够多的关系类型**(建议至少 5-10 个),以便前端生成丰富的图谱连接
|
||||
5. 如果关系类型少于节点数,可以创建额外连接让图谱更美观
|
||||
|
||||
## 前端缓存策略
|
||||
|
||||
### 方案设计
|
||||
- **首次加载**:获取数据并缓存
|
||||
- **第二次展示**:直接使用缓存,秒开
|
||||
- **刷新按钮**:用户手动点击刷新获取最新数据
|
||||
|
||||
### 实现说明
|
||||
前端会缓存图谱数据,第二次进入时直接展示缓存数据,提升用户体验。同时提供"刷新"按钮供用户手动刷新。
|
||||
42
teams/web/neo4j-support.md
Normal file
42
teams/web/neo4j-support.md
Normal file
@@ -0,0 +1,42 @@
|
||||
# 后端需求 - 支持 Neo4j 图数据库
|
||||
|
||||
## 需求描述
|
||||
|
||||
添加 Neo4j 图数据库类型支持。
|
||||
|
||||
## Neo4j 连接参数
|
||||
|
||||
Neo4j 连接需要以下参数:
|
||||
|
||||
| 参数 | 类型 | 必填 | 说明 | 默认值 |
|
||||
|------|------|------|------|--------|
|
||||
| uri | string | 是 | 连接地址 | bolt://localhost:7687 |
|
||||
| username | string | 是 | 用户名 | neo4j |
|
||||
| password | string | 是 | 密码 | - |
|
||||
| database | string | 否 | 数据库名 | neo4j(默认数据库) |
|
||||
|
||||
### 连接示例
|
||||
- `bolt://localhost:7687`
|
||||
- `neo4j://localhost:7687`
|
||||
- `bolt://192.168.1.100:7687`
|
||||
|
||||
## 需要修改的地方
|
||||
|
||||
### 1. 数据库类型列表
|
||||
在前端和后端添加 "Neo4j" 选项
|
||||
|
||||
### 2. 连接表单
|
||||
Neo4j 只需要 3-4 个字段:
|
||||
- URI(连接地址)
|
||||
- Username(用户名)
|
||||
- Password(密码)
|
||||
- Database(数据库名,可选)
|
||||
|
||||
### 3. 数据库服务
|
||||
- `server/internal/service/database_service.go`
|
||||
- 新增 `connectNeo4j` 方法
|
||||
- 新增 `getNeo4jTables` 方法
|
||||
|
||||
## 优先级
|
||||
|
||||
中 - 扩展数据库类型支持
|
||||
35
teams/web/sub-tables-edit.md
Normal file
35
teams/web/sub-tables-edit.md
Normal file
@@ -0,0 +1,35 @@
|
||||
# 后端需求 - 编辑数据库时正确处理 sub_tables
|
||||
|
||||
## 问题描述
|
||||
|
||||
用户点击 Action 修改数据库,进入 Map Tables 页面后:
|
||||
1. 初始显示 2 个已选中的表
|
||||
2. 用户取消选中 1 个表,只保留 1 个
|
||||
3. 点击 Save Mapping 保存
|
||||
4. 再次点击 Map Tables 查看时,仍然显示 2 个表,而不是修改后的 1 个
|
||||
|
||||
## 原因
|
||||
|
||||
可能的问题:
|
||||
1. 编辑时没有正确从数据库加载已保存的 sub_tables 数据
|
||||
2. Save Mapping 时没有正确更新 sub_tables(可能只是创建新的,没有删除已取消的)
|
||||
|
||||
## 需求
|
||||
|
||||
### 1. 加载数据库时返回 sub_tables 数据
|
||||
|
||||
在获取数据库详情时,需要返回该数据库已保存的子表映射信息(包括 parent_table 等),以便前端正确显示已选中的表。
|
||||
|
||||
### 2. 保存时正确处理子表
|
||||
|
||||
- 新增的子表:创建新记录
|
||||
- 保留的子表:更新记录
|
||||
- 取消的子表:删除对应记录
|
||||
|
||||
或者使用更简单的方案:
|
||||
- 保存时删除该数据库所有的旧 sub_tables
|
||||
- 重新创建新的 sub_tables 记录
|
||||
|
||||
## 状态
|
||||
|
||||
- [ ] 后端修改待实现
|
||||
22
teams/web/table-count-update-edit.md
Normal file
22
teams/web/table-count-update-edit.md
Normal file
@@ -0,0 +1,22 @@
|
||||
# 后端需求 - 编辑数据库时更新 table_count
|
||||
|
||||
## 问题描述
|
||||
|
||||
用户点击 Action 修改数据库,从 2 个子表修改为 1 个子表并保存后,数据库列表中的 Tables 列没有更新为新的数量。
|
||||
|
||||
## 原因
|
||||
|
||||
编辑数据库并保存 sub_tables 时,后端没有更新 `table_count` 字段。
|
||||
|
||||
## 需求
|
||||
|
||||
在 UpdateDatabaseRequest 处理 `SubTables` 字段时,需要同步更新数据库记录的 `table_count` 字段为当前 sub_tables 的数量。
|
||||
|
||||
### 修改位置
|
||||
|
||||
- `server/internal/service/database_service.go` 或 handler
|
||||
- 在 Update 方法中处理 SubTables 时更新 table_count
|
||||
|
||||
## 状态
|
||||
|
||||
- [x] 后端修改已完成
|
||||
30
teams/web/table-count-update.md
Normal file
30
teams/web/table-count-update.md
Normal file
@@ -0,0 +1,30 @@
|
||||
# 后端需求 - 保存映射时更新 table_count
|
||||
|
||||
## 问题描述
|
||||
|
||||
用户在 Database 列表页面看到 Table Mapping 选中 2 个表并保存后,表格的 Tables 列仍然显示 1,没有更新为实际选中的表数量。
|
||||
|
||||
## 原因
|
||||
|
||||
保存 Table Mapping 时,后端没有更新数据库的 `table_count` 字段。
|
||||
|
||||
## 需求
|
||||
|
||||
在保存子表映射时,需要同时更新数据库的 `table_count` 字段为实际保存的子表数量。
|
||||
|
||||
### 修改位置
|
||||
|
||||
- `server/internal/service/database_service.go` 或 handler
|
||||
- 在处理 `SubTables` 保存逻辑后,更新 `database_info` 表的 `table_count` 字段
|
||||
|
||||
### 逻辑
|
||||
|
||||
```go
|
||||
// 保存 sub_tables 后,更新 table_count
|
||||
tableCount := len(subTables)
|
||||
// 更新数据库记录的 table_count 字段
|
||||
```
|
||||
|
||||
## 状态
|
||||
|
||||
- [x] 后端修改已完成
|
||||
52
teams/web/todo-2026-3-6.md
Normal file
52
teams/web/todo-2026-3-6.md
Normal file
@@ -0,0 +1,52 @@
|
||||
# Web 前端需求 TODO
|
||||
|
||||
## 2026年3月
|
||||
|
||||
### 2026-03-06
|
||||
|
||||
- [x] **DDL 获取功能** - 后端需在获取表结构时返回 DDL 语句 ✔
|
||||
- 相关文件:`server/internal/service/database_service.go`
|
||||
- 函数:`getMySQLTables`, `getPostgresTables`
|
||||
- 详细需求:[ddl-fetch.md](./ddl-fetch.md)
|
||||
|
||||
- [x] **返回结构化 columns 数据** - 后端需返回完整的列信息(column_name, data_type, column_type, is_nullable, default_value, column_key, extra, column_comment)✔
|
||||
- 相关文件:`server/internal/service/database_service.go`
|
||||
- 函数:`getMySQLTables`, `getPostgresTables`
|
||||
- 详细需求:[columns-api.md](./columns-api.md)
|
||||
|
||||
- [x] **保存和读取字段映射** - 后端需支持保存/读取字段的中文映射名(mapped_name) ✔
|
||||
- 相关文件:`server/internal/service/database_service.go`, `server/internal/model/`
|
||||
- 详细需求:[field-mapping.md](./field-mapping.md)
|
||||
|
||||
- [x] **保存和恢复映射状态** - 第二次进入 Map Tables 时需恢复之前选择的表和字段映射 ✔
|
||||
- 相关文件:`server/internal/service/database_service.go`, `server/internal/model/`
|
||||
- 详细需求:[mapping-state.md](./mapping-state.md)
|
||||
|
||||
- [x] **Neo4j 图谱数据获取** - 前端已完成 ECharts 科幻风格图谱,后端需提供图谱数据接口 ✔
|
||||
- 前端:使用 ECharts force-directed graph,力导向弹簧效果,可拖拽,hover 高亮
|
||||
- 详细需求:[neo4j-graphs.md](./neo4j-graphs.md), [neo4j-support.md](./neo4j-support.md)
|
||||
|
||||
---
|
||||
|
||||
- [x] **Neo4j 接口路由修改** - 后端已完成 ✔
|
||||
- 新增 `/neo4j/graphs` 接口
|
||||
- 修改 `/database/neo4j/nodes` → `/neo4j/nodes`
|
||||
- 修改 `/database/neo4j/relationships` → `/neo4j/relationships`
|
||||
- 详细需求:[neo4j-api-requirement.md](./neo4j-api-requirement.md)
|
||||
|
||||
---
|
||||
|
||||
### 2026-03-07
|
||||
|
||||
- [x] **Neo4j 图谱保存接口** - 后端已完成 ✔
|
||||
- 接口地址:`POST /database/graph/save`
|
||||
- 详细需求:[neo4j-graph-save.md](./neo4j-graph-save.md)
|
||||
|
||||
- [x] **Neo4j 连接成功后返回 databaseId** - 后端已完成 ✔
|
||||
- 问题:Connect 测试连接成功后没有保存数据库记录,导致后续保存图谱时缺少 databaseId
|
||||
- 解决方案:/neo4j/check 成功时检查数据库是否已存在,不存在则自动创建并返回 databaseId
|
||||
- 详细需求:[neo4j-check-return-id.md](./neo4j-check-return-id.md)
|
||||
|
||||
---
|
||||
|
||||
> 需求完成后请完成者打 ✔
|
||||
45
teams/web/todo-2026-3-8.md
Normal file
45
teams/web/todo-2026-3-8.md
Normal file
@@ -0,0 +1,45 @@
|
||||
# Web 前端需求 TODO
|
||||
|
||||
## 2026年3月
|
||||
|
||||
### 2026-03-08
|
||||
|
||||
- [x] **知识库(Knowledge Base)API** - 后端已完成 ✔
|
||||
- 创建知识库、获取列表、获取详情、删除
|
||||
- 上传文档、删除文档、重新解析
|
||||
- 获取文档预览内容
|
||||
- 详细需求:[knowledge-base-api.md](./knowledge-base-api.md)
|
||||
|
||||
- [x] **编辑时正确处理 sub_tables** - 后端已完成 ✔
|
||||
- 问题:取消选中 1 个表后保存,再次进入仍显示 2 个表
|
||||
- 详细需求:[sub-tables-edit.md](./sub-tables-edit.md)
|
||||
|
||||
- [x] **知识库存储配置 (MinIO/S3)** - 后端已完成 ✔
|
||||
- 前端已完成:添加 storage_config 参数传递
|
||||
- 后端已完成:KnowledgeBase 模型添加 storage_config 字段
|
||||
- 上传文件时使用知识库的 storage_config,而非全局配置
|
||||
- 详细需求:[knowledge-base-api.md](./knowledge-base-api.md)
|
||||
|
||||
- [x] **文档列表返回 file_url** - 后端已完成 ✔
|
||||
- 问题:重新进入知识库后 PDF 无法预览
|
||||
- 已确认:API 返回的 file_url 字段有值
|
||||
|
||||
---
|
||||
|
||||
### 2026-03-07
|
||||
|
||||
- [x] **DDL 编辑功能** - 后端已完成 ✔
|
||||
- 前端只发送 ddl 字段,不再发送 fields 字段
|
||||
- 详细需求:[ddl-edit.md](./ddl-edit.md)
|
||||
|
||||
- [x] **保存映射时更新 table_count** - 后端已完成 ✔
|
||||
- 问题:用户保存 2 个子表后,Tables 列仍显示 1
|
||||
- 详细需求:[table-count-update.md](./table-count-update.md)
|
||||
|
||||
- [x] **编辑数据库时更新 table_count** - 后端已完成 ✔
|
||||
- 问题:用户从 2 个子表修改为 1 个后,Tables 列没有更新
|
||||
- 详细需求:[table-count-update-edit.md](./table-count-update-edit.md)
|
||||
|
||||
---
|
||||
|
||||
> 需求完成后请完成者打 ✔
|
||||
Reference in New Issue
Block a user