|
|
@@ -0,0 +1,323 @@
|
|
|
+# 维度配置 + 知识库动态管理平台
|
|
|
+
|
|
|
+**日期:** 2026-06-20
|
|
|
+**状态:** 设计完成,待实现
|
|
|
+**范围:** cfc-backend(实体/Service/Controller)+ cfc-web(Vuex/Api/组件)
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 1. 架构概述
|
|
|
+
|
|
|
+```
|
|
|
+product_dimension_config (维度定义)
|
|
|
+ ↓ 1:N(知识点可归属多个维度)
|
|
|
+knowledge_tag ← dan_knowledge_base_dimension (中间关联表)
|
|
|
+ ↓
|
|
|
+dan_knowledge_base (知识库)
|
|
|
+ ↓ 实时推送
|
|
|
+Dify 知识库 (dify.bianwoyy.cn)
|
|
|
+```
|
|
|
+
|
|
|
+**核心目标:** 管理后台的维度配置和知识点管理从硬编码改为数据库驱动,新增进维度无需修改前端代码。同时支持知识点实时同步到 Dify 知识库。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 2. 数据库设计
|
|
|
+
|
|
|
+### 2.1 product_dimension_config(维度配置表)
|
|
|
+
|
|
|
+```sql
|
|
|
+CREATE TABLE product_dimension_config (
|
|
|
+ id BIGINT PRIMARY KEY AUTO_INCREMENT,
|
|
|
+ dimension_code VARCHAR(50) NOT NULL UNIQUE COMMENT '维度代码: body/mind/wisdom/action/wealth',
|
|
|
+ dimension_name VARCHAR(100) NOT NULL COMMENT '维度名称',
|
|
|
+ dimension_type VARCHAR(50) NOT NULL DEFAULT 'five' COMMENT '类型: five(三维)/action(行动)/other',
|
|
|
+ parent_id BIGINT COMMENT '父级ID,无父级为NULL',
|
|
|
+ sort INT DEFAULT 0 COMMENT '排序',
|
|
|
+ enabled TINYINT(1) DEFAULT 1 COMMENT '启用: 0禁用 1启用',
|
|
|
+ dify_dataset_id VARCHAR(100) COMMENT 'Dify Dataset ID,不填则不同步',
|
|
|
+ remark VARCHAR(500) COMMENT '备注',
|
|
|
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
|
+ updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
|
|
|
+);
|
|
|
+```
|
|
|
+
|
|
|
+### 2.2 dan_knowledge_base(知识库表)
|
|
|
+
|
|
|
+```sql
|
|
|
+CREATE TABLE dan_knowledge_base (
|
|
|
+ id BIGINT PRIMARY KEY AUTO_INCREMENT,
|
|
|
+ title VARCHAR(200) NOT NULL COMMENT '知识标题',
|
|
|
+ content TEXT NOT NULL COMMENT '知识内容',
|
|
|
+ sort INT DEFAULT 0 COMMENT '排序',
|
|
|
+ status TINYINT(1) DEFAULT 1 COMMENT '状态: 0禁用 1启用',
|
|
|
+ remark VARCHAR(500) COMMENT '备注',
|
|
|
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
|
+ updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
|
|
|
+);
|
|
|
+```
|
|
|
+
|
|
|
+### 2.3 dan_knowledge_base_dimension(维度关联表)
|
|
|
+
|
|
|
+```sql
|
|
|
+CREATE TABLE dan_knowledge_base_dimension (
|
|
|
+ id BIGINT PRIMARY KEY AUTO_INCREMENT,
|
|
|
+ knowledge_id BIGINT NOT NULL COMMENT '知识库ID',
|
|
|
+ dimension_id BIGINT NOT NULL COMMENT '维度配置ID',
|
|
|
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
|
+ UNIQUE KEY uk_knowledge_dimension (knowledge_id, dimension_id),
|
|
|
+ FOREIGN KEY (knowledge_id) REFERENCES dan_knowledge_base(id) ON DELETE CASCADE,
|
|
|
+ FOREIGN KEY (dimension_id) REFERENCES product_dimension_config(id) ON DELETE CASCADE
|
|
|
+);
|
|
|
+```
|
|
|
+
|
|
|
+### 2.4 dan_knowledge_tag(标签表)
|
|
|
+
|
|
|
+```sql
|
|
|
+CREATE TABLE dan_knowledge_tag (
|
|
|
+ id BIGINT PRIMARY KEY AUTO_INCREMENT,
|
|
|
+ tag_name VARCHAR(100) NOT NULL UNIQUE COMMENT '标签名',
|
|
|
+ tag_type VARCHAR(50) DEFAULT 'custom' COMMENT '标签类型: custom/auto',
|
|
|
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
|
+);
|
|
|
+```
|
|
|
+
|
|
|
+### 2.5 dan_knowledge_base_tag(知识-标签关联表)
|
|
|
+
|
|
|
+```sql
|
|
|
+CREATE TABLE dan_knowledge_base_tag (
|
|
|
+ id BIGINT PRIMARY KEY AUTO_INCREMENT,
|
|
|
+ knowledge_id BIGINT NOT NULL,
|
|
|
+ tag_id BIGINT NOT NULL,
|
|
|
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
|
+ UNIQUE KEY uk_knowledge_tag (knowledge_id, tag_id),
|
|
|
+ FOREIGN KEY (knowledge_id) REFERENCES dan_knowledge_base(id) ON DELETE CASCADE,
|
|
|
+ FOREIGN KEY (tag_id) REFERENCES dan_knowledge_tag(id) ON DELETE CASCADE
|
|
|
+);
|
|
|
+```
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 3. Dify 同步设计
|
|
|
+
|
|
|
+### 3.1 Dify 配置
|
|
|
+
|
|
|
+```yaml
|
|
|
+# application.yml
|
|
|
+dify:
|
|
|
+ base-url: http://dify.bianwoyou.cn
|
|
|
+ api-key: ${DIFY_API_KEY:}
|
|
|
+ timeout: 10000
|
|
|
+```
|
|
|
+
|
|
|
+### 3.2 同步时机
|
|
|
+
|
|
|
+| 事件 | Dify 操作 | API |
|
|
|
+|------|-----------|-----|
|
|
|
+| 知识点新增且已关联维度 | 创建文档 | `POST /v1/datasets/{dataset_id}/documents` |
|
|
|
+| 知识点编辑 | 更新文档(如 Dify 支持按 doc_id 更新) | `PUT /v1/datasets/{dataset_id}/documents/{doc_id}` |
|
|
|
+| 知识点删除 | 删除文档 | `DELETE /v1/datasets/{dataset_id}/documents/{doc_id}` |
|
|
|
+| 维度解绑 | 从 dataset 中移除文档 | 同上 |
|
|
|
+
|
|
|
+**推送规则:**
|
|
|
+- 知识点关联了多个维度 → 同时推送到多个 Dify dataset
|
|
|
+- 维度未配置 `dify_dataset_id` → 跳过 Dify 同步,不报错
|
|
|
+- Dify 调用失败 → 记录 error log,知识库 CRUD 本身不失败(Dify 同步是异步的,不阻塞主流程)
|
|
|
+
|
|
|
+### 3.3 Dify 文档创建请求格式
|
|
|
+
|
|
|
+根据 Dify 标准知识库 API:
|
|
|
+
|
|
|
+```json
|
|
|
+POST http://dify.bianwoyou.cn/v1/datasets/{dataset_id}/documents
|
|
|
+Headers: Authorization: Bearer {api_key}
|
|
|
+Body: {
|
|
|
+ "indexing_technique": "high_quality",
|
|
|
+ "process_rule": {
|
|
|
+ "rules": [],
|
|
|
+ "mode": "custom",
|
|
|
+ "order": 3
|
|
|
+ },
|
|
|
+ "doc_form": "text_raw",
|
|
|
+ "doc_language": "Chinese",
|
|
|
+ "data_source": {
|
|
|
+ "type": "upload_file",
|
|
|
+ "upload_file_id": "{{file_id}}" // 如用文件方式
|
|
|
+ },
|
|
|
+ "primary_web": {
|
|
|
+ "site_url": "",
|
|
|
+ "og_image_selector": ""
|
|
|
+ }
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+**本系统采用文本方式直接创建文档:**
|
|
|
+
|
|
|
+```json
|
|
|
+POST http://dify.bianwoyou.cn/v1/datasets/{dataset_id}/documents
|
|
|
+Headers: Authorization: Bearer {api_key}
|
|
|
+Body: {
|
|
|
+ "indexing_technique": "high_quality",
|
|
|
+ "process_rule": {
|
|
|
+ "rules": [],
|
|
|
+ "mode": "custom",
|
|
|
+ "order": 3
|
|
|
+ },
|
|
|
+ "doc_form": "text_raw",
|
|
|
+ "doc_language": "Chinese"
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+> 注:完整 Dify API 格式以 Dify 官方文档为准,实现时使用 `@Value("${dify.base-url}")` + RestTemplate 调用,API 格式留占位符待 Dify 接入时补充。
|
|
|
+
|
|
|
+### 3.4 Dify 同步 Service
|
|
|
+
|
|
|
+```java
|
|
|
+@Service
|
|
|
+public class DifySyncService {
|
|
|
+
|
|
|
+ @Value("${dify.base-url}")
|
|
|
+ private String difyBaseUrl;
|
|
|
+
|
|
|
+ @Value("${dify.api-key}")
|
|
|
+ private String difyApiKey;
|
|
|
+
|
|
|
+ // 推送知识点到 Dify(异步,不阻塞主流程)
|
|
|
+ @Async
|
|
|
+ public void syncToDify(KnowledgeBase knowledge, List<String> dimensionCodes) {
|
|
|
+ // 1. 查找每个维度对应的 dify_dataset_id
|
|
|
+ // 2. 调用 Dify API 创建文档
|
|
|
+ // 3. 失败记录 error log,不抛异常
|
|
|
+ }
|
|
|
+
|
|
|
+ // 从 Dify 删除
|
|
|
+ @Async
|
|
|
+ public void removeFromDify(Long knowledgeId, String difyDatasetId) { ... }
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 4. 后端 API 设计
|
|
|
+
|
|
|
+### 4.1 维度配置 API
|
|
|
+
|
|
|
+| 端点 | 方法 | 说明 |
|
|
|
+|------|------|------|
|
|
|
+| `/api/admin/dimension-config/list` | POST | 分页列表,`{dimensionType, enabled}` 筛选 |
|
|
|
+| `/api/admin/dimension-config/get` | POST | 详情 `{id}` |
|
|
|
+| `/api/admin/dimension-config/save` | POST | 新增/更新,body 包含所有字段 |
|
|
|
+| `/api/admin/dimension-config/delete` | POST | 删除 `{id}` |
|
|
|
+| `/api/admin/dimension-config/tree` | POST | 树形结构(parent_id 层级) |
|
|
|
+
|
|
|
+### 4.2 知识库 API
|
|
|
+
|
|
|
+| 端点 | 方法 | 说明 |
|
|
|
+|------|------|------|
|
|
|
+| `/api/admin/knowledge-base/list` | POST | 分页 `{dimensionCode, tagId, keyword, page, size}` |
|
|
|
+| `/api/admin/knowledge-base/get` | POST | 详情 `{id}`,返回知识点 + 关联维度列表 + 关联标签列表 |
|
|
|
+| `/api/admin/knowledge-base/save` | POST | 新增/更新,body 含 `dimensionIds[]`,同步更新关联表 |
|
|
|
+| `/api/admin/knowledge-base/delete` | POST | 删除 `{id}`,级联删除关联记录 |
|
|
|
+| `/api/admin/knowledge-base/bind-dimensions` | POST | 绑定维度 `{knowledgeId, dimensionIds[]}` |
|
|
|
+| `/api/admin/knowledge-base/bind-tags` | POST | 绑定标签 `{knowledgeId, tagIds[]}` |
|
|
|
+
|
|
|
+### 4.3 标签 API
|
|
|
+
|
|
|
+| 端点 | 方法 | 说明 |
|
|
|
+|------|------|------|
|
|
|
+| `/api/admin/knowledge-tag/list` | POST | 标签列表,无分页 |
|
|
|
+| `/api/admin/knowledge-tag/save` | POST | 新增/更新标签 |
|
|
|
+| `/api/admin/knowledge-tag/delete` | POST | 删除 `{id}`,级联删除关联记录 |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 5. 前端设计
|
|
|
+
|
|
|
+### 5.1 目录结构
|
|
|
+
|
|
|
+```
|
|
|
+cfc-web/src/
|
|
|
+├── api/
|
|
|
+│ └── dimension.js # 维度配置 + 知识库 + 标签 API 封装
|
|
|
+├── store/
|
|
|
+│ └── modules/
|
|
|
+│ └── dimension.js # Vuex store(dimensions, dimensionTree, knowledgeList, tags)
|
|
|
+├── components/
|
|
|
+│ ├── DimensionSelector/ # 维度下拉选择器
|
|
|
+│ ├── KnowledgeTable/ # 知识库动态表格
|
|
|
+│ ├── KnowledgeDialog/ # 新增/编辑对话框
|
|
|
+│ └── TagSelector/ # 标签多选组件
|
|
|
+└── views/admin/
|
|
|
+ ├── dimension/ # 维度配置管理页(空目录待创建)
|
|
|
+ └── knowledge/ # 知识库管理页(空目录待创建)
|
|
|
+```
|
|
|
+
|
|
|
+### 5.2 组件规格
|
|
|
+
|
|
|
+**DimensionSelector** — `el-select`,支持多选(`:multiple`),按 `dimensionType` 过滤选项,数据来自 Vuex store
|
|
|
+
|
|
|
+**KnowledgeTable** — `el-table`,根据传入 `dimensionCode` 或 `tagId` 动态加载,支持排序、分页
|
|
|
+
|
|
|
+**KnowledgeDialog** — `el-dialog`,新增/编辑共用,包含:
|
|
|
+- 维度多选(`DimensionSelector`)
|
|
|
+- 标签多选(`TagSelector`)
|
|
|
+- 标题、内容、排序、状态表单字段
|
|
|
+
|
|
|
+**TagSelector** — `el-select` + `el-tag`,支持新增标签(`@new-tag`)
|
|
|
+
|
|
|
+### 5.3 页面
|
|
|
+
|
|
|
+**维度配置管理页** `cfc-web/src/views/admin/dimension/index.vue`
|
|
|
+- 树形列表展示维度层级(`el-tree`)
|
|
|
+- 新增/编辑维度弹窗(含 `dify_dataset_id` 字段)
|
|
|
+- 支持拖拽排序
|
|
|
+
|
|
|
+**知识库管理页** `cfc-web/src/views/admin/knowledge/index.vue`
|
|
|
+- 左侧:维度树 + 标签列表(筛选面板)
|
|
|
+- 右侧:知识点表格(分页)
|
|
|
+- 顶部:搜索框 + 新增按钮
|
|
|
+- 行内:编辑/删除/绑定维度/绑定标签
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 6. 实现顺序
|
|
|
+
|
|
|
+```
|
|
|
+Phase 1: 后端基础设施
|
|
|
+ Task 1: 创建 5 张数据库表
|
|
|
+ Task 2: 创建 Entity + Mapper
|
|
|
+ Task 3: 创建 DimensionConfig CRUD Controller + Service
|
|
|
+ Task 4: 创建 KnowledgeBase CRUD Controller + Service(不含 Dify 同步)
|
|
|
+ Task 5: 创建 KnowledgeTag CRUD Controller + Service
|
|
|
+ Task 6: 创建 KnowledgeBase 与 Dimension/Tag 的关联管理
|
|
|
+ Task 7: DifySyncService(异步推送,配置占位符)
|
|
|
+
|
|
|
+Phase 2: 前端核心
|
|
|
+ Task 8: api/dimension.js API 封装
|
|
|
+ Task 9: store/modules/dimension.js Vuex 模块
|
|
|
+ Task 10: DimensionSelector 组件
|
|
|
+ Task 11: TagSelector 组件
|
|
|
+ Task 12: KnowledgeTable 组件
|
|
|
+ Task 13: KnowledgeDialog 组件
|
|
|
+
|
|
|
+Phase 3: 管理页面
|
|
|
+ Task 14: 维度配置管理页(dimension/index.vue)
|
|
|
+ Task 15: 知识库管理页(knowledge/index.vue)
|
|
|
+
|
|
|
+Phase 4: Dify 集成
|
|
|
+ Task 16: 补充 Dify API 格式(以 Dify 官方文档为准)
|
|
|
+ Task 17: 全流程联调
|
|
|
+```
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 7. 验收标准
|
|
|
+
|
|
|
+- [ ] 维度配置增删改查正常,树形展示正确
|
|
|
+- [ ] 知识点增删改查正常,支持按维度/标签筛选
|
|
|
+- [ ] 知识点与多维度关联保存正确(一个知识点可属多个维度)
|
|
|
+- [ ] 知识点与多标签关联保存正确
|
|
|
+- [ ] Dify 同步为异步,不影响知识库 CRUD 响应速度
|
|
|
+- [ ] Dify 同步失败时知识库操作本身不报错
|
|
|
+- [ ] 新增维度后前端无需修改代码即可展示
|
|
|
+- [ ] 无硬编码维度名称(grep 验证)
|