mirror of
https://gitcode.com/ageerle/ruoyi-ai.git
synced 2026-04-12 19:17:20 +00:00
Compare commits
16 Commits
f5e22d4c05
...
be12ebadbe
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
be12ebadbe | ||
|
|
a5fc55f50a | ||
|
|
7186afbbc4 | ||
|
|
1fba109cce | ||
|
|
d8382bfb44 | ||
|
|
2353b0adf6 | ||
|
|
dcacd8753f | ||
|
|
aca72a5892 | ||
|
|
362307e4ba | ||
|
|
cb26e452bb | ||
|
|
e402330692 | ||
|
|
f3e1aa6cdd | ||
|
|
c1d830bfd6 | ||
|
|
c06ae8271d | ||
|
|
e71d9faf8d | ||
|
|
0d403b6725 |
BIN
.gitignore
vendored
BIN
.gitignore
vendored
Binary file not shown.
32
README.md
32
README.md
@@ -22,7 +22,7 @@
|
||||
|
||||
### 企业级AI助手平台
|
||||
|
||||
*开箱即用的智能AI平台,深度集成 FastGPT、扣子(Coze)、DIFY 等主流AI平台,提供先进的RAG技术和多模型支持*
|
||||
*开箱即用的智能AI平台,深度集成 FastGPT、扣子(Coze)、DIFY 等主流AI平台,提供先进的RAG技术、知识图谱、数字人和AI流程编排能力*
|
||||
|
||||
**[🇺🇸 English](README_EN.md)** | **[📖 使用文档](https://doc.pandarobot.chat)** | **[🚀 在线体验](https://web.pandarobot.chat)** | **[🐛 问题反馈](https://github.com/ageerle/ruoyi-ai/issues)** | **[💡 功能建议](https://github.com/ageerle/ruoyi-ai/issues)**
|
||||
|
||||
@@ -30,36 +30,42 @@
|
||||
|
||||
## ✨ 核心亮点
|
||||
|
||||
### 🤖 智能AI引擎
|
||||
### 智能AI引擎
|
||||
- **多模型接入**:支持 OpenAI GPT-4、Azure、ChatGLM、通义千问、智谱AI 等主流模型
|
||||
- **AI平台集成**:深度集成 **FastGPT**、**扣子(Coze)**、**DIFY** 等主流AI应用平台
|
||||
- **Spring AI MCP 集成**:基于模型上下文协议,打造可扩展的AI工具生态系统
|
||||
- **实时流式对话**:采用 SSE/WebSocket 技术,提供丝滑的对话体验
|
||||
- **AI 编程助手**:内置智能代码分析和项目脚手架生成能力
|
||||
|
||||
### 🌟 AI平台生态集成
|
||||
### AI平台生态集成
|
||||
- **FastGPT 深度集成**:原生支持 FastGPT API,包括知识库检索、工作流编排和上下文管理
|
||||
- **扣子(Coze) 官方SDK**:集成字节跳动扣子平台官方SDK,支持Bot对话和流式响应
|
||||
- **DIFY 完整兼容**:使用 DIFY Java Client,支持应用编排、工作流和知识库管理
|
||||
- **统一聊天接口**:提供统一的聊天服务接口,支持多平台无缝切换和负载均衡
|
||||
|
||||
### 🧠 本地化RAG方案
|
||||
### 本地化RAG方案
|
||||
- **私有知识库**:基于 Langchain4j 框架 + BGE-large-zh-v1.5 中文向量模型
|
||||
- **多种向量库**:支持 Milvus、Weaviate、Qdrant 等主流向量数据库
|
||||
- **数据安全可控**:支持完全本地部署,保护企业数据隐私
|
||||
- **灵活模型部署**:兼容 Ollama、vLLM 等本地推理框架
|
||||
|
||||
### 🎨 AI创作工具
|
||||
### AI创作工具
|
||||
- **AI 绘画创作**:深度集成 DALL·E-3、MidJourney、Stable Diffusion
|
||||
- **智能PPT生成**:一键将文本内容转换为精美演示文稿
|
||||
- **多模态理解**:支持文本、图片、文档等多种格式的智能处理
|
||||
|
||||
### 知识图谱与智能编排
|
||||
- **知识图谱构建**:自动从文档和对话中提取实体关系,构建可视化知识网络
|
||||
- **AI 流程编排**:可视化工作流设计器,支持复杂AI任务的编排和自动化执行
|
||||
- **数字人交互**:集成数字人形象,提供更自然的人机交互体验
|
||||
- **智能推理引擎**:基于知识图谱的智能推理和问答能力
|
||||
|
||||
|
||||
|
||||
## 🚀 快速体验
|
||||
|
||||
### 在线演示
|
||||
- **用户端体验**:[web.pandarobot.chat](https://web.pandarobot.chat) (账号:demo 密码:demo123)
|
||||
- **用户端体验**:[web.pandarobot.chat](https://web.pandarobot.chat) (账号:admin 密码:admin123)
|
||||
- **管理后台**:[admin.pandarobot.chat](https://admin.pandarobot.chat) (账号:admin 密码:admin123)
|
||||
|
||||
### 项目源码
|
||||
@@ -79,13 +85,13 @@
|
||||
|
||||
## 🛠️ 技术架构
|
||||
|
||||
### 🏗️ 核心框架
|
||||
### 核心框架
|
||||
- **后端架构**:Spring Boot 3.4 + Spring AI + Langchain4j
|
||||
- **数据存储**:MySQL 8.0 + Redis + 向量数据库(Milvus/Weaviate/Qdrant)
|
||||
- **前端技术**:Vue 3 + Vben Admin + Naive UI
|
||||
- **安全认证**:Sa-Token + JWT 双重保障
|
||||
|
||||
### 🔧 系统组件
|
||||
### 系统组件
|
||||
- **文档处理**:PDF、Word、Excel 解析,图像智能分析
|
||||
- **实时通信**:WebSocket 实时通信,SSE 流式响应
|
||||
- **系统监控**:完善的日志体系、性能监控、服务健康检查
|
||||
@@ -109,10 +115,6 @@
|
||||
|
||||
> 💡 **小贴士**:建议将 PR 提交到 GitHub,我们会自动同步到其他代码托管平台
|
||||
|
||||
<a href="https://openomy.com/ageerle/ruoyi-ai" target="_blank" style="display: block; width: 100%;" align="center">
|
||||
<img src="https://openomy.com/svg?repo=ageerle/ruoyi-ai&chart=bubble&latestMonth=3" target="_blank" alt="Contribution Leaderboard" style="display: block; width: 100%;" />
|
||||
</a>
|
||||
|
||||
## 📄 开源协议
|
||||
|
||||
本项目采用 **MIT 开源协议**,详情请查看 [LICENSE](LICENSE) 文件。
|
||||
@@ -151,12 +153,6 @@
|
||||
<em>技术讨论</em>
|
||||
</td>
|
||||
|
||||
<td align="center">
|
||||
<img width="200" height="200" alt="95e8b1b3baeadbd24650bfb974ca5a58" src="https://github.com/user-attachments/assets/e08fb61a-fd23-4b16-9d7e-85576f01cb10" /><br>
|
||||
<strong>微信技术交流群</strong><br>
|
||||
<em>技术讨论</em>
|
||||
</td>
|
||||
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
|
||||
### Enterprise-Grade AI Assistant Platform
|
||||
|
||||
*Production-ready AI platform with deep integration of FastGPT, Coze, DIFY and advanced RAG technology*
|
||||
*Production-ready AI platform with deep integration of FastGPT, Coze, DIFY, featuring advanced RAG technology, knowledge graphs, digital humans, and AI workflow orchestration*
|
||||
|
||||
**[📖 中文文档](README.md)** | **[📚 Documentation](https://doc.pandarobot.chat)** | **[🚀 Live Demo](https://web.pandarobot.chat)** | **[🐛 Report Bug](https://github.com/ageerle/ruoyi-ai/issues)** | **[💡 Request Feature](https://github.com/ageerle/ruoyi-ai/issues)**
|
||||
|
||||
@@ -46,6 +46,12 @@
|
||||
- **PPT Creation**: Automated slide generation from text input
|
||||
- **Multi-Modal Processing**: Text, image, and document understanding
|
||||
|
||||
### 🧩 Knowledge Graph & Intelligent Orchestration
|
||||
- **Knowledge Graph Construction**: Automatically extract entities and relationships from documents and conversations to build visual knowledge networks
|
||||
- **AI Workflow Orchestration**: Visual workflow designer supporting complex AI task orchestration and automated execution
|
||||
- **Digital Human Interaction**: Integrated digital human avatars for more natural human-computer interaction
|
||||
- **Intelligent Reasoning Engine**: Knowledge graph-based intelligent reasoning and Q&A capabilities
|
||||
|
||||
|
||||
|
||||
## 🚀 Quick Start
|
||||
|
||||
@@ -44,12 +44,13 @@ spring:
|
||||
spring.data:
|
||||
redis:
|
||||
# 地址
|
||||
host: 127.0.0.1
|
||||
host: 117.72.192.162
|
||||
# 端口,默认为6379
|
||||
port: 6379
|
||||
port: 6380
|
||||
# 数据库索引
|
||||
database: 2
|
||||
# 密码(如没有密码请注释掉)
|
||||
password: wt123
|
||||
# password: 123456
|
||||
# 连接超时时间
|
||||
timeout: 10S
|
||||
@@ -101,67 +102,9 @@ pdf:
|
||||
conda-env-path: "F:\\ProgramData\\Computer\\Anaconda\\envs\\mineru"
|
||||
# 是否开启图片OCR
|
||||
enable-ocr: true
|
||||
#百炼模型配置
|
||||
dashscope:
|
||||
key: sk-xxxx
|
||||
|
||||
local:
|
||||
images: xx
|
||||
|
||||
|
||||
|
||||
files: xx
|
||||
|
||||
|
||||
|
||||
--- # Neo4j 知识图谱配置
|
||||
neo4j:
|
||||
uri: bolt://127.0.0.1:7687
|
||||
username: neo4j
|
||||
password: MySecurePass123!
|
||||
database: neo4j
|
||||
max-connection-pool-size: 50
|
||||
connection-timeout-seconds: 30
|
||||
|
||||
# 知识图谱配置
|
||||
knowledge:
|
||||
graph:
|
||||
# 是否启用知识图谱功能
|
||||
enabled: true
|
||||
# 图数据库类型: neo4j 或 apache-age
|
||||
database-type: neo4j
|
||||
# 是否自动创建索引
|
||||
auto-create-index: true
|
||||
# 批量处理大小
|
||||
batch-size: 1000
|
||||
# 最大重试次数
|
||||
max-retry-count: 3
|
||||
|
||||
# 实体抽取配置
|
||||
extraction:
|
||||
# 置信度阈值(低于此值的实体将被过滤)
|
||||
confidence-threshold: 0.7
|
||||
# 最大实体数量(每个文档)
|
||||
max-entities-per-doc: 100
|
||||
# 最大关系数量(每个文档)
|
||||
max-relations-per-doc: 200
|
||||
# 文本分片大小(用于长文档)
|
||||
chunk-size: 2000
|
||||
# 分片重叠大小
|
||||
chunk-overlap: 200
|
||||
|
||||
# 查询配置
|
||||
query:
|
||||
# 默认查询限制数量
|
||||
default-limit: 100
|
||||
# 最大查询限制数量
|
||||
max-limit: 1000
|
||||
# 路径查询最大深度
|
||||
max-path-depth: 5
|
||||
# 查询超时时间(秒)
|
||||
timeout-seconds: 30
|
||||
# 是否启用查询缓存
|
||||
cache-enabled: true
|
||||
# 缓存过期时间(分钟)
|
||||
cache-expire-minutes: 60
|
||||
|
||||
|
||||
@@ -303,6 +303,10 @@ management:
|
||||
show-details: ALWAYS
|
||||
logfile:
|
||||
external-file: ./logs/sys-console.log
|
||||
health:
|
||||
# 禁用 Neo4j 健康检查(当知识图谱功能未启用时)
|
||||
neo4j:
|
||||
enabled: false
|
||||
|
||||
# websocket
|
||||
# websocket
|
||||
@@ -346,3 +350,55 @@ vector-store:
|
||||
url: http://localhost:19530
|
||||
collectionname: LocalKnowledge
|
||||
|
||||
|
||||
--- # Neo4j 知识图谱配置
|
||||
#neo4j:
|
||||
# uri: bolt://117.72.192.162:7687
|
||||
# username: neo4j
|
||||
# password: MySecurePass123!
|
||||
# database: neo4j
|
||||
# max-connection-pool-size: 50
|
||||
# connection-timeout-seconds: 30
|
||||
|
||||
# 知识图谱配置
|
||||
knowledge:
|
||||
graph:
|
||||
# 是否启用知识图谱功能
|
||||
enabled: false
|
||||
# 图数据库类型: neo4j 或 apache-age
|
||||
database-type: neo4j
|
||||
# 是否自动创建索引
|
||||
auto-create-index: true
|
||||
# 批量处理大小
|
||||
batch-size: 1000
|
||||
# 最大重试次数
|
||||
max-retry-count: 3
|
||||
|
||||
# 实体抽取配置
|
||||
extraction:
|
||||
# 置信度阈值(低于此值的实体将被过滤)
|
||||
confidence-threshold: 0.7
|
||||
# 最大实体数量(每个文档)
|
||||
max-entities-per-doc: 100
|
||||
# 最大关系数量(每个文档)
|
||||
max-relations-per-doc: 200
|
||||
# 文本分片大小(用于长文档)
|
||||
chunk-size: 2000
|
||||
# 分片重叠大小
|
||||
chunk-overlap: 200
|
||||
|
||||
# 查询配置
|
||||
query:
|
||||
# 默认查询限制数量
|
||||
default-limit: 100
|
||||
# 最大查询限制数量
|
||||
max-limit: 1000
|
||||
# 路径查询最大深度
|
||||
max-path-depth: 5
|
||||
# 查询超时时间(秒)
|
||||
timeout-seconds: 30
|
||||
# 是否启用查询缓存
|
||||
cache-enabled: true
|
||||
# 缓存过期时间(分钟)
|
||||
cache-expire-minutes: 60
|
||||
|
||||
|
||||
@@ -18,6 +18,8 @@
|
||||
|
||||
<properties>
|
||||
<easyexcel.version>3.2.1</easyexcel.version>
|
||||
<jna.version>5.13.0</jna.version>
|
||||
<java-websocket.version>1.5.5</java-websocket.version>
|
||||
</properties>
|
||||
|
||||
<!-- 按照用户要求,不添加任何依赖 -->
|
||||
@@ -70,5 +72,24 @@
|
||||
<groupId>org.ruoyi</groupId>
|
||||
<artifactId>ruoyi-common-excel</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>net.java.dev.jna</groupId>
|
||||
<artifactId>jna</artifactId>
|
||||
<version>${jna.version}</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>net.java.dev.jna</groupId>
|
||||
<artifactId>jna-platform</artifactId>
|
||||
<version>${jna.version}</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.java-websocket</groupId>
|
||||
<artifactId>Java-WebSocket</artifactId>
|
||||
<version>${java-websocket.version}</version>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
</project>
|
||||
@@ -0,0 +1,16 @@
|
||||
package org.ruoyi.aihuman.config;
|
||||
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
|
||||
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
|
||||
|
||||
@Configuration
|
||||
public class WebConfig implements WebMvcConfigurer {
|
||||
@Override
|
||||
public void addResourceHandlers(ResourceHandlerRegistry registry) {
|
||||
// 映射/voice/**路径到classpath:/voice/目录
|
||||
registry.addResourceHandler("/voice/**")
|
||||
.addResourceLocations("classpath:/voice/")
|
||||
.setCachePeriod(3600);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,157 @@
|
||||
package org.ruoyi.aihuman.controller;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import cn.dev33.satoken.annotation.SaIgnore;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import jakarta.validation.constraints.*;
|
||||
import cn.dev33.satoken.annotation.SaCheckPermission;
|
||||
import org.ruoyi.common.log.enums.OperatorType;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.ruoyi.common.idempotent.annotation.RepeatSubmit;
|
||||
import org.ruoyi.common.log.annotation.Log;
|
||||
import org.ruoyi.common.web.core.BaseController;
|
||||
import org.ruoyi.core.page.PageQuery;
|
||||
import org.ruoyi.common.core.domain.R;
|
||||
import org.ruoyi.common.core.validate.AddGroup;
|
||||
import org.ruoyi.common.core.validate.EditGroup;
|
||||
import org.ruoyi.common.log.enums.BusinessType;
|
||||
import org.ruoyi.common.excel.utils.ExcelUtil;
|
||||
import org.ruoyi.aihuman.domain.vo.AihumanRealConfigVo;
|
||||
import org.ruoyi.aihuman.domain.bo.AihumanRealConfigBo;
|
||||
import org.ruoyi.aihuman.service.AihumanRealConfigService;
|
||||
import org.ruoyi.core.page.TableDataInfo;
|
||||
|
||||
/**
|
||||
* 真人交互数字人配置
|
||||
*
|
||||
* @author ageerle
|
||||
* @date Tue Oct 21 11:46:52 GMT+08:00 2025
|
||||
*/
|
||||
//临时免登录
|
||||
@SaIgnore
|
||||
|
||||
@Validated
|
||||
@RequiredArgsConstructor
|
||||
@RestController
|
||||
@RequestMapping("/aihuman/aihumanRealConfig")
|
||||
public class AihumanRealConfigController extends BaseController {
|
||||
|
||||
private final AihumanRealConfigService aihumanRealConfigService;
|
||||
|
||||
/**
|
||||
* 查询真人交互数字人配置列表
|
||||
*/
|
||||
@SaCheckPermission("aihuman:aihumanRealConfig:list")
|
||||
@GetMapping("/list")
|
||||
public TableDataInfo<AihumanRealConfigVo> list(AihumanRealConfigBo bo, PageQuery pageQuery) {
|
||||
return aihumanRealConfigService.queryPageList(bo, pageQuery);
|
||||
}
|
||||
|
||||
/**
|
||||
* 导出真人交互数字人配置列表
|
||||
*/
|
||||
@SaCheckPermission("aihuman:aihumanRealConfig:export")
|
||||
@Log(title = "真人交互数字人配置", businessType = BusinessType.EXPORT)
|
||||
@PostMapping("/export")
|
||||
public void export(AihumanRealConfigBo bo, HttpServletResponse response) {
|
||||
List<AihumanRealConfigVo> list = aihumanRealConfigService.queryList(bo);
|
||||
ExcelUtil.exportExcel(list, "真人交互数字人配置", AihumanRealConfigVo.class, response);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取真人交互数字人配置详细信息
|
||||
*
|
||||
* @param id 主键
|
||||
*/
|
||||
@SaCheckPermission("aihuman:aihumanRealConfig:query")
|
||||
@GetMapping("/{id}")
|
||||
public R<AihumanRealConfigVo> getInfo(@NotNull(message = "主键不能为空")
|
||||
@PathVariable Integer id) {
|
||||
return R.ok(aihumanRealConfigService.queryById(id));
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增真人交互数字人配置
|
||||
*/
|
||||
@SaCheckPermission("aihuman:aihumanRealConfig:add")
|
||||
@Log(title = "真人交互数字人配置", businessType = BusinessType.INSERT)
|
||||
@RepeatSubmit()
|
||||
@PostMapping()
|
||||
public R<Void> add(@Validated(AddGroup.class) @RequestBody AihumanRealConfigBo bo) {
|
||||
return toAjax(aihumanRealConfigService.insertByBo(bo));
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改真人交互数字人配置
|
||||
*/
|
||||
@SaCheckPermission("aihuman:aihumanRealConfig:edit")
|
||||
@Log(title = "真人交互数字人配置", businessType = BusinessType.UPDATE)
|
||||
@RepeatSubmit()
|
||||
@PutMapping()
|
||||
public R<Void> edit(@Validated(EditGroup.class) @RequestBody AihumanRealConfigBo bo) {
|
||||
return toAjax(aihumanRealConfigService.updateByBo(bo));
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除真人交互数字人配置
|
||||
*
|
||||
* @param ids 主键串
|
||||
*/
|
||||
@SaCheckPermission("aihuman:aihumanRealConfig:remove")
|
||||
@Log(title = "真人交互数字人配置", businessType = BusinessType.DELETE)
|
||||
@DeleteMapping("/{ids}")
|
||||
public R<Void> remove(@NotEmpty(message = "主键不能为空")
|
||||
@PathVariable Integer[] ids) {
|
||||
return toAjax(aihumanRealConfigService.deleteWithValidByIds(List.of(ids), true));
|
||||
}
|
||||
|
||||
/**
|
||||
* 1.执行以下命令:
|
||||
* cd F:\Projects\AI-Human\LiveTalking
|
||||
* conda activate D:\zg117\C\Users\zg117\.conda\envs\livetalking_new
|
||||
* python app.py --transport webrtc --model wav2lip --avatar_id wav2lip256_avatar1
|
||||
*
|
||||
* 2.监听 python app.py --transport webrtc --model wav2lip --avatar_id wav2lip256_avatar1 执行情况
|
||||
*
|
||||
* 3.返回执行结果并打开页面
|
||||
* http://127.0.0.1:8010/webrtcapi-diy.html
|
||||
*/
|
||||
@SaCheckPermission("aihuman:aihumanRealConfig:run")
|
||||
//@Log(title = "真人交互数字人配置", businessType = BusinessType.UPDATE, operatorType = OperatorType.OTHER)
|
||||
@RepeatSubmit()
|
||||
@PutMapping("/run")
|
||||
public R<String> run(@Validated(EditGroup.class) @RequestBody AihumanRealConfigBo bo) {
|
||||
boolean result = aihumanRealConfigService.runByBo(bo);
|
||||
if (result) {
|
||||
// 返回前端页面URL,前端可以根据这个URL跳转或打开新页面
|
||||
// http://127.0.0.1:8010/webrtcapi-diy.html 其中的 http://127.0.0.1 获取当前java服务的IP地址
|
||||
// return R.ok("http://127.0.0.1:8010/webrtcapi-diy.html");
|
||||
// 运行状态
|
||||
bo.setRunStatus("1");
|
||||
return R.ok("http://127.0.0.1:8010/webrtcapi-diy.html");
|
||||
} else {
|
||||
return R.fail("启动真人交互数字人失败");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 停止真人交互数字人配置任务
|
||||
*/
|
||||
@SaCheckPermission("aihuman:aihumanRealConfig:stop")
|
||||
//@Log(title = "真人交互数字人配置", businessType = BusinessType.UPDATE, operatorType = OperatorType.OTHER)
|
||||
@RepeatSubmit()
|
||||
@PutMapping("/stop")
|
||||
public R<String> stop(@Validated(EditGroup.class) @RequestBody AihumanRealConfigBo bo) {
|
||||
boolean result = aihumanRealConfigService.stopByBo(bo);
|
||||
if (result) {
|
||||
// 运行状态
|
||||
bo.setRunStatus("0");
|
||||
return R.ok("真人交互数字人任务已停止");
|
||||
} else {
|
||||
return R.fail("停止真人交互数字人任务失败或没有正在运行的任务");
|
||||
}
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,101 @@
|
||||
package org.ruoyi.aihuman.domain;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.*;
|
||||
import lombok.Data;
|
||||
import java.time.LocalDateTime;
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* 真人交互数字人配置对象 aihuman_real_config
|
||||
*
|
||||
* @author ageerle
|
||||
* @date Tue Oct 21 11:46:52 GMT+08:00 2025
|
||||
*/
|
||||
@Data
|
||||
@TableName("aihuman_real_config")
|
||||
public class AihumanRealConfig implements Serializable {
|
||||
|
||||
|
||||
/**
|
||||
* 主键id
|
||||
*/
|
||||
@TableId(value = "id", type = IdType.AUTO)
|
||||
private Integer id;
|
||||
|
||||
/**
|
||||
* 场景名称
|
||||
*/
|
||||
private String name;
|
||||
|
||||
/**
|
||||
* 真人形象名称
|
||||
*/
|
||||
private String avatars;
|
||||
|
||||
/**
|
||||
* 模型名称
|
||||
*/
|
||||
private String models;
|
||||
|
||||
/**
|
||||
* 形象参数(预留)
|
||||
*/
|
||||
private String avatarsParams;
|
||||
|
||||
/**
|
||||
* 模型参数(预留)
|
||||
*/
|
||||
private String modelsParams;
|
||||
|
||||
/**
|
||||
* 智能体参数(扣子)
|
||||
*/
|
||||
private String agentParams;
|
||||
|
||||
/**
|
||||
* 创建时间
|
||||
*/
|
||||
private LocalDateTime createTime;
|
||||
|
||||
/**
|
||||
* 更新时间
|
||||
*/
|
||||
private LocalDateTime updateTime;
|
||||
|
||||
/**
|
||||
* 状态
|
||||
*/
|
||||
private Integer status;
|
||||
|
||||
/**
|
||||
* 发布状态
|
||||
*/
|
||||
private Integer publish;
|
||||
|
||||
/**
|
||||
* 运行参数
|
||||
*/
|
||||
private String runParams;
|
||||
|
||||
/**
|
||||
* 运行状态
|
||||
*/
|
||||
private String runStatus;
|
||||
|
||||
/**
|
||||
* 创建部门
|
||||
*/
|
||||
private String createDept;
|
||||
|
||||
/**
|
||||
* 创建用户
|
||||
*/
|
||||
private String createBy;
|
||||
|
||||
/**
|
||||
* 更新用户
|
||||
*/
|
||||
private String updateBy;
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
package org.ruoyi.aihuman.domain;
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
import lombok.Data;
|
||||
|
||||
|
||||
/**
|
||||
* 语音请求参数实体类
|
||||
*/
|
||||
@Data
|
||||
public class VoiceRequest {
|
||||
|
||||
@JsonProperty("ENDPOINT")
|
||||
private String endpoint;
|
||||
private String appId;
|
||||
private String accessToken;
|
||||
private String resourceId;
|
||||
private String voice;
|
||||
private String text;
|
||||
private String encoding;
|
||||
|
||||
}
|
||||
@@ -0,0 +1,87 @@
|
||||
package org.ruoyi.aihuman.domain.bo;
|
||||
|
||||
import org.ruoyi.aihuman.domain.AihumanRealConfig;
|
||||
import io.github.linpeilie.annotations.AutoMapper;
|
||||
import lombok.Data;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* 真人交互数字人配置业务对象 aihuman_real_config
|
||||
*
|
||||
* @author ageerle
|
||||
* @date Tue Oct 21 11:46:52 GMT+08:00 2025
|
||||
*/
|
||||
@Data
|
||||
|
||||
@AutoMapper(target = AihumanRealConfig.class, reverseConvertGenerate = false)
|
||||
public class AihumanRealConfigBo implements Serializable {
|
||||
|
||||
private Integer id;
|
||||
|
||||
/**
|
||||
* 场景名称
|
||||
*/
|
||||
private String name;
|
||||
/**
|
||||
* 真人形象名称
|
||||
*/
|
||||
private String avatars;
|
||||
/**
|
||||
* 模型名称
|
||||
*/
|
||||
private String models;
|
||||
/**
|
||||
* 形象参数(预留)
|
||||
*/
|
||||
private String avatarsParams;
|
||||
/**
|
||||
* 模型参数(预留)
|
||||
*/
|
||||
private String modelsParams;
|
||||
/**
|
||||
* 智能体参数(扣子)
|
||||
*/
|
||||
private String agentParams;
|
||||
/**
|
||||
* 创建时间
|
||||
*/
|
||||
private LocalDateTime createTime;
|
||||
/**
|
||||
* 更新时间
|
||||
*/
|
||||
private LocalDateTime updateTime;
|
||||
/**
|
||||
* 状态
|
||||
*/
|
||||
private Integer status;
|
||||
/**
|
||||
* 发布状态
|
||||
*/
|
||||
private Integer publish;
|
||||
|
||||
/**
|
||||
* 运行参数
|
||||
*/
|
||||
private String runParams;
|
||||
|
||||
/**
|
||||
* 运行状态
|
||||
*/
|
||||
private String runStatus;
|
||||
|
||||
/**
|
||||
* 创建部门
|
||||
*/
|
||||
private String createDept;
|
||||
/**
|
||||
* 创建用户
|
||||
*/
|
||||
private String createBy;
|
||||
/**
|
||||
* 更新用户
|
||||
*/
|
||||
private String updateBy;
|
||||
|
||||
}
|
||||
@@ -0,0 +1,108 @@
|
||||
package org.ruoyi.aihuman.domain.vo;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.io.Serializable;
|
||||
import org.ruoyi.aihuman.domain.AihumanRealConfig;
|
||||
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
|
||||
import com.alibaba.excel.annotation.ExcelProperty;
|
||||
import io.github.linpeilie.annotations.AutoMapper;
|
||||
import lombok.Data;
|
||||
import org.ruoyi.common.excel.annotation.ExcelDictFormat;
|
||||
import org.ruoyi.common.excel.convert.ExcelDictConvert;
|
||||
|
||||
|
||||
/**
|
||||
* 真人交互数字人配置视图对象 aihuman_real_config
|
||||
*
|
||||
* @author ageerle
|
||||
* @date Tue Oct 21 11:46:52 GMT+08:00 2025
|
||||
*/
|
||||
@Data
|
||||
@ExcelIgnoreUnannotated
|
||||
@AutoMapper(target = AihumanRealConfig.class)
|
||||
public class AihumanRealConfigVo implements Serializable {
|
||||
|
||||
private Integer id;
|
||||
/**
|
||||
* 场景名称
|
||||
*/
|
||||
@ExcelProperty(value = "场景名称")
|
||||
private String name;
|
||||
/**
|
||||
* 真人形象名称
|
||||
*/
|
||||
@ExcelProperty(value = "真人形象名称")
|
||||
private String avatars;
|
||||
/**
|
||||
* 模型名称
|
||||
*/
|
||||
@ExcelProperty(value = "模型名称")
|
||||
private String models;
|
||||
/**
|
||||
* 形象参数(预留)
|
||||
*/
|
||||
@ExcelProperty(value = "形象参数", converter = ExcelDictConvert.class)
|
||||
@ExcelDictFormat(readConverterExp = "$column.readConverterExp()")
|
||||
private String avatarsParams;
|
||||
/**
|
||||
* 模型参数(预留)
|
||||
*/
|
||||
@ExcelProperty(value = "模型参数", converter = ExcelDictConvert.class)
|
||||
@ExcelDictFormat(readConverterExp = "$column.readConverterExp()")
|
||||
private String modelsParams;
|
||||
/**
|
||||
* 智能体参数(扣子)
|
||||
*/
|
||||
@ExcelProperty(value = "智能体参数", converter = ExcelDictConvert.class)
|
||||
@ExcelDictFormat(readConverterExp = "$column.readConverterExp()")
|
||||
private String agentParams;
|
||||
/**
|
||||
* 创建时间
|
||||
*/
|
||||
@ExcelProperty(value = "创建时间")
|
||||
private LocalDateTime createTime;
|
||||
/**
|
||||
* 更新时间
|
||||
*/
|
||||
@ExcelProperty(value = "更新时间")
|
||||
private LocalDateTime updateTime;
|
||||
/**
|
||||
* 状态
|
||||
*/
|
||||
@ExcelProperty(value = "状态")
|
||||
private Integer status;
|
||||
/**
|
||||
* 发布状态
|
||||
*/
|
||||
@ExcelProperty(value = "发布状态")
|
||||
private Integer publish;
|
||||
|
||||
/**
|
||||
* 运行参数
|
||||
*/
|
||||
@ExcelProperty(value = "运行参数")
|
||||
private String runParams;
|
||||
|
||||
/**
|
||||
* 运行状态
|
||||
*/
|
||||
@ExcelProperty(value = "运行状态")
|
||||
private String runStatus;
|
||||
|
||||
/**
|
||||
* 创建部门
|
||||
*/
|
||||
@ExcelProperty(value = "创建部门")
|
||||
private String createDept;
|
||||
/**
|
||||
* 创建用户
|
||||
*/
|
||||
@ExcelProperty(value = "创建用户")
|
||||
private String createBy;
|
||||
/**
|
||||
* 更新用户
|
||||
*/
|
||||
@ExcelProperty(value = "更新用户")
|
||||
private String updateBy;
|
||||
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
package org.ruoyi.aihuman.mapper;
|
||||
|
||||
import org.ruoyi.aihuman.domain.AihumanRealConfig;
|
||||
import org.ruoyi.aihuman.domain.vo.AihumanRealConfigVo;
|
||||
import org.ruoyi.core.mapper.BaseMapperPlus;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
|
||||
/**
|
||||
* 真人交互数字人配置Mapper接口
|
||||
*
|
||||
* @author ageerle
|
||||
* @date Tue Oct 21 11:46:52 GMT+08:00 2025
|
||||
*/
|
||||
@Mapper
|
||||
public interface AihumanRealConfigMapper extends BaseMapperPlus<AihumanRealConfig, AihumanRealConfigVo> {
|
||||
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
package org.ruoyi.aihuman.protocol;
|
||||
|
||||
import lombok.Getter;
|
||||
|
||||
@Getter
|
||||
public enum CompressionBits {
|
||||
None_((byte) 0),
|
||||
Gzip((byte) 0b1),
|
||||
Custom((byte) 0b11),
|
||||
;
|
||||
|
||||
private final byte value;
|
||||
|
||||
CompressionBits(byte b) {
|
||||
this.value = b;
|
||||
}
|
||||
|
||||
public static CompressionBits fromValue(int value) {
|
||||
for (CompressionBits type : CompressionBits.values()) {
|
||||
if (type.value == value) {
|
||||
return type;
|
||||
}
|
||||
}
|
||||
throw new IllegalArgumentException("Unknown CompressionBits value: " + value);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,90 @@
|
||||
package org.ruoyi.aihuman.protocol;
|
||||
|
||||
import lombok.Getter;
|
||||
|
||||
@Getter
|
||||
public enum EventType {
|
||||
// Default event
|
||||
NONE(0),
|
||||
|
||||
// Upstream Connection events (1-49)
|
||||
START_CONNECTION(1),
|
||||
START_TASK(1),
|
||||
FINISH_CONNECTION(2),
|
||||
FINISH_TASK(2),
|
||||
|
||||
// Downstream Connection events (50-99)
|
||||
CONNECTION_STARTED(50),
|
||||
TASK_STARTED(50),
|
||||
CONNECTION_FAILED(51),
|
||||
TASK_FAILED(51),
|
||||
CONNECTION_FINISHED(52),
|
||||
TASK_FINISHED(52),
|
||||
|
||||
// Upstream Session events (100-149)
|
||||
START_SESSION(100),
|
||||
CANCEL_SESSION(101),
|
||||
FINISH_SESSION(102),
|
||||
|
||||
// Downstream Session events (150-199)
|
||||
SESSION_STARTED(150),
|
||||
SESSION_CANCELED(151),
|
||||
SESSION_FINISHED(152),
|
||||
SESSION_FAILED(153),
|
||||
USAGE_RESPONSE(154),
|
||||
CHARGE_DATA(154),
|
||||
|
||||
// Upstream General events (200-249)
|
||||
TASK_REQUEST(200),
|
||||
UPDATE_CONFIG(201),
|
||||
|
||||
// Downstream General events (250-299)
|
||||
AUDIO_MUTED(250),
|
||||
|
||||
// Upstream TTS events (300-349)
|
||||
SAY_HELLO(300),
|
||||
|
||||
// Downstream TTS events (350-399)
|
||||
TTS_SENTENCE_START(350),
|
||||
TTS_SENTENCE_END(351),
|
||||
TTS_RESPONSE(352),
|
||||
TTS_ENDED(359),
|
||||
PODCAST_ROUND_START(360),
|
||||
PODCAST_ROUND_RESPONSE(361),
|
||||
PODCAST_ROUND_END(362),
|
||||
|
||||
// Downstream ASR events (450-499)
|
||||
ASR_INFO(450),
|
||||
ASR_RESPONSE(451),
|
||||
ASR_ENDED(459),
|
||||
|
||||
// Upstream Chat events (500-549)
|
||||
CHAT_TTS_TEXT(500),
|
||||
|
||||
// Downstream Chat events (550-599)
|
||||
CHAT_RESPONSE(550),
|
||||
CHAT_ENDED(559),
|
||||
|
||||
// Subtitle events (650-699)
|
||||
SOURCE_SUBTITLE_START(650),
|
||||
SOURCE_SUBTITLE_RESPONSE(651),
|
||||
SOURCE_SUBTITLE_END(652),
|
||||
TRANSLATION_SUBTITLE_START(653),
|
||||
TRANSLATION_SUBTITLE_RESPONSE(654),
|
||||
TRANSLATION_SUBTITLE_END(655);
|
||||
|
||||
private final int value;
|
||||
|
||||
EventType(int value) {
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
public static EventType fromValue(int value) {
|
||||
for (EventType type : EventType.values()) {
|
||||
if (type.value == value) {
|
||||
return type;
|
||||
}
|
||||
}
|
||||
throw new IllegalArgumentException("Unknown EventType value: " + value);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
package org.ruoyi.aihuman.protocol;
|
||||
|
||||
import lombok.Getter;
|
||||
|
||||
@Getter
|
||||
public enum HeaderSizeBits {
|
||||
HeaderSize4((byte) 1),
|
||||
HeaderSize8((byte) 2),
|
||||
HeaderSize12((byte) 3),
|
||||
HeaderSize16((byte) 4),
|
||||
;
|
||||
|
||||
private final byte value;
|
||||
|
||||
HeaderSizeBits(byte b) {
|
||||
this.value = b;
|
||||
}
|
||||
|
||||
public static HeaderSizeBits fromValue(int value) {
|
||||
for (HeaderSizeBits type : HeaderSizeBits.values()) {
|
||||
if (type.value == value) {
|
||||
return type;
|
||||
}
|
||||
}
|
||||
throw new IllegalArgumentException("Unknown HeaderSizeBits value: " + value);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,220 @@
|
||||
package org.ruoyi.aihuman.protocol;
|
||||
|
||||
import lombok.Data;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.ByteOrder;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
|
||||
@Slf4j
|
||||
@Data
|
||||
public class Message {
|
||||
private byte version = VersionBits.Version1.getValue();
|
||||
private byte headerSize = HeaderSizeBits.HeaderSize4.getValue();
|
||||
private MsgType type;
|
||||
private MsgTypeFlagBits flag;
|
||||
private byte serialization = SerializationBits.JSON.getValue();
|
||||
private byte compression = 0;
|
||||
|
||||
private EventType event;
|
||||
private String sessionId;
|
||||
private String connectId;
|
||||
private int sequence;
|
||||
private int errorCode;
|
||||
|
||||
private byte[] payload;
|
||||
|
||||
public Message(MsgType type, MsgTypeFlagBits flag) {
|
||||
this.type = type;
|
||||
this.flag = flag;
|
||||
}
|
||||
|
||||
public static Message unmarshal(byte[] data) throws Exception {
|
||||
ByteBuffer buffer = ByteBuffer.wrap(data);
|
||||
|
||||
byte type_and_flag = data[1];
|
||||
MsgType type = MsgType.fromValue((type_and_flag >> 4) & 0x0F);
|
||||
MsgTypeFlagBits flag = MsgTypeFlagBits.fromValue(type_and_flag & 0x0F);
|
||||
|
||||
// Read version and header size
|
||||
int versionAndHeaderSize = buffer.get();
|
||||
VersionBits version = VersionBits.fromValue((versionAndHeaderSize >> 4) & 0x0F);
|
||||
HeaderSizeBits headerSize = HeaderSizeBits.fromValue(versionAndHeaderSize & 0x0F);
|
||||
|
||||
// Skip second byte
|
||||
buffer.get();
|
||||
|
||||
// Read serialization and compression method
|
||||
int serializationCompression = buffer.get();
|
||||
SerializationBits serialization = SerializationBits.fromValue((serializationCompression >> 4) & 0x0F);
|
||||
CompressionBits compression = CompressionBits.fromValue(serializationCompression & 0x0F);
|
||||
|
||||
// Skip padding bytes
|
||||
int headerSizeInt = 4 * (int) headerSize.getValue();
|
||||
int paddingSize = headerSizeInt - 3;
|
||||
while (paddingSize > 0) {
|
||||
buffer.get();
|
||||
paddingSize -= 1;
|
||||
}
|
||||
|
||||
Message message = new Message(type, flag);
|
||||
message.setVersion(version.getValue());
|
||||
message.setHeaderSize(headerSize.getValue());
|
||||
message.setSerialization(serialization.getValue());
|
||||
message.setCompression(compression.getValue());
|
||||
|
||||
// Read sequence if present
|
||||
if (flag == MsgTypeFlagBits.POSITIVE_SEQ || flag == MsgTypeFlagBits.NEGATIVE_SEQ) {
|
||||
// Read 4 bytes from ByteBuffer and parse as int (big-endian)
|
||||
byte[] sequeueBytes = new byte[4];
|
||||
if (buffer.remaining() >= 4) {
|
||||
buffer.get(sequeueBytes); // Read 4 bytes into array
|
||||
ByteBuffer wrapper = ByteBuffer.wrap(sequeueBytes);
|
||||
wrapper.order(ByteOrder.BIG_ENDIAN); // Set big-endian order
|
||||
message.setSequence(wrapper.getInt());
|
||||
}
|
||||
}
|
||||
|
||||
// Read event if present
|
||||
if (flag == MsgTypeFlagBits.WITH_EVENT) {
|
||||
// Read 4 bytes from ByteBuffer and parse as int (big-endian)
|
||||
byte[] eventBytes = new byte[4];
|
||||
if (buffer.remaining() >= 4) {
|
||||
buffer.get(eventBytes); // Read 4 bytes into array
|
||||
ByteBuffer wrapper = ByteBuffer.wrap(eventBytes);
|
||||
wrapper.order(ByteOrder.BIG_ENDIAN); // Set big-endian order
|
||||
message.setEvent(EventType.fromValue(wrapper.getInt()));
|
||||
}
|
||||
|
||||
if (type != MsgType.ERROR && !(message.event == EventType.START_CONNECTION
|
||||
|| message.event == EventType.FINISH_CONNECTION ||
|
||||
message.event == EventType.CONNECTION_STARTED
|
||||
|| message.event == EventType.CONNECTION_FAILED ||
|
||||
message.event == EventType.CONNECTION_FINISHED)) {
|
||||
// Read sessionId if present
|
||||
int sessionIdLength = buffer.getInt();
|
||||
if (sessionIdLength > 0) {
|
||||
byte[] sessionIdBytes = new byte[sessionIdLength];
|
||||
buffer.get(sessionIdBytes);
|
||||
message.setSessionId(new String(sessionIdBytes, StandardCharsets.UTF_8));
|
||||
}
|
||||
}
|
||||
|
||||
if (message.event == EventType.CONNECTION_STARTED || message.event == EventType.CONNECTION_FAILED
|
||||
|| message.event == EventType.CONNECTION_FINISHED) {
|
||||
// Read connectId if present
|
||||
int connectIdLength = buffer.getInt();
|
||||
if (connectIdLength > 0) {
|
||||
byte[] connectIdBytes = new byte[connectIdLength];
|
||||
buffer.get(connectIdBytes);
|
||||
message.setConnectId(new String(connectIdBytes, StandardCharsets.UTF_8));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Read errorCode if present
|
||||
if (type == MsgType.ERROR) {
|
||||
// Read 4 bytes from ByteBuffer and parse as int (big-endian)
|
||||
byte[] errorCodeBytes = new byte[4];
|
||||
if (buffer.remaining() >= 4) {
|
||||
buffer.get(errorCodeBytes); // Read 4 bytes into array
|
||||
ByteBuffer wrapper = ByteBuffer.wrap(errorCodeBytes);
|
||||
wrapper.order(ByteOrder.BIG_ENDIAN); // Set big-endian order
|
||||
message.setErrorCode(wrapper.getInt());
|
||||
}
|
||||
}
|
||||
|
||||
// Read remaining bytes as payload
|
||||
if (buffer.remaining() > 0) {
|
||||
// 4 bytes length
|
||||
int payloadLength = buffer.getInt();
|
||||
if (payloadLength > 0) {
|
||||
byte[] payloadBytes = new byte[payloadLength];
|
||||
buffer.get(payloadBytes);
|
||||
message.setPayload(payloadBytes);
|
||||
}
|
||||
}
|
||||
|
||||
return message;
|
||||
}
|
||||
|
||||
public byte[] marshal() throws Exception {
|
||||
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
|
||||
|
||||
// Write header
|
||||
buffer.write((version & 0x0F) << 4 | (headerSize & 0x0F));
|
||||
buffer.write((type.getValue() & 0x0F) << 4 | (flag.getValue() & 0x0F));
|
||||
buffer.write((serialization & 0x0F) << 4 | (compression & 0x0F));
|
||||
|
||||
int headerSizeInt = 4 * (int) headerSize;
|
||||
int padding = headerSizeInt - buffer.size();
|
||||
while (padding > 0) {
|
||||
buffer.write(0);
|
||||
padding -= 1;
|
||||
}
|
||||
|
||||
// Write event if present
|
||||
if (event != null) {
|
||||
byte[] eventBytes = ByteBuffer.allocate(4).putInt(event.getValue()).array();
|
||||
buffer.write(eventBytes);
|
||||
}
|
||||
|
||||
// Write sessionId if present
|
||||
if (sessionId != null) {
|
||||
byte[] sessionIdBytes = sessionId.getBytes(StandardCharsets.UTF_8);
|
||||
buffer.write(ByteBuffer.allocate(4).putInt(sessionIdBytes.length).array());
|
||||
buffer.write(sessionIdBytes);
|
||||
}
|
||||
|
||||
// Write connectId if present
|
||||
if (connectId != null) {
|
||||
byte[] connectIdBytes = connectId.getBytes(StandardCharsets.UTF_8);
|
||||
buffer.write(ByteBuffer.allocate(4).putInt(connectIdBytes.length).array());
|
||||
buffer.write(connectIdBytes);
|
||||
}
|
||||
|
||||
// Write sequence if present
|
||||
if (sequence != 0) {
|
||||
buffer.write(ByteBuffer.allocate(4).putInt(sequence).array());
|
||||
}
|
||||
|
||||
// Write errorCode if present
|
||||
if (errorCode != 0) {
|
||||
buffer.write(ByteBuffer.allocate(4).putInt(errorCode).array());
|
||||
}
|
||||
|
||||
// Write payload if present
|
||||
if (payload != null && payload.length > 0) {
|
||||
buffer.write(ByteBuffer.allocate(4).putInt(payload.length).array());
|
||||
buffer.write(payload);
|
||||
}
|
||||
return buffer.toByteArray();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
switch (this.type) {
|
||||
case AUDIO_ONLY_SERVER:
|
||||
case AUDIO_ONLY_CLIENT:
|
||||
if (this.flag == MsgTypeFlagBits.POSITIVE_SEQ || this.flag == MsgTypeFlagBits.NEGATIVE_SEQ) {
|
||||
return String.format("MsgType: %s, EventType: %s, Sequence: %d, PayloadSize: %d", this.type, this.event, this.sequence,
|
||||
this.payload != null ? this.payload.length : 0);
|
||||
}
|
||||
return String.format("MsgType: %s, EventType: %s, PayloadSize: %d", this.type, this.event,
|
||||
this.payload != null ? this.payload.length : 0);
|
||||
case ERROR:
|
||||
return String.format("MsgType: %s, EventType: %s, ErrorCode: %d, Payload: %s", this.type, this.event, this.errorCode,
|
||||
this.payload != null ? new String(this.payload) : "null");
|
||||
default:
|
||||
if (this.flag == MsgTypeFlagBits.POSITIVE_SEQ || this.flag == MsgTypeFlagBits.NEGATIVE_SEQ) {
|
||||
return String.format("MsgType: %s, EventType: %s, Sequence: %d, Payload: %s",
|
||||
this.type, this.event, this.sequence,
|
||||
this.payload != null ? new String(this.payload) : "null");
|
||||
}
|
||||
return String.format("MsgType: %s, EventType: %s, Payload: %s", this.type, this.event,
|
||||
this.payload != null ? new String(this.payload) : "null");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
package org.ruoyi.aihuman.protocol;
|
||||
|
||||
import lombok.Getter;
|
||||
|
||||
@Getter
|
||||
public enum MsgType {
|
||||
INVALID((byte) 0),
|
||||
FULL_CLIENT_REQUEST((byte) 0b1),
|
||||
AUDIO_ONLY_CLIENT((byte) 0b10),
|
||||
FULL_SERVER_RESPONSE((byte) 0b1001),
|
||||
AUDIO_ONLY_SERVER((byte) 0b1011),
|
||||
FRONT_END_RESULT_SERVER((byte) 0b1100),
|
||||
ERROR((byte) 0b1111);
|
||||
|
||||
private final byte value;
|
||||
|
||||
MsgType(byte value) {
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
public static MsgType fromValue(int value) {
|
||||
for (MsgType type : MsgType.values()) {
|
||||
if (type.value == value) {
|
||||
return type;
|
||||
}
|
||||
}
|
||||
throw new IllegalArgumentException("Unknown MsgType value: " + value);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
package org.ruoyi.aihuman.protocol;
|
||||
|
||||
import lombok.Getter;
|
||||
|
||||
@Getter
|
||||
public enum MsgTypeFlagBits {
|
||||
NO_SEQ((byte) 0), // Non-terminating packet without sequence number
|
||||
POSITIVE_SEQ((byte) 0b1), // Non-terminating packet with positive sequence number
|
||||
LAST_NO_SEQ((byte) 0b10), // Terminating packet without sequence number
|
||||
NEGATIVE_SEQ((byte) 0b11), // Terminating packet with negative sequence number
|
||||
WITH_EVENT((byte) 0b100); // Packet containing event number
|
||||
|
||||
private final byte value;
|
||||
|
||||
MsgTypeFlagBits(byte value) {
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
public static MsgTypeFlagBits fromValue(int value) {
|
||||
for (MsgTypeFlagBits flag : MsgTypeFlagBits.values()) {
|
||||
if (flag.value == value) {
|
||||
return flag;
|
||||
}
|
||||
}
|
||||
throw new IllegalArgumentException("Unknown MsgTypeFlagBits value: " + value);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
package org.ruoyi.aihuman.protocol;
|
||||
|
||||
import lombok.Getter;
|
||||
|
||||
@Getter
|
||||
public enum SerializationBits {
|
||||
Raw((byte) 0),
|
||||
JSON((byte) 0b1),
|
||||
Thrift((byte) 0b11),
|
||||
Custom((byte) 0b1111),
|
||||
;
|
||||
|
||||
private final byte value;
|
||||
|
||||
SerializationBits(byte b) {
|
||||
this.value = b;
|
||||
}
|
||||
|
||||
public static SerializationBits fromValue(int value) {
|
||||
for (SerializationBits type : SerializationBits.values()) {
|
||||
if (type.value == value) {
|
||||
return type;
|
||||
}
|
||||
}
|
||||
throw new IllegalArgumentException("Unknown SerializationBits value: " + value);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,115 @@
|
||||
package org.ruoyi.aihuman.protocol;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.java_websocket.client.WebSocketClient;
|
||||
import org.java_websocket.handshake.ServerHandshake;
|
||||
|
||||
import java.net.URI;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.BlockingQueue;
|
||||
import java.util.concurrent.LinkedBlockingQueue;
|
||||
|
||||
@Slf4j
|
||||
public class SpeechWebSocketClient extends WebSocketClient {
|
||||
private final BlockingQueue<Message> messageQueue = new LinkedBlockingQueue<>();
|
||||
|
||||
public SpeechWebSocketClient(URI serverUri, Map<String, String> headers) {
|
||||
super(serverUri, headers);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onOpen(ServerHandshake handshakedata) {
|
||||
log.info("WebSocket connection established, Logid: {}", handshakedata.getFieldValue("x-tt-logid"));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onMessage(String message) {
|
||||
log.warn("Received unexpected text message: {}", message);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onMessage(ByteBuffer bytes) {
|
||||
try {
|
||||
Message message = Message.unmarshal(bytes.array());
|
||||
messageQueue.put(message);
|
||||
} catch (Exception e) {
|
||||
log.error("Failed to parse message", e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClose(int code, String reason, boolean remote) {
|
||||
log.info("WebSocket connection closed: code={}, reason={}, remote={}", code, reason, remote);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(Exception ex) {
|
||||
log.error("WebSocket error", ex);
|
||||
}
|
||||
|
||||
public void sendStartConnection() throws Exception {
|
||||
Message message = new Message(MsgType.FULL_CLIENT_REQUEST, MsgTypeFlagBits.WITH_EVENT);
|
||||
message.setEvent(EventType.START_CONNECTION);
|
||||
message.setPayload("{}".getBytes());
|
||||
sendMessage(message);
|
||||
}
|
||||
|
||||
public void sendFinishConnection() throws Exception {
|
||||
Message message = new Message(MsgType.FULL_CLIENT_REQUEST, MsgTypeFlagBits.WITH_EVENT);
|
||||
message.setEvent(EventType.FINISH_CONNECTION);
|
||||
sendMessage(message);
|
||||
}
|
||||
|
||||
public void sendStartSession(byte[] payload, String sessionId) throws Exception {
|
||||
Message message = new Message(MsgType.FULL_CLIENT_REQUEST, MsgTypeFlagBits.WITH_EVENT);
|
||||
message.setEvent(EventType.START_SESSION);
|
||||
message.setSessionId(sessionId);
|
||||
message.setPayload(payload);
|
||||
sendMessage(message);
|
||||
}
|
||||
|
||||
public void sendFinishSession(String sessionId) throws Exception {
|
||||
Message message = new Message(MsgType.FULL_CLIENT_REQUEST, MsgTypeFlagBits.WITH_EVENT);
|
||||
message.setEvent(EventType.FINISH_SESSION);
|
||||
message.setSessionId(sessionId);
|
||||
message.setPayload("{}".getBytes());
|
||||
sendMessage(message);
|
||||
}
|
||||
|
||||
public void sendTaskRequest(byte[] payload, String sessionId) throws Exception {
|
||||
Message message = new Message(MsgType.FULL_CLIENT_REQUEST, MsgTypeFlagBits.WITH_EVENT);
|
||||
message.setEvent(EventType.TASK_REQUEST);
|
||||
message.setSessionId(sessionId);
|
||||
message.setPayload(payload);
|
||||
sendMessage(message);
|
||||
}
|
||||
|
||||
public void sendFullClientMessage(byte[] payload) throws Exception {
|
||||
Message message = new Message(MsgType.FULL_CLIENT_REQUEST, MsgTypeFlagBits.NO_SEQ);
|
||||
message.setPayload(payload);
|
||||
sendMessage(message);
|
||||
}
|
||||
|
||||
public void sendMessage(Message message) throws Exception {
|
||||
log.info("Send: {}", message);
|
||||
send(message.marshal());
|
||||
}
|
||||
|
||||
public Message receiveMessage() throws InterruptedException {
|
||||
Message message = messageQueue.take();
|
||||
log.info("Receive: {}", message);
|
||||
return message;
|
||||
}
|
||||
|
||||
public Message waitForMessage(MsgType type, EventType event) throws InterruptedException {
|
||||
while (true) {
|
||||
Message message = receiveMessage();
|
||||
if (message.getType() == type && message.getEvent() == event) {
|
||||
return message;
|
||||
} else {
|
||||
throw new RuntimeException("Unexpected message: " + message);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
package org.ruoyi.aihuman.protocol;
|
||||
|
||||
import lombok.Getter;
|
||||
|
||||
@Getter
|
||||
public enum VersionBits {
|
||||
Version1((byte) 1),
|
||||
Version2((byte) 2),
|
||||
Version3((byte) 3),
|
||||
Version4((byte) 4),
|
||||
;
|
||||
|
||||
private final byte value;
|
||||
|
||||
VersionBits(byte b) {
|
||||
this.value = b;
|
||||
}
|
||||
|
||||
public static VersionBits fromValue(int value) {
|
||||
for (VersionBits type : VersionBits.values()) {
|
||||
if (type.value == value) {
|
||||
return type;
|
||||
}
|
||||
}
|
||||
throw new IllegalArgumentException("Unknown VersionBits value: " + value);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,56 @@
|
||||
package org.ruoyi.aihuman.service;
|
||||
|
||||
import org.ruoyi.aihuman.domain.vo.AihumanRealConfigVo;
|
||||
import org.ruoyi.aihuman.domain.bo.AihumanRealConfigBo;
|
||||
import org.ruoyi.core.page.TableDataInfo;
|
||||
import org.ruoyi.core.page.PageQuery;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 真人交互数字人配置Service接口
|
||||
*
|
||||
* @author ageerle
|
||||
* @date Tue Oct 21 11:46:52 GMT+08:00 2025
|
||||
*/
|
||||
public interface AihumanRealConfigService {
|
||||
|
||||
/**
|
||||
* 查询真人交互数字人配置
|
||||
*/
|
||||
AihumanRealConfigVo queryById(Integer id);
|
||||
|
||||
/**
|
||||
* 查询真人交互数字人配置列表
|
||||
*/
|
||||
TableDataInfo<AihumanRealConfigVo> queryPageList(AihumanRealConfigBo bo, PageQuery pageQuery);
|
||||
|
||||
/**
|
||||
* 查询真人交互数字人配置列表
|
||||
*/
|
||||
List<AihumanRealConfigVo> queryList(AihumanRealConfigBo bo);
|
||||
|
||||
/**
|
||||
* 新增真人交互数字人配置
|
||||
*/
|
||||
Boolean insertByBo(AihumanRealConfigBo bo);
|
||||
|
||||
/**
|
||||
* 修改真人交互数字人配置
|
||||
*/
|
||||
Boolean updateByBo(AihumanRealConfigBo bo);
|
||||
|
||||
/**
|
||||
* 执行真人交互数字人配置
|
||||
*/
|
||||
Boolean runByBo(AihumanRealConfigBo bo);
|
||||
|
||||
/**
|
||||
* 校验并批量删除真人交互数字人配置信息
|
||||
*/
|
||||
Boolean deleteWithValidByIds(Collection<Integer> ids, Boolean isValid);
|
||||
|
||||
// 在AihumanRealConfigService接口中添加
|
||||
Boolean stopByBo(AihumanRealConfigBo bo);
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
package org.ruoyi.aihuman.service;
|
||||
|
||||
public interface AihumanVolcengineService {
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,4 @@
|
||||
package org.ruoyi.aihuman.service.impl;
|
||||
|
||||
public class AihumanVolcengineServiceImpl {
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
-- 菜单 SQL
|
||||
insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark)
|
||||
values(1980480880138051584, '真人交互数字人配置', '2000', '1', 'aihumanRealConfig', 'aihuman/aihumanRealConfig/index', 1, 0, 'C', '0', '0', 'aihuman:aihumanRealConfig:list', '#', 103, 1, sysdate(), null, null, '真人交互数字人配置菜单');
|
||||
|
||||
-- 按钮 SQL
|
||||
insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark)
|
||||
values(1980480880138051585, '真人交互数字人配置查询', 1980480880138051584, '1', '#', '', 1, 0, 'F', '0', '0', 'aihuman:aihumanRealConfig:query', '#', 103, 1, sysdate(), null, null, '');
|
||||
|
||||
insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark)
|
||||
values(1980480880138051586, '真人交互数字人配置新增', 1980480880138051584, '2', '#', '', 1, 0, 'F', '0', '0', 'aihuman:aihumanRealConfig:add', '#', 103, 1, sysdate(), null, null, '');
|
||||
|
||||
insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark)
|
||||
values(1980480880138051587, '真人交互数字人配置修改', 1980480880138051584, '3', '#', '', 1, 0, 'F', '0', '0', 'aihuman:aihumanRealConfig:edit', '#', 103, 1, sysdate(), null, null, '');
|
||||
|
||||
insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark)
|
||||
values(1980480880138051588, '真人交互数字人配置删除', 1980480880138051584, '4', '#', '', 1, 0, 'F', '0', '0', 'aihuman:aihumanRealConfig:remove', '#', 103, 1, sysdate(), null, null, '');
|
||||
|
||||
insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark)
|
||||
values(1980480880138051589, '真人交互数字人配置导出', 1980480880138051584, '5', '#', '', 1, 0, 'F', '0', '0', 'aihuman:aihumanRealConfig:export', '#', 103, 1, sysdate(), null, null, '');
|
||||
@@ -0,0 +1,160 @@
|
||||
package org.ruoyi.aihuman.volcengine;
|
||||
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import org.ruoyi.aihuman.protocol.EventType;
|
||||
import org.ruoyi.aihuman.protocol.Message;
|
||||
import org.ruoyi.aihuman.protocol.MsgType;
|
||||
import org.ruoyi.aihuman.protocol.SpeechWebSocketClient;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.File;
|
||||
import java.net.URI;
|
||||
import java.nio.file.Files;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.UUID;
|
||||
|
||||
@Slf4j
|
||||
public class Bidirection {
|
||||
private static final String ENDPOINT = "wss://openspeech.bytedance.com/api/v3/tts/bidirection";
|
||||
private static final ObjectMapper objectMapper = new ObjectMapper();
|
||||
|
||||
/**
|
||||
* Get resource ID based on voice type
|
||||
*
|
||||
* @param voice Voice type string
|
||||
* @return Corresponding resource ID
|
||||
*/
|
||||
public static String voiceToResourceId(String voice) {
|
||||
// Map different voice types to resource IDs based on actual needs
|
||||
if (voice.startsWith("S_")) {
|
||||
return "volc.megatts.default";
|
||||
}
|
||||
return "volc.service_type.10029";
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
// Configure parameters
|
||||
String appId = System.getProperty("appId", "1055299334");
|
||||
String accessToken = System.getProperty("accessToken", "fOHuq4R4dirMYiOruCU3Ek9q75zV0KVW");
|
||||
String resourceId = System.getProperty("resourceId", "seed-tts-2.0");
|
||||
String voice = System.getProperty("voice", "zh_female_vv_uranus_bigtts");
|
||||
String text = System.getProperty("text", "你好呀!我是AI合成的语音,很高兴认识你。");
|
||||
String encoding = System.getProperty("encoding", "mp3");
|
||||
|
||||
if (appId.isEmpty() || accessToken.isEmpty()) {
|
||||
throw new IllegalArgumentException("Please set appId and accessToken system properties");
|
||||
}
|
||||
|
||||
// Set request headers
|
||||
Map<String, String> headers = Map.of(
|
||||
"X-Api-App-Key", appId,
|
||||
"X-Api-Access-Key", accessToken,
|
||||
"X-Api-Resource-Id", resourceId.isEmpty() ? voiceToResourceId(voice) : resourceId,
|
||||
"X-Api-Connect-Id", UUID.randomUUID().toString());
|
||||
|
||||
// Create WebSocket client
|
||||
SpeechWebSocketClient client = new SpeechWebSocketClient(new URI(ENDPOINT), headers);
|
||||
try {
|
||||
client.connectBlocking();
|
||||
Map<String, Object> request = Map.of(
|
||||
"user", Map.of("uid", UUID.randomUUID().toString()),
|
||||
"namespace", "BidirectionalTTS",
|
||||
"req_params", Map.of(
|
||||
"speaker", voice,
|
||||
"audio_params", Map.of(
|
||||
"format", encoding,
|
||||
"sample_rate", 24000,
|
||||
"enable_timestamp", true),
|
||||
// additions requires a JSON string
|
||||
"additions", objectMapper.writeValueAsString(Map.of(
|
||||
"disable_markdown_filter", false))));
|
||||
|
||||
// Start connection
|
||||
client.sendStartConnection();
|
||||
// Wait for connection started
|
||||
client.waitForMessage(MsgType.FULL_SERVER_RESPONSE, EventType.CONNECTION_STARTED);
|
||||
|
||||
// Process each sentence
|
||||
String[] sentences = text.split("。");
|
||||
boolean audioReceived = false;
|
||||
for (int i = 0; i < sentences.length; i++) {
|
||||
if (sentences[i].trim().isEmpty()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
String sessionId = UUID.randomUUID().toString();
|
||||
ByteArrayOutputStream audioStream = new ByteArrayOutputStream();
|
||||
|
||||
// Start session
|
||||
Map<String, Object> startReq = Map.of(
|
||||
"user", request.get("user"),
|
||||
"namespace", request.get("namespace"),
|
||||
"req_params", request.get("req_params"),
|
||||
"event", EventType.START_SESSION.getValue());
|
||||
client.sendStartSession(objectMapper.writeValueAsBytes(startReq), sessionId);
|
||||
// Wait for session started
|
||||
client.waitForMessage(MsgType.FULL_SERVER_RESPONSE, EventType.SESSION_STARTED);
|
||||
|
||||
// Send text
|
||||
for (char c : sentences[i].toCharArray()) {
|
||||
// Create new req_params with text
|
||||
@SuppressWarnings("unchecked")
|
||||
Map<String, Object> currentReqParams = new HashMap<>(
|
||||
(Map<String, Object>) request.get("req_params"));
|
||||
currentReqParams.put("text", String.valueOf(c));
|
||||
|
||||
// Create current request
|
||||
Map<String, Object> currentRequest = Map.of(
|
||||
"user", request.get("user"),
|
||||
"namespace", request.get("namespace"),
|
||||
"req_params", currentReqParams,
|
||||
"event", EventType.TASK_REQUEST.getValue());
|
||||
|
||||
client.sendTaskRequest(objectMapper.writeValueAsBytes(currentRequest), sessionId);
|
||||
}
|
||||
|
||||
// End session
|
||||
client.sendFinishSession(sessionId);
|
||||
|
||||
// Receive response
|
||||
while (true) {
|
||||
Message msg = client.receiveMessage();
|
||||
switch (msg.getType()) {
|
||||
case FULL_SERVER_RESPONSE:
|
||||
break;
|
||||
case AUDIO_ONLY_SERVER:
|
||||
if (!audioReceived && audioStream.size() > 0) {
|
||||
audioReceived = true;
|
||||
}
|
||||
if (msg.getPayload() != null) {
|
||||
audioStream.write(msg.getPayload());
|
||||
}
|
||||
break;
|
||||
default:
|
||||
throw new RuntimeException("Unexpected message: " + msg);
|
||||
}
|
||||
if (msg.getEvent() == EventType.SESSION_FINISHED) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (audioStream.size() > 0) {
|
||||
String fileName = String.format("%s_session_%d.%s", voice, i, encoding);
|
||||
Files.write(new File(fileName).toPath(), audioStream.toByteArray());
|
||||
log.info("Audio saved to file: {}", fileName);
|
||||
}
|
||||
}
|
||||
|
||||
if (!audioReceived) {
|
||||
throw new RuntimeException("No audio data received");
|
||||
}
|
||||
|
||||
// End connection
|
||||
client.sendFinishConnection();
|
||||
} finally {
|
||||
client.closeBlocking();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<!DOCTYPE mapper
|
||||
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="org.ruoyi.aihuman.mapper.AihumanRealConfigMapper">
|
||||
|
||||
</mapper>
|
||||
@@ -3,8 +3,8 @@ gen:
|
||||
# 作者
|
||||
author: ageerle
|
||||
# 默认生成包路径 system 需改成自己的模块名称 如 system monitor tool
|
||||
packageName: org.ruoyi.system
|
||||
packageName: org.ruoyi.aihuman
|
||||
# 自动去除表前缀,默认是false
|
||||
autoRemovePre: false
|
||||
# 表前缀(生成类名不会包含表前缀,多个用逗号分隔)
|
||||
tablePrefix: sys_
|
||||
tablePrefix: aihuman_
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package org.ruoyi.graph.config;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.scheduling.annotation.EnableAsync;
|
||||
@@ -18,6 +19,7 @@ import java.util.concurrent.ThreadPoolExecutor;
|
||||
@Slf4j
|
||||
@EnableAsync
|
||||
@Configuration
|
||||
@ConditionalOnProperty(prefix = "knowledge.graph", name = "enabled", havingValue = "true")
|
||||
public class GraphAsyncConfig {
|
||||
|
||||
/**
|
||||
|
||||
@@ -4,6 +4,7 @@ import lombok.Data;
|
||||
import org.neo4j.driver.AuthTokens;
|
||||
import org.neo4j.driver.Driver;
|
||||
import org.neo4j.driver.GraphDatabase;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||
import org.springframework.boot.context.properties.ConfigurationProperties;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
@@ -16,6 +17,7 @@ import org.springframework.context.annotation.Configuration;
|
||||
*/
|
||||
@Data
|
||||
@Configuration
|
||||
@ConditionalOnProperty(prefix = "knowledge.graph", name = "enabled", havingValue = "true")
|
||||
@ConfigurationProperties(prefix = "neo4j")
|
||||
public class Neo4jConfig {
|
||||
|
||||
|
||||
@@ -11,6 +11,7 @@ import org.ruoyi.graph.domain.GraphInstance;
|
||||
import org.ruoyi.graph.enums.GraphStatusEnum;
|
||||
import org.ruoyi.graph.service.IGraphBuildTaskService;
|
||||
import org.ruoyi.graph.service.IGraphInstanceService;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
@@ -29,6 +30,7 @@ import java.util.Map;
|
||||
@RestController
|
||||
@RequestMapping("/graph/instance")
|
||||
@Tag(name = "图谱实例管理", description = "知识图谱实例的创建、查询、更新、删除")
|
||||
@ConditionalOnProperty(prefix = "knowledge.graph", name = "enabled", havingValue = "true")
|
||||
public class GraphInstanceController extends BaseController {
|
||||
|
||||
private final IGraphInstanceService graphInstanceService;
|
||||
|
||||
@@ -11,6 +11,7 @@ import org.ruoyi.graph.dto.GraphExtractionResult;
|
||||
import org.ruoyi.graph.service.IGraphExtractionService;
|
||||
import org.ruoyi.graph.service.IGraphRAGService;
|
||||
import org.ruoyi.graph.service.IGraphStoreService;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
@@ -29,6 +30,7 @@ import java.util.Map;
|
||||
@RestController
|
||||
@RequestMapping("/graph/query")
|
||||
@Tag(name = "图谱查询", description = "知识图谱查询相关接口")
|
||||
@ConditionalOnProperty(prefix = "knowledge.graph", name = "enabled", havingValue = "true")
|
||||
public class GraphQueryController extends BaseController {
|
||||
|
||||
private final IGraphStoreService graphStoreService;
|
||||
|
||||
@@ -17,6 +17,7 @@ import org.ruoyi.graph.service.IGraphBuildTaskService;
|
||||
import org.ruoyi.graph.service.IGraphInstanceService;
|
||||
import org.ruoyi.graph.service.IGraphRAGService;
|
||||
import org.ruoyi.service.IKnowledgeAttachService;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||
import org.springframework.scheduling.annotation.Async;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
@@ -36,6 +37,7 @@ import java.util.concurrent.CompletableFuture;
|
||||
@Slf4j
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
@ConditionalOnProperty(prefix = "knowledge.graph", name = "enabled", havingValue = "true")
|
||||
public class GraphBuildTaskServiceImpl implements IGraphBuildTaskService {
|
||||
|
||||
private final GraphBuildTaskMapper taskMapper;
|
||||
|
||||
@@ -13,6 +13,7 @@ import org.ruoyi.graph.prompt.GraphExtractPrompt;
|
||||
import org.ruoyi.graph.service.IGraphExtractionService;
|
||||
import org.ruoyi.graph.service.llm.IGraphLLMService;
|
||||
import org.ruoyi.service.IChatModelService;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@@ -31,6 +32,7 @@ import java.util.regex.Pattern;
|
||||
@Slf4j
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
@ConditionalOnProperty(prefix = "knowledge.graph", name = "enabled", havingValue = "true")
|
||||
public class GraphExtractionServiceImpl implements IGraphExtractionService {
|
||||
|
||||
private final IChatModelService chatModelService;
|
||||
|
||||
@@ -14,6 +14,7 @@ import org.ruoyi.graph.domain.GraphInstance;
|
||||
import org.ruoyi.graph.mapper.GraphInstanceMapper;
|
||||
import org.ruoyi.graph.service.IGraphInstanceService;
|
||||
import org.ruoyi.graph.service.IGraphStoreService;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
@@ -30,6 +31,7 @@ import java.util.Map;
|
||||
@Slf4j
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
@ConditionalOnProperty(prefix = "knowledge.graph", name = "enabled", havingValue = "true")
|
||||
public class GraphInstanceServiceImpl implements IGraphInstanceService {
|
||||
|
||||
private final GraphInstanceMapper graphInstanceMapper;
|
||||
|
||||
@@ -13,6 +13,7 @@ import org.ruoyi.graph.dto.GraphExtractionResult;
|
||||
import org.ruoyi.graph.service.IGraphExtractionService;
|
||||
import org.ruoyi.graph.service.IGraphRAGService;
|
||||
import org.ruoyi.graph.service.IGraphStoreService;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.*;
|
||||
@@ -26,6 +27,7 @@ import java.util.*;
|
||||
@Slf4j
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
@ConditionalOnProperty(prefix = "knowledge.graph", name = "enabled", havingValue = "true")
|
||||
public class GraphRAGServiceImpl implements IGraphRAGService {
|
||||
|
||||
private final IGraphExtractionService graphExtractionService;
|
||||
|
||||
@@ -13,6 +13,7 @@ import org.ruoyi.graph.config.GraphProperties;
|
||||
import org.ruoyi.graph.domain.GraphEdge;
|
||||
import org.ruoyi.graph.domain.GraphVertex;
|
||||
import org.ruoyi.graph.service.IGraphStoreService;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.*;
|
||||
@@ -30,6 +31,7 @@ import static org.neo4j.driver.Values.parameters;
|
||||
@Slf4j
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
@ConditionalOnProperty(prefix = "knowledge.graph", name = "enabled", havingValue = "true")
|
||||
public class GraphStoreServiceImpl implements IGraphStoreService {
|
||||
|
||||
private final Driver neo4jDriver;
|
||||
|
||||
@@ -6,6 +6,7 @@ import org.neo4j.driver.Record;
|
||||
import org.neo4j.driver.Result;
|
||||
import org.neo4j.driver.Session;
|
||||
import org.neo4j.driver.types.Node;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.util.HashMap;
|
||||
@@ -21,6 +22,7 @@ import static org.neo4j.driver.Values.parameters;
|
||||
*/
|
||||
@Slf4j
|
||||
@Component
|
||||
@ConditionalOnProperty(prefix = "knowledge.graph", name = "enabled", havingValue = "true")
|
||||
public class Neo4jTestUtil {
|
||||
|
||||
private final Driver driver;
|
||||
|
||||
@@ -1,274 +0,0 @@
|
||||
-- =============================================
|
||||
-- 知识图谱菜单配置SQL
|
||||
-- 执行此脚本后,图谱管理菜单将显示在系统中
|
||||
-- =============================================
|
||||
|
||||
-- 注意:请根据实际情况修改以下内容:
|
||||
-- 1. parent_id: 运营管理的菜单ID(需要先查询获取)
|
||||
-- 2. order_num: 菜单排序号
|
||||
-- 3. create_by: 创建人
|
||||
|
||||
-- =============================================
|
||||
-- 第一步:查询运营管理的菜单ID
|
||||
-- =============================================
|
||||
-- SELECT menu_id FROM sys_menu WHERE menu_name = '运营管理' AND parent_id = 0;
|
||||
-- 假设查询结果为: 2000(请根据实际情况修改)
|
||||
|
||||
SET @operator_menu_id = (SELECT menu_id FROM sys_menu WHERE menu_name = '运营管理' AND parent_id = 0 LIMIT 1);
|
||||
|
||||
-- =============================================
|
||||
-- 第二步:插入图谱管理目录
|
||||
-- =============================================
|
||||
INSERT INTO sys_menu (
|
||||
menu_id,
|
||||
menu_name,
|
||||
parent_id,
|
||||
order_num,
|
||||
path,
|
||||
component,
|
||||
is_frame,
|
||||
is_cache,
|
||||
menu_type,
|
||||
visible,
|
||||
status,
|
||||
perms,
|
||||
icon,
|
||||
create_dept,
|
||||
create_by,
|
||||
create_time,
|
||||
update_by,
|
||||
update_time,
|
||||
remark
|
||||
) VALUES (
|
||||
1950000000000000001, -- 菜单ID(使用雪花ID规则)
|
||||
'图谱管理', -- 菜单名称
|
||||
@operator_menu_id, -- 父菜单ID(运营管理)
|
||||
15, -- 排序号(在知识库管理之后)
|
||||
'graph', -- 路由地址
|
||||
NULL, -- 组件路径(目录为空)
|
||||
1, -- 是否外链(0否 1是)
|
||||
0, -- 是否缓存(0缓存 1不缓存)
|
||||
'M', -- 菜单类型(M目录 C菜单 F按钮)
|
||||
'0', -- 显示状态(0显示 1隐藏)
|
||||
'0', -- 菜单状态(0正常 1停用)
|
||||
NULL, -- 权限标识
|
||||
'carbon:chart-relationship', -- 菜单图标
|
||||
103, -- 创建部门
|
||||
1, -- 创建者(用户ID)
|
||||
NOW(), -- 创建时间
|
||||
1, -- 更新者(用户ID)
|
||||
NOW(), -- 更新时间
|
||||
'知识图谱管理目录' -- 备注
|
||||
);
|
||||
|
||||
-- 设置图谱管理目录ID
|
||||
SET @graph_menu_id = 1950000000000000001;
|
||||
|
||||
-- =============================================
|
||||
-- 第三步:插入图谱实例管理菜单
|
||||
-- =============================================
|
||||
INSERT INTO sys_menu (
|
||||
menu_id,
|
||||
menu_name,
|
||||
parent_id,
|
||||
order_num,
|
||||
path,
|
||||
component,
|
||||
is_frame,
|
||||
is_cache,
|
||||
menu_type,
|
||||
visible,
|
||||
status,
|
||||
perms,
|
||||
icon,
|
||||
create_dept,
|
||||
create_by,
|
||||
create_time,
|
||||
update_by,
|
||||
update_time,
|
||||
remark
|
||||
) VALUES (
|
||||
1950000000000000002, -- 菜单ID
|
||||
'图谱实例', -- 菜单名称
|
||||
@graph_menu_id, -- 父菜单ID(图谱管理)
|
||||
1, -- 排序号
|
||||
'graphInstance', -- 路由地址
|
||||
'operator/graphInstance/index', -- 组件路径
|
||||
1, -- 是否外链
|
||||
0, -- 是否缓存
|
||||
'C', -- 菜单类型
|
||||
'0', -- 显示状态
|
||||
'0', -- 菜单状态
|
||||
'operator:graph:list', -- 权限标识
|
||||
'ant-design:node-index-outlined', -- 菜单图标
|
||||
103, -- 创建部门
|
||||
1, -- 创建者(用户ID)
|
||||
NOW(), -- 创建时间
|
||||
1, -- 更新者(用户ID)
|
||||
NOW(), -- 更新时间
|
||||
'图谱实例管理菜单' -- 备注
|
||||
);
|
||||
|
||||
-- 设置图谱实例菜单ID
|
||||
SET @graph_instance_menu_id = 1950000000000000002;
|
||||
|
||||
-- =============================================
|
||||
-- 第四步:插入图谱实例管理的按钮权限
|
||||
-- =============================================
|
||||
|
||||
-- 查询按钮
|
||||
INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, remark)
|
||||
VALUES (1950000000000000003, '图谱实例查询', @graph_instance_menu_id, 1, '#', '', 1, 0, 'F', '0', '0', 'operator:graph:query', '#', 103, 1, NOW(), '');
|
||||
|
||||
-- 新增按钮
|
||||
INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, remark)
|
||||
VALUES (1950000000000000004, '图谱实例新增', @graph_instance_menu_id, 2, '#', '', 1, 0, 'F', '0', '0', 'operator:graph:add', '#', 103, 1, NOW(), '');
|
||||
|
||||
-- 编辑按钮
|
||||
INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, remark)
|
||||
VALUES (1950000000000000005, '图谱实例编辑', @graph_instance_menu_id, 3, '#', '', 1, 0, 'F', '0', '0', 'operator:graph:edit', '#', 103, 1, NOW(), '');
|
||||
|
||||
-- 删除按钮
|
||||
INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, remark)
|
||||
VALUES (1950000000000000006, '图谱实例删除', @graph_instance_menu_id, 4, '#', '', 1, 0, 'F', '0', '0', 'operator:graph:remove', '#', 103, 1, NOW(), '');
|
||||
|
||||
-- 导出按钮
|
||||
INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, remark)
|
||||
VALUES (1950000000000000007, '图谱实例导出', @graph_instance_menu_id, 5, '#', '', 1, 0, 'F', '0', '0', 'operator:graph:export', '#', 103, 1, NOW(), '');
|
||||
|
||||
-- 构建按钮
|
||||
INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, remark)
|
||||
VALUES (1950000000000000008, '图谱构建', @graph_instance_menu_id, 6, '#', '', 1, 0, 'F', '0', '0', 'operator:graph:build', '#', 103, 1, NOW(), '');
|
||||
|
||||
-- 重建按钮
|
||||
INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, remark)
|
||||
VALUES (1950000000000000009, '图谱重建', @graph_instance_menu_id, 7, '#', '', 1, 0, 'F', '0', '0', 'operator:graph:rebuild', '#', 103, 1, NOW(), '');
|
||||
|
||||
-- =============================================
|
||||
-- 第五步:插入图谱可视化菜单
|
||||
-- =============================================
|
||||
INSERT INTO sys_menu (
|
||||
menu_id,
|
||||
menu_name,
|
||||
parent_id,
|
||||
order_num,
|
||||
path,
|
||||
component,
|
||||
is_frame,
|
||||
is_cache,
|
||||
menu_type,
|
||||
visible,
|
||||
status,
|
||||
perms,
|
||||
icon,
|
||||
create_dept,
|
||||
create_by,
|
||||
create_time,
|
||||
update_by,
|
||||
update_time,
|
||||
remark
|
||||
) VALUES (
|
||||
1950000000000000010, -- 菜单ID
|
||||
'图谱可视化', -- 菜单名称
|
||||
@graph_menu_id, -- 父菜单ID(图谱管理)
|
||||
2, -- 排序号
|
||||
'graphVisualization', -- 路由地址
|
||||
'operator/graphVisualization/index', -- 组件路径
|
||||
1, -- 是否外链
|
||||
0, -- 是否缓存
|
||||
'C', -- 菜单类型
|
||||
'0', -- 显示状态
|
||||
'0', -- 菜单状态
|
||||
'operator:graph:view', -- 权限标识
|
||||
'carbon:chart-network', -- 菜单图标
|
||||
103, -- 创建部门
|
||||
1, -- 创建者(用户ID)
|
||||
NOW(), -- 创建时间
|
||||
1, -- 更新者(用户ID)
|
||||
NOW(), -- 更新时间
|
||||
'图谱可视化菜单' -- 备注
|
||||
);
|
||||
|
||||
-- =============================================
|
||||
-- 第六步:插入图谱检索测试菜单
|
||||
-- =============================================
|
||||
INSERT INTO sys_menu (
|
||||
menu_id,
|
||||
menu_name,
|
||||
parent_id,
|
||||
order_num,
|
||||
path,
|
||||
component,
|
||||
is_frame,
|
||||
is_cache,
|
||||
menu_type,
|
||||
visible,
|
||||
status,
|
||||
perms,
|
||||
icon,
|
||||
create_dept,
|
||||
create_by,
|
||||
create_time,
|
||||
update_by,
|
||||
update_time,
|
||||
remark
|
||||
) VALUES (
|
||||
1950000000000000011, -- 菜单ID
|
||||
'图谱检索测试', -- 菜单名称
|
||||
@graph_menu_id, -- 父菜单ID(图谱管理)
|
||||
3, -- 排序号
|
||||
'graphRAG', -- 路由地址
|
||||
'operator/graphRAG/index', -- 组件路径
|
||||
1, -- 是否外链
|
||||
0, -- 是否缓存
|
||||
'C', -- 菜单类型
|
||||
'0', -- 显示状态
|
||||
'0', -- 菜单状态
|
||||
'operator:graph:retrieve', -- 权限标识
|
||||
'carbon:search-advanced', -- 菜单图标
|
||||
103, -- 创建部门
|
||||
1, -- 创建者(用户ID)
|
||||
NOW(), -- 创建时间
|
||||
1, -- 更新者(用户ID)
|
||||
NOW(), -- 更新时间
|
||||
'图谱检索测试菜单' -- 备注
|
||||
);
|
||||
|
||||
-- 设置图谱检索测试菜单ID
|
||||
SET @graph_rag_menu_id = 1950000000000000011;
|
||||
|
||||
-- =============================================
|
||||
-- 第七步:插入图谱检索测试的按钮权限
|
||||
-- =============================================
|
||||
|
||||
-- 实体抽取按钮
|
||||
INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, remark)
|
||||
VALUES (1950000000000000012, '实体抽取', @graph_rag_menu_id, 1, '#', '', 1, 0, 'F', '0', '0', 'operator:graph:extract', '#', 103, 1, NOW(), '');
|
||||
|
||||
-- 文本入库按钮
|
||||
INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, remark)
|
||||
VALUES (1950000000000000013, '文本入库', @graph_rag_menu_id, 2, '#', '', 1, 0, 'F', '0', '0', 'operator:graph:ingest', '#', 103, 1, NOW(), '');
|
||||
|
||||
-- =============================================
|
||||
-- 完成提示
|
||||
-- =============================================
|
||||
SELECT '图谱管理菜单配置完成!' AS message;
|
||||
SELECT '请刷新浏览器页面,菜单将显示在"运营管理"下' AS tip;
|
||||
|
||||
-- =============================================
|
||||
-- 查询结果验证
|
||||
-- =============================================
|
||||
SELECT
|
||||
m1.menu_name AS '一级菜单',
|
||||
m2.menu_name AS '二级菜单',
|
||||
m3.menu_name AS '三级菜单/按钮',
|
||||
m3.perms AS '权限标识',
|
||||
m3.path AS '路由地址',
|
||||
m3.component AS '组件路径'
|
||||
FROM sys_menu m1
|
||||
LEFT JOIN sys_menu m2 ON m2.parent_id = m1.menu_id
|
||||
LEFT JOIN sys_menu m3 ON m3.parent_id = m2.menu_id
|
||||
WHERE m1.menu_name = '运营管理'
|
||||
AND m2.menu_name = '图谱管理'
|
||||
ORDER BY m2.order_num, m3.order_num;
|
||||
|
||||
@@ -1,204 +0,0 @@
|
||||
-- ========================================
|
||||
-- RuoYi AI 知识图谱数据库表结构
|
||||
-- ========================================
|
||||
-- 创建时间: 2025-09-30
|
||||
-- 说明: 知识图谱功能的MySQL表结构
|
||||
-- ========================================
|
||||
|
||||
SET NAMES utf8mb4;
|
||||
SET FOREIGN_KEY_CHECKS = 0;
|
||||
|
||||
-- ----------------------------
|
||||
-- 1. 知识图谱实例表
|
||||
-- ----------------------------
|
||||
DROP TABLE IF EXISTS `knowledge_graph_instance`;
|
||||
CREATE TABLE `knowledge_graph_instance` (
|
||||
`id` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||||
`graph_uuid` VARCHAR(32) NOT NULL COMMENT '图谱UUID',
|
||||
`knowledge_id` VARCHAR(50) NOT NULL COMMENT '关联knowledge_info.kid',
|
||||
`graph_name` VARCHAR(100) NOT NULL COMMENT '图谱名称',
|
||||
`graph_status` TINYINT(2) DEFAULT 10 COMMENT '构建状态:10构建中、20已完成、30失败',
|
||||
`node_count` INT(11) DEFAULT 0 COMMENT '节点数量',
|
||||
`relationship_count` INT(11) DEFAULT 0 COMMENT '关系数量',
|
||||
`config` JSON COMMENT '图谱配置(JSON格式)',
|
||||
`model_name` VARCHAR(100) DEFAULT NULL COMMENT 'LLM模型名称',
|
||||
`entity_types` VARCHAR(500) DEFAULT NULL COMMENT '实体类型(逗号分隔)',
|
||||
`relation_types` VARCHAR(500) DEFAULT NULL COMMENT '关系类型(逗号分隔)',
|
||||
`error_message` TEXT COMMENT '错误信息',
|
||||
`create_dept` BIGINT(20) DEFAULT NULL COMMENT '创建部门',
|
||||
`create_by` VARCHAR(64) DEFAULT '' COMMENT '创建者',
|
||||
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_by` VARCHAR(64) DEFAULT '' COMMENT '更新者',
|
||||
`update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`remark` VARCHAR(500) DEFAULT NULL COMMENT '备注',
|
||||
`del_flag` CHAR(1) DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)',
|
||||
PRIMARY KEY (`id`) USING BTREE,
|
||||
UNIQUE KEY `uk_graph_uuid` (`graph_uuid`) USING BTREE,
|
||||
KEY `idx_knowledge_id` (`knowledge_id`) USING BTREE,
|
||||
KEY `idx_graph_status` (`graph_status`) USING BTREE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='知识图谱实例表';
|
||||
|
||||
-- ----------------------------
|
||||
-- 2. 实体类型定义表
|
||||
-- ----------------------------
|
||||
DROP TABLE IF EXISTS `graph_entity_type`;
|
||||
CREATE TABLE `graph_entity_type` (
|
||||
`id` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||||
`type_name` VARCHAR(50) NOT NULL COMMENT '实体类型名称',
|
||||
`type_code` VARCHAR(20) NOT NULL COMMENT '类型编码',
|
||||
`description` VARCHAR(200) DEFAULT NULL COMMENT '描述',
|
||||
`color` VARCHAR(10) DEFAULT '#1890ff' COMMENT '可视化颜色',
|
||||
`icon` VARCHAR(50) DEFAULT NULL COMMENT '图标',
|
||||
`sort` INT(4) DEFAULT 0 COMMENT '显示顺序',
|
||||
`is_enable` TINYINT(1) DEFAULT 1 COMMENT '是否启用(0否 1是)',
|
||||
`create_by` VARCHAR(64) DEFAULT '' COMMENT '创建者',
|
||||
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_by` VARCHAR(64) DEFAULT '' COMMENT '更新者',
|
||||
`update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`remark` VARCHAR(500) DEFAULT NULL COMMENT '备注',
|
||||
PRIMARY KEY (`id`) USING BTREE,
|
||||
UNIQUE KEY `uk_type_code` (`type_code`) USING BTREE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='图谱实体类型定义表';
|
||||
|
||||
-- ----------------------------
|
||||
-- 3. 关系类型定义表
|
||||
-- ----------------------------
|
||||
DROP TABLE IF EXISTS `graph_relation_type`;
|
||||
CREATE TABLE `graph_relation_type` (
|
||||
`id` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||||
`relation_name` VARCHAR(50) NOT NULL COMMENT '关系名称',
|
||||
`relation_code` VARCHAR(20) NOT NULL COMMENT '关系编码',
|
||||
`description` VARCHAR(200) DEFAULT NULL COMMENT '描述',
|
||||
`direction` TINYINT(1) DEFAULT 1 COMMENT '关系方向:0双向、1单向',
|
||||
`style` JSON COMMENT '可视化样式(JSON格式)',
|
||||
`sort` INT(4) DEFAULT 0 COMMENT '显示顺序',
|
||||
`is_enable` TINYINT(1) DEFAULT 1 COMMENT '是否启用(0否 1是)',
|
||||
`create_by` VARCHAR(64) DEFAULT '' COMMENT '创建者',
|
||||
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_by` VARCHAR(64) DEFAULT '' COMMENT '更新者',
|
||||
`update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`remark` VARCHAR(500) DEFAULT NULL COMMENT '备注',
|
||||
PRIMARY KEY (`id`) USING BTREE,
|
||||
UNIQUE KEY `uk_relation_code` (`relation_code`) USING BTREE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='图谱关系类型定义表';
|
||||
|
||||
-- ----------------------------
|
||||
-- 4. 图谱构建任务表
|
||||
-- ----------------------------
|
||||
DROP TABLE IF EXISTS `graph_build_task`;
|
||||
CREATE TABLE `graph_build_task` (
|
||||
`id` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||||
`task_uuid` VARCHAR(32) NOT NULL COMMENT '任务UUID',
|
||||
`graph_uuid` VARCHAR(32) NOT NULL COMMENT '图谱UUID',
|
||||
`knowledge_id` VARCHAR(50) NOT NULL COMMENT '知识库ID',
|
||||
`doc_id` VARCHAR(50) DEFAULT NULL COMMENT '文档ID(可选,null表示全量构建)',
|
||||
`task_type` TINYINT(2) DEFAULT 1 COMMENT '任务类型:1全量构建、2增量更新、3重建',
|
||||
`task_status` TINYINT(2) DEFAULT 1 COMMENT '任务状态:1待执行、2执行中、3成功、4失败',
|
||||
`progress` INT(3) DEFAULT 0 COMMENT '进度百分比(0-100)',
|
||||
`total_docs` INT(11) DEFAULT 0 COMMENT '总文档数',
|
||||
`processed_docs` INT(11) DEFAULT 0 COMMENT '已处理文档数',
|
||||
`extracted_entities` INT(11) DEFAULT 0 COMMENT '提取的实体数',
|
||||
`extracted_relations` INT(11) DEFAULT 0 COMMENT '提取的关系数',
|
||||
`error_message` TEXT COMMENT '错误信息',
|
||||
`result_summary` JSON COMMENT '结果摘要(JSON格式)',
|
||||
`start_time` DATETIME DEFAULT NULL COMMENT '开始时间',
|
||||
`end_time` DATETIME DEFAULT NULL COMMENT '结束时间',
|
||||
`create_dept` BIGINT(20) DEFAULT NULL COMMENT '创建部门',
|
||||
`create_by` VARCHAR(64) DEFAULT '' COMMENT '创建者',
|
||||
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_by` VARCHAR(64) DEFAULT '' COMMENT '更新者',
|
||||
`update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
PRIMARY KEY (`id`) USING BTREE,
|
||||
UNIQUE KEY `uk_task_uuid` (`task_uuid`) USING BTREE,
|
||||
KEY `idx_graph_uuid` (`graph_uuid`) USING BTREE,
|
||||
KEY `idx_knowledge_id` (`knowledge_id`) USING BTREE,
|
||||
KEY `idx_task_status` (`task_status`) USING BTREE,
|
||||
KEY `idx_create_time` (`create_time`) USING BTREE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='图谱构建任务表';
|
||||
|
||||
-- ----------------------------
|
||||
-- 5. 图谱查询历史表
|
||||
-- ----------------------------
|
||||
DROP TABLE IF EXISTS `graph_query_history`;
|
||||
CREATE TABLE `graph_query_history` (
|
||||
`id` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||||
`query_uuid` VARCHAR(32) NOT NULL COMMENT '查询UUID',
|
||||
`user_id` BIGINT(20) NOT NULL COMMENT '用户ID',
|
||||
`knowledge_id` VARCHAR(50) DEFAULT NULL COMMENT '知识库ID',
|
||||
`graph_uuid` VARCHAR(32) DEFAULT NULL COMMENT '图谱UUID',
|
||||
`query_text` TEXT NOT NULL COMMENT '查询文本',
|
||||
`query_type` TINYINT(2) DEFAULT 1 COMMENT '查询类型:1实体查询、2关系查询、3路径查询、4混合查询',
|
||||
`cypher_query` TEXT COMMENT '生成的Cypher查询',
|
||||
`result_count` INT(11) DEFAULT 0 COMMENT '结果数量',
|
||||
`response_time` INT(11) DEFAULT 0 COMMENT '响应时间(ms)',
|
||||
`is_success` TINYINT(1) DEFAULT 1 COMMENT '是否成功(0否 1是)',
|
||||
`error_message` TEXT COMMENT '错误信息',
|
||||
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
PRIMARY KEY (`id`) USING BTREE,
|
||||
UNIQUE KEY `uk_query_uuid` (`query_uuid`) USING BTREE,
|
||||
KEY `idx_user_id` (`user_id`) USING BTREE,
|
||||
KEY `idx_knowledge_id` (`knowledge_id`) USING BTREE,
|
||||
KEY `idx_create_time` (`create_time`) USING BTREE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='图谱查询历史表';
|
||||
|
||||
-- ----------------------------
|
||||
-- 6. 图谱统计信息表
|
||||
-- ----------------------------
|
||||
DROP TABLE IF EXISTS `graph_statistics`;
|
||||
CREATE TABLE `graph_statistics` (
|
||||
`id` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||||
`graph_uuid` VARCHAR(32) NOT NULL COMMENT '图谱UUID',
|
||||
`stat_date` DATE NOT NULL COMMENT '统计日期',
|
||||
`total_nodes` INT(11) DEFAULT 0 COMMENT '总节点数',
|
||||
`total_relationships` INT(11) DEFAULT 0 COMMENT '总关系数',
|
||||
`node_type_distribution` JSON COMMENT '节点类型分布(JSON格式)',
|
||||
`relation_type_distribution` JSON COMMENT '关系类型分布(JSON格式)',
|
||||
`query_count` INT(11) DEFAULT 0 COMMENT '查询次数',
|
||||
`avg_query_time` INT(11) DEFAULT 0 COMMENT '平均查询时间(ms)',
|
||||
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
PRIMARY KEY (`id`) USING BTREE,
|
||||
UNIQUE KEY `uk_graph_date` (`graph_uuid`, `stat_date`) USING BTREE,
|
||||
KEY `idx_stat_date` (`stat_date`) USING BTREE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='图谱统计信息表';
|
||||
|
||||
-- ----------------------------
|
||||
-- 初始化基础数据:实体类型
|
||||
-- ----------------------------
|
||||
INSERT INTO `graph_entity_type` (`type_name`, `type_code`, `description`, `color`, `icon`, `sort`) VALUES
|
||||
('人物', 'PERSON', '人物实体,包括真实人物和虚拟角色', '#1890ff', 'user', 1),
|
||||
('机构', 'ORGANIZATION', '组织机构,包括公司、政府机构等', '#52c41a', 'bank', 2),
|
||||
('地点', 'LOCATION', '地理位置,包括国家、城市、地址等', '#fa8c16', 'environment', 3),
|
||||
('概念', 'CONCEPT', '抽象概念,包括理论、方法等', '#722ed1', 'bulb', 4),
|
||||
('事件', 'EVENT', '事件记录,包括历史事件、活动等', '#eb2f96', 'calendar', 5),
|
||||
('产品', 'PRODUCT', '产品或服务', '#13c2c2', 'shopping', 6),
|
||||
('技术', 'TECHNOLOGY', '技术或工具', '#2f54eb', 'tool', 7),
|
||||
('文档', 'DOCUMENT', '文档或资料', '#faad14', 'file-text', 8);
|
||||
|
||||
-- ----------------------------
|
||||
-- 初始化基础数据:关系类型
|
||||
-- ----------------------------
|
||||
INSERT INTO `graph_relation_type` (`relation_name`, `relation_code`, `description`, `direction`, `sort`) VALUES
|
||||
('属于', 'BELONGS_TO', '隶属关系,表示从属或归属', 1, 1),
|
||||
('位于', 'LOCATED_IN', '地理位置关系', 1, 2),
|
||||
('相关', 'RELATED_TO', '一般关联关系', 0, 3),
|
||||
('导致', 'CAUSES', '因果关系', 1, 4),
|
||||
('包含', 'CONTAINS', '包含关系', 1, 5),
|
||||
('提及', 'MENTIONS', '文档提及实体的关系', 1, 6),
|
||||
('部分', 'PART_OF', '部分关系', 1, 7),
|
||||
('实例', 'INSTANCE_OF', '实例关系', 1, 8),
|
||||
('相似', 'SIMILAR_TO', '相似关系', 0, 9),
|
||||
('前序', 'PRECEDES', '时序关系', 1, 10),
|
||||
('工作于', 'WORKS_AT', '人物与机构的工作关系', 1, 11),
|
||||
('创建', 'CREATED_BY', '创建关系', 1, 12),
|
||||
('使用', 'USES', '使用关系', 1, 13);
|
||||
|
||||
SET FOREIGN_KEY_CHECKS = 1;
|
||||
|
||||
-- ----------------------------
|
||||
-- 完成
|
||||
-- ----------------------------
|
||||
-- 知识图谱数据库表结构创建完成
|
||||
-- 请执行以下命令应用到数据库:
|
||||
-- mysql -u root -p ruoyi-ai < knowledge_graph_schema.sql
|
||||
-- ----------------------------
|
||||
@@ -1,28 +0,0 @@
|
||||
-- 知识图谱片段表
|
||||
-- 用于记录从文档中抽取图谱时的文本片段信息
|
||||
CREATE TABLE IF NOT EXISTS `knowledge_base_graph_segment` (
|
||||
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
|
||||
`uuid` VARCHAR(64) NOT NULL COMMENT '片段UUID',
|
||||
`kb_uuid` VARCHAR(64) NOT NULL COMMENT '知识库UUID',
|
||||
`kb_item_uuid` VARCHAR(64) COMMENT '知识库条目UUID',
|
||||
`doc_uuid` VARCHAR(64) COMMENT '文档UUID',
|
||||
`segment_text` TEXT COMMENT '片段文本内容',
|
||||
`chunk_index` INT DEFAULT 0 COMMENT '片段索引(第几个片段)',
|
||||
`total_chunks` INT DEFAULT 1 COMMENT '总片段数',
|
||||
`extraction_status` TINYINT DEFAULT 0 COMMENT '抽取状态:0-待处理 1-处理中 2-已完成 3-失败',
|
||||
`entity_count` INT DEFAULT 0 COMMENT '抽取的实体数量',
|
||||
`relation_count` INT DEFAULT 0 COMMENT '抽取的关系数量',
|
||||
`token_used` INT DEFAULT 0 COMMENT '消耗的token数',
|
||||
`error_message` VARCHAR(500) COMMENT '错误信息',
|
||||
`user_id` BIGINT COMMENT '用户ID',
|
||||
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`remark` VARCHAR(500) COMMENT '备注',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_uuid` (`uuid`),
|
||||
KEY `idx_kb_uuid` (`kb_uuid`),
|
||||
KEY `idx_kb_item_uuid` (`kb_item_uuid`),
|
||||
KEY `idx_doc_uuid` (`doc_uuid`),
|
||||
KEY `idx_user_id` (`user_id`),
|
||||
KEY `idx_create_time` (`create_time`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='知识图谱片段表';
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,136 +0,0 @@
|
||||
CREATE TABLE `t_workflow`
|
||||
(
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
|
||||
`uuid` varchar(32) NOT NULL DEFAULT 'uuid',
|
||||
`title` varchar(100) NOT NULL DEFAULT '标题',
|
||||
`user_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '用户ID',
|
||||
`is_public` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否公开',
|
||||
`is_enable` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否启用',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`remark` text COMMENT '备注',
|
||||
`is_deleted` tinyint(1) NOT NULL DEFAULT '0' COMMENT '逻辑删除 默认0不删除',
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=119 DEFAULT CHARSET=utf8mb4 COMMENT='工作流定义(用户定义的工作流)| Workflow Definition';
|
||||
|
||||
|
||||
|
||||
CREATE TABLE `t_workflow_node`
|
||||
(
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||||
`uuid` varchar(32) NOT NULL DEFAULT '' COMMENT '节点唯一标识',
|
||||
`workflow_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '所属工作流定义 id',
|
||||
`workflow_component_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '引用的组件 id',
|
||||
`user_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '创建人',
|
||||
`title` varchar(100) NOT NULL DEFAULT '' COMMENT '节点标题',
|
||||
`remark` varchar(500) NOT NULL DEFAULT '' COMMENT '节点备注',
|
||||
`input_config` json NOT NULL COMMENT '输入参数模板,例:{"params":[{"name":"user_define_param01","type":"string"}]}',
|
||||
`node_config` json DEFAULT NULL COMMENT '节点执行配置,例:{"params":[{"prompt":"Summarize the following content:{user_define_param01}"}]}',
|
||||
`position_x` double NOT NULL DEFAULT '0' COMMENT '画布 x 坐标',
|
||||
`position_y` double NOT NULL DEFAULT '0' COMMENT '画布 y 坐标',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`is_deleted` tinyint(1) NOT NULL DEFAULT '0' COMMENT '逻辑删除:0 正常,1 已删',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_workflow_node_workflow_id` (`workflow_id`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=269 DEFAULT CHARSET=utf8mb4 COMMENT='工作流定义的节点 | Node of Workflow Definition';
|
||||
|
||||
|
||||
|
||||
CREATE TABLE `t_workflow_runtime_node`
|
||||
(
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||||
`uuid` varchar(32) NOT NULL DEFAULT '' COMMENT '节点运行实例唯一标识',
|
||||
`user_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '创建人',
|
||||
`workflow_runtime_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '所属运行实例 id',
|
||||
`node_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '对应工作流定义里的节点 id',
|
||||
`input` json DEFAULT NULL COMMENT '节点本次输入数据',
|
||||
`output` json DEFAULT NULL COMMENT '节点本次输出数据',
|
||||
`status` smallint(6) NOT NULL DEFAULT '1' COMMENT '节点执行状态:1 进行中,2 失败,3 成功',
|
||||
`status_remark` varchar(250) NOT NULL DEFAULT '' COMMENT '状态补充说明,如失败堆栈',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`is_deleted` tinyint(1) NOT NULL DEFAULT '0' COMMENT '逻辑删除:0 正常,1 已删',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_runtime_node_runtime_id` (`workflow_runtime_id`),
|
||||
KEY `idx_runtime_node_node_id` (`node_id`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=805 DEFAULT CHARSET=utf8mb4 COMMENT='工作流实例(运行时)- 节点 | Workflow Runtime Node';
|
||||
|
||||
|
||||
|
||||
CREATE TABLE `t_workflow_edge`
|
||||
(
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||||
`uuid` varchar(32) NOT NULL DEFAULT '' COMMENT '边唯一标识',
|
||||
`workflow_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '所属工作流定义 id',
|
||||
`source_node_uuid` varchar(32) NOT NULL DEFAULT '' COMMENT '起始节点 uuid',
|
||||
`source_handle` varchar(32) NOT NULL DEFAULT '' COMMENT '起始锚点标识',
|
||||
`target_node_uuid` varchar(32) NOT NULL DEFAULT '' COMMENT '目标节点 uuid',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`is_deleted` tinyint(1) NOT NULL DEFAULT '0' COMMENT '逻辑删除:0 正常,1 已删',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_workflow_edge_workflow_id` (`workflow_id`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=199 DEFAULT CHARSET=utf8mb4 COMMENT='工作流定义的边 | Edge of Workflow Definition';
|
||||
|
||||
|
||||
|
||||
CREATE TABLE `t_workflow_component`
|
||||
(
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||
`uuid` varchar(32) NOT NULL DEFAULT '',
|
||||
`name` varchar(32) NOT NULL DEFAULT '',
|
||||
`title` varchar(100) NOT NULL DEFAULT '',
|
||||
`remark` text NOT NULL,
|
||||
`display_order` int(11) NOT NULL DEFAULT '0',
|
||||
`is_enable` tinyint(1) NOT NULL DEFAULT '0',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`is_deleted` tinyint(1) NOT NULL DEFAULT '0',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_display_order` (`display_order`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8mb4 COMMENT='工作流组件库 | Workflow Component';
|
||||
|
||||
|
||||
CREATE TABLE `t_workflow_runtime`
|
||||
(
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||||
`uuid` varchar(32) NOT NULL DEFAULT '' COMMENT '运行实例唯一标识',
|
||||
`user_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '启动人',
|
||||
`workflow_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '对应工作流定义 id',
|
||||
`input` json DEFAULT NULL COMMENT '运行输入,例:{"userInput01":"text01","userInput02":true,"userInput03":10,"userInput04":["selectedA","selectedB"],"userInput05":["https://a.com/a.xlsx","https://a.com/b.png"]}',
|
||||
`output` json DEFAULT NULL COMMENT '运行输出,成功或失败的结果',
|
||||
`status` smallint(6) NOT NULL DEFAULT '1' COMMENT '执行状态:1 就绪,2 执行中,3 成功,4 失败',
|
||||
`status_remark` varchar(250) NOT NULL DEFAULT '' COMMENT '状态补充说明,如失败原因',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`is_deleted` tinyint(1) NOT NULL DEFAULT '0' COMMENT '逻辑删除:0 正常,1 已删',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_workflow_runtime_workflow_id` (`workflow_id`),
|
||||
KEY `idx_workflow_runtime_user_id` (`user_id`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=297 DEFAULT CHARSET=utf8mb4 COMMENT='工作流实例(运行时)| Workflow Runtime';
|
||||
|
||||
|
||||
-- workflow
|
||||
-- 如果不定义输入的变量名,则默认设置为input
|
||||
-- 如果不定义输出的变量名,则默认设置为output
|
||||
insert into t_workflow_component(uuid, name, title, remark, is_enable)
|
||||
values (replace(uuid(), '-', ''), 'Start', '开始', '流程由此开始', true);
|
||||
insert into t_workflow_component(uuid, name, title, remark, is_enable)
|
||||
values (replace(uuid(), '-', ''), 'End', '结束', '流程由此结束', true);
|
||||
insert into t_workflow_component(uuid, name, title, remark, is_enable)
|
||||
values (replace(uuid(), '-', ''), 'Answer', '生成回答', '调用大语言模型回答问题', true);
|
||||
|
||||
|
||||
|
||||
INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, path, component, query_param, is_frame, is_cache,
|
||||
menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by,
|
||||
update_time, remark)
|
||||
VALUES (1976160997656043521, '流程管理', 0, 1, 'flow', '', null, 1, 0, 'M', '0', '0', null, 'ph:user-fill', null, null,
|
||||
'2025-10-09 13:41:12', 1, '2025-10-20 20:59:25', '');
|
||||
INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, path, component, query_param, is_frame, is_cache,
|
||||
menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by,
|
||||
update_time, remark)
|
||||
VALUES (1976161221409579010, '工作流编排', 1976160997656043521, 0, 'workflow', 'workflow/index', null, 1, 0, 'C', '0',
|
||||
'0', null, 'ph:user-fill', null, null, '2025-10-09 13:42:05', 1, '2025-10-20 20:59:16', '');
|
||||
|
||||
@@ -1,395 +0,0 @@
|
||||
-- Description: 实时交互数字人集成模块
|
||||
|
||||
-- 菜单 SQL
|
||||
insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark)
|
||||
values(1971582278942666752, '交互数字人配置', '2000', '1', 'aihumanConfig', 'aihuman/aihumanConfig/index', 1, 0, 'C', '0', '0', 'aihuman:aihumanConfig:list', '#', 103, 1, sysdate(), null, null, '交互数字人配置菜单');
|
||||
|
||||
-- 按钮 SQL
|
||||
insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark)
|
||||
values(1971582278942666753, '交互数字人配置查询', 1971582278942666752, '1', '#', '', 1, 0, 'F', '0', '0', 'aihuman:aihumanConfig:query', '#', 103, 1, sysdate(), null, null, '');
|
||||
|
||||
insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark)
|
||||
values(1971582278942666754, '交互数字人配置新增', 1971582278942666752, '2', '#', '', 1, 0, 'F', '0', '0', 'aihuman:aihumanConfig:add', '#', 103, 1, sysdate(), null, null, '');
|
||||
|
||||
insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark)
|
||||
values(1971582278942666755, '交互数字人配置修改', 1971582278942666752, '3', '#', '', 1, 0, 'F', '0', '0', 'aihuman:aihumanConfig:edit', '#', 103, 1, sysdate(), null, null, '');
|
||||
|
||||
insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark)
|
||||
values(1971582278942666756, '交互数字人配置删除', 1971582278942666752, '4', '#', '', 1, 0, 'F', '0', '0', 'aihuman:aihumanConfig:remove', '#', 103, 1, sysdate(), null, null, '');
|
||||
|
||||
insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark)
|
||||
values(1971582278942666757, '交互数字人配置导出', 1971582278942666752, '5', '#', '', 1, 0, 'F', '0', '0', 'aihuman:aihumanConfig:export', '#', 103, 1, sysdate(), null, null, '');
|
||||
|
||||
-- Description: 实时交互数字人集成模块
|
||||
|
||||
-- 菜单 SQL
|
||||
insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark)
|
||||
values(1971546066781597696, '数字人信息管理', '2000', '1', 'aihumanInfo', 'aihuman/aihumanInfo/index', 1, 0, 'C', '0', '0', 'aihuman:aihumanInfo:list', '#', 103, 1, sysdate(), null, null, '数字人信息管理菜单');
|
||||
|
||||
-- 按钮 SQL
|
||||
insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark)
|
||||
values(1971546066781597697, '数字人信息管理查询', 1971546066781597696, '1', '#', '', 1, 0, 'F', '0', '0', 'aihuman:aihumanInfo:query', '#', 103, 1, sysdate(), null, null, '');
|
||||
|
||||
insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark)
|
||||
values(1971546066781597698, '数字人信息管理新增', 1971546066781597696, '2', '#', '', 1, 0, 'F', '0', '0', 'aihuman:aihumanInfo:add', '#', 103, 1, sysdate(), null, null, '');
|
||||
|
||||
insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark)
|
||||
values(1971546066781597699, '数字人信息管理修改', 1971546066781597696, '3', '#', '', 1, 0, 'F', '0', '0', 'aihuman:aihumanInfo:edit', '#', 103, 1, sysdate(), null, null, '');
|
||||
|
||||
insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark)
|
||||
values(1971546066781597700, '数字人信息管理删除', 1971546066781597696, '4', '#', '', 1, 0, 'F', '0', '0', 'aihuman:aihumanInfo:remove', '#', 103, 1, sysdate(), null, null, '');
|
||||
|
||||
insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark)
|
||||
values(1971546066781597701, '数字人信息管理导出', 1971546066781597696, '5', '#', '', 1, 0, 'F', '0', '0', 'aihuman:aihumanInfo:export', '#', 103, 1, sysdate(), null, null, '');
|
||||
|
||||
|
||||
SET NAMES utf8mb4;
|
||||
SET FOREIGN_KEY_CHECKS = 0;
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for aihuman_info
|
||||
-- ----------------------------
|
||||
DROP TABLE IF EXISTS `aihuman_info`;
|
||||
CREATE TABLE `aihuman_info` (
|
||||
`id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
|
||||
`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '交互名称',
|
||||
`content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '交互内容',
|
||||
`create_time` datetime(0) DEFAULT NULL COMMENT '创建时间',
|
||||
`update_time` datetime(0) DEFAULT NULL COMMENT '更新时间',
|
||||
`del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)',
|
||||
PRIMARY KEY (`id`) USING BTREE
|
||||
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = 'AI人类交互信息表' ROW_FORMAT = Dynamic;
|
||||
|
||||
-- ----------------------------
|
||||
-- Records of aihuman_info
|
||||
-- ----------------------------
|
||||
INSERT INTO `aihuman_info` VALUES (1, '1', '1', '2025-09-26 18:02:00', '2025-09-26 18:02:02', '0');
|
||||
|
||||
SET FOREIGN_KEY_CHECKS = 1;
|
||||
|
||||
|
||||
SET NAMES utf8mb4;
|
||||
SET FOREIGN_KEY_CHECKS = 0;
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for aihuman_config
|
||||
-- ----------------------------
|
||||
DROP TABLE IF EXISTS `aihuman_config`;
|
||||
CREATE TABLE `aihuman_config` (
|
||||
`id` int(0) NOT NULL AUTO_INCREMENT,
|
||||
`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
|
||||
`model_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
|
||||
`model_path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
|
||||
`model_params` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci,
|
||||
`agent_params` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci,
|
||||
`create_time` datetime(0) DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(0),
|
||||
`update_time` datetime(0) DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(0),
|
||||
`status` int(0) DEFAULT NULL,
|
||||
`publish` int(0) DEFAULT NULL,
|
||||
`create_dept` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
|
||||
`create_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
|
||||
`update_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
|
||||
PRIMARY KEY (`id`) USING BTREE
|
||||
) ENGINE = InnoDB AUTO_INCREMENT = 14 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
|
||||
|
||||
-- ----------------------------
|
||||
-- Records of aihuman_config
|
||||
-- ----------------------------
|
||||
INSERT INTO `aihuman_config` VALUES (9, '关爱老婆数字人(梅朵)', '梅朵吉祥物', '/Live2D/models/梅朵吉祥物/梅朵吉祥物.model3.json', '{\n \"Version\": 3,\n \"FileReferences\": {\n \"Moc\": \"梅朵吉祥物.moc3\",\n \"Textures\": [\n \"梅朵吉祥物.4096/texture_00.png\",\n \"梅朵吉祥物.4096/texture_01.png\"\n ],\n \"Physics\": \"梅朵吉祥物.physics3.json\",\n \"DisplayInfo\": \"梅朵吉祥物.cdi3.json\",\n \"MotionSync\": \"梅朵吉祥物.motionsync3.json\",\n \"Expressions\": [\n {\n \"Name\": \"kaixin\",\n \"File\": \"kaixin.exp3.json\"\n },\n {\n \"Name\": \"maozi\",\n \"File\": \"maozi.exp3.json\"\n },\n {\n \"Name\": \"mouth open\",\n \"File\": \"mouth open.exp3.json\"\n },\n {\n \"Name\": \"shibai\",\n \"File\": \"shibai.exp3.json\"\n },\n {\n \"Name\": \"yinchen\",\n \"File\": \"yinchen.exp3.json\"\n }\n ],\n \"Motions\": {\n \"\": [\n {\n \"File\": \"mouth.motion3.json\"\n }\n ]\n }\n },\n \"Groups\": [\n {\n \"Target\": \"Parameter\",\n \"Name\": \"LipSync\",\n \"Ids\": [\n \"ParamMouthForm\",\n \"ParamMouthOpenY\"\n ]\n },\n {\n \"Target\": \"Parameter\",\n \"Name\": \"EyeBlink\",\n \"Ids\": [\n \"ParamEyeLOpen\",\n \"ParamEyeROpen\"\n ]\n }\n ],\n \"HitAreas\": []\n}', '{\n \"bot_id\": \"7504596188201746470\",\n \"user_id\": \"7376476310010937396\",\n \"stream\": true,\n \"auto_save_history\": true\n}', '2025-09-29 16:36:46', '2025-09-29 16:36:46', 0, 1, NULL, NULL, '1');
|
||||
INSERT INTO `aihuman_config` VALUES (10, '关爱老婆数字人(K)', 'kei_vowels_pro', '/Live2D/models/kei_vowels_pro/kei_vowels_pro.model3.json', '{\n \"Version\": 3,\n \"FileReferences\": {\n \"Moc\": \"kei_vowels_pro.moc3\",\n \"Textures\": [\n \"kei_vowels_pro.2048/texture_00.png\"\n ],\n \"Physics\": \"kei_vowels_pro.physics3.json\",\n \"DisplayInfo\": \"kei_vowels_pro.cdi3.json\",\n \"MotionSync\": \"kei_vowels_pro.motionsync3.json\",\n \"Motions\": {\n \"\": [\n {\n \"File\": \"motions/01_kei_en.motion3.json\",\n \"Sound\": \"sounds/01_kei_en.wav\",\n \"MotionSync\": \"Vowels_CRI\"\n },\n {\n \"File\": \"motions/01_kei_jp.motion3.json\",\n \"Sound\": \"sounds/01_kei_jp.wav\",\n \"MotionSync\": \"Vowels_CRI\"\n },\n {\n \"File\": \"motions/01_kei_ko.motion3.json\",\n \"Sound\": \"sounds/01_kei_ko.wav\",\n \"MotionSync\": \"Vowels_CRI\"\n },\n {\n \"File\": \"motions/01_kei_zh.motion3.json\",\n \"Sound\": \"sounds/01_kei_zh.wav\",\n \"MotionSync\": \"Vowels_CRI\"\n }\n ]\n }\n },\n \"Groups\": [\n {\n \"Target\": \"Parameter\",\n \"Name\": \"LipSync\",\n \"Ids\": []\n },\n {\n \"Target\": \"Parameter\",\n \"Name\": \"EyeBlink\",\n \"Ids\": [\n \"ParamEyeLOpen\",\n \"ParamEyeROpen\"\n ]\n }\n ],\n \"HitAreas\": [\n {\n \"Id\": \"HitAreaHead\",\n \"Name\": \"Head\"\n }\n ]\n}', '3', '2025-09-29 16:35:27', '2025-09-29 16:35:27', 0, 1, NULL, NULL, '1');
|
||||
INSERT INTO `aihuman_config` VALUES (11, '关爱老婆数字人(March 7th)', 'March 7th', '/Live2D/models/March 7th/March 7th.model3.json', '{\n \"Version\": 3,\n \"FileReferences\": {\n \"Moc\": \"March 7th.moc3\",\n \"Textures\": [\n \"March 7th.4096/texture_00.png\",\n \"March 7th.4096/texture_01.png\"\n ],\n \"Physics\": \"March 7th.physics3.json\",\n \"DisplayInfo\": \"March 7th.cdi3.json\",\n \"Expressions\": [\n {\n \"Name\": \"捂脸\",\n \"File\": \"1.exp3.json\"\n },\n {\n \"Name\": \"比耶\",\n \"File\": \"2.exp3.json\"\n },\n {\n \"Name\": \"照相\",\n \"File\": \"3.exp3.json\"\n },\n {\n \"Name\": \"脸红\",\n \"File\": \"4.exp3.json\"\n },\n {\n \"Name\": \"黑脸\",\n \"File\": \"5.exp3.json\"\n },\n {\n \"Name\": \"哭\",\n \"File\": \"6.exp3.json\"\n },\n {\n \"Name\": \"流汗\",\n \"File\": \"7.exp3.json\"\n },\n {\n \"Name\": \"星星\",\n \"File\": \"8.exp3.json\"\n }\n ]\n },\n \"Groups\": [\n {\n \"Target\": \"Parameter\",\n \"Name\": \"EyeBlink\",\n \"Ids\": [\n \"ParamEyeLOpen\",\n \"ParamEyeROpen\"\n ]\n },\n {\n \"Target\": \"Parameter\",\n \"Name\": \"LipSync\",\n \"Ids\": [\n \"ParamMouthOpenY\"\n ]\n }\n ],\n \"HitAreas\": []\n}', '3', '2025-09-29 21:09:26', '2025-09-29 21:09:28', 0, 1, NULL, NULL, NULL);
|
||||
INSERT INTO `aihuman_config` VALUES (12, '关爱老婆数字人(pachan)', 'pachan', '/Live2D/models/pachan/pachan.model3.json', '{\n \"Version\": 3,\n \"FileReferences\": {\n \"Moc\": \"pachirisu anime girl - top half.moc3\",\n \"Textures\": [\n \"pachirisu anime girl - top half.4096/texture_00.png\"\n ],\n \"Physics\": \"pachirisu anime girl - top half.physics3.json\",\n \"DisplayInfo\": \"pachirisu anime girl - top half.cdi3.json\"\n },\n \"Groups\": [\n {\n \"Target\": \"Parameter\",\n \"Name\": \"EyeBlink\",\n \"Ids\": []\n },\n {\n \"Target\": \"Parameter\",\n \"Name\": \"LipSync\",\n \"Ids\": []\n }\n ]\n}', NULL, '2025-10-05 19:49:56', '2025-10-05 19:49:56', 0, 1, NULL, NULL, NULL);
|
||||
INSERT INTO `aihuman_config` VALUES (13, '关爱老婆数字人(230108)', '230108', '/Live2D/models/230108/230108.model3.json', '{\n \"Version\": 3,\n \"FileReferences\": {\n \"Moc\": \"230108.moc3\",\n \"Textures\": [\n \"230108.4096/texture_00.png\"\n ],\n \"Physics\": \"230108.physics3.json\",\n \"DisplayInfo\": \"230108.cdi3.json\"\n },\n \"Groups\": [\n {\n \"Target\": \"Parameter\",\n \"Name\": \"LipSync\",\n \"Ids\": [\n \"ParamMouthOpenY\"\n ]\n },\n {\n \"Target\": \"Parameter\",\n \"Name\": \"EyeBlink\",\n \"Ids\": [\n \"ParamEyeLOpen\",\n \"ParamEyeROpen\"\n ]\n }\n ]\n}', NULL, '2025-10-06 19:28:20', '2025-10-06 19:28:23', 0, 1, NULL, NULL, NULL);
|
||||
|
||||
SET FOREIGN_KEY_CHECKS = 1;
|
||||
|
||||
|
||||
SET NAMES utf8mb4;
|
||||
SET FOREIGN_KEY_CHECKS = 0;
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for sys_dict_data
|
||||
-- ----------------------------
|
||||
DROP TABLE IF EXISTS `sys_dict_data`;
|
||||
CREATE TABLE `sys_dict_data` (
|
||||
`dict_code` bigint(0) NOT NULL COMMENT '字典编码',
|
||||
`tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '000000' COMMENT '租户编号',
|
||||
`dict_sort` int(0) DEFAULT 0 COMMENT '字典排序',
|
||||
`dict_label` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '字典标签',
|
||||
`dict_value` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '字典键值',
|
||||
`dict_type` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '字典类型',
|
||||
`css_class` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '样式属性(其他样式扩展)',
|
||||
`list_class` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '表格回显样式',
|
||||
`is_default` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'N' COMMENT '是否默认(Y是 N否)',
|
||||
`status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '状态(0正常 1停用)',
|
||||
`create_dept` bigint(0) DEFAULT NULL COMMENT '创建部门',
|
||||
`create_by` bigint(0) DEFAULT NULL COMMENT '创建者',
|
||||
`create_time` datetime(0) DEFAULT NULL COMMENT '创建时间',
|
||||
`update_by` bigint(0) DEFAULT NULL COMMENT '更新者',
|
||||
`update_time` datetime(0) DEFAULT NULL COMMENT '更新时间',
|
||||
`remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注',
|
||||
PRIMARY KEY (`dict_code`) USING BTREE
|
||||
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '字典数据表' ROW_FORMAT = Dynamic;
|
||||
|
||||
-- ----------------------------
|
||||
-- Records of sys_dict_data
|
||||
-- ----------------------------
|
||||
INSERT INTO `sys_dict_data` VALUES (1, '000000', 1, '男', '0', 'sys_user_sex', '', '', 'Y', '0', 103, 1, '2023-05-14 15:19:41', NULL, NULL, '性别男');
|
||||
INSERT INTO `sys_dict_data` VALUES (2, '000000', 2, '女', '1', 'sys_user_sex', '', '', 'N', '0', 103, 1, '2023-05-14 15:19:41', NULL, NULL, '性别女');
|
||||
INSERT INTO `sys_dict_data` VALUES (3, '000000', 3, '未知', '2', 'sys_user_sex', '', '', 'N', '0', 103, 1, '2023-05-14 15:19:41', NULL, NULL, '性别未知');
|
||||
INSERT INTO `sys_dict_data` VALUES (4, '000000', 1, '显示', '0', 'sys_show_hide', '', 'primary', 'Y', '0', 103, 1, '2023-05-14 15:19:41', NULL, NULL, '显示菜单');
|
||||
INSERT INTO `sys_dict_data` VALUES (5, '000000', 2, '隐藏', '1', 'sys_show_hide', '', 'danger', 'N', '0', 103, 1, '2023-05-14 15:19:41', NULL, NULL, '隐藏菜单');
|
||||
INSERT INTO `sys_dict_data` VALUES (6, '000000', 1, '正常', '0', 'sys_normal_disable', '', 'primary', 'Y', '0', 103, 1, '2023-05-14 15:19:41', NULL, NULL, '正常状态');
|
||||
INSERT INTO `sys_dict_data` VALUES (7, '000000', 2, '停用', '1', 'sys_normal_disable', '', 'danger', 'N', '0', 103, 1, '2023-05-14 15:19:41', NULL, NULL, '停用状态');
|
||||
INSERT INTO `sys_dict_data` VALUES (12, '000000', 1, '是', 'Y', 'sys_yes_no', '', 'primary', 'Y', '0', 103, 1, '2023-05-14 15:19:41', NULL, NULL, '系统默认是');
|
||||
INSERT INTO `sys_dict_data` VALUES (13, '000000', 2, '否', 'N', 'sys_yes_no', '', 'danger', 'N', '0', 103, 1, '2023-05-14 15:19:41', NULL, NULL, '系统默认否');
|
||||
INSERT INTO `sys_dict_data` VALUES (14, '000000', 1, '通知', '1', 'sys_notice_type', '', 'warning', 'Y', '0', 103, 1, '2023-05-14 15:19:41', NULL, NULL, '通知');
|
||||
INSERT INTO `sys_dict_data` VALUES (15, '000000', 2, '公告', '2', 'sys_notice_type', '', 'success', 'N', '0', 103, 1, '2023-05-14 15:19:41', NULL, NULL, '公告');
|
||||
INSERT INTO `sys_dict_data` VALUES (16, '000000', 1, '正常', '0', 'sys_notice_status', '', 'primary', 'Y', '0', 103, 1, '2023-05-14 15:19:41', NULL, NULL, '正常状态');
|
||||
INSERT INTO `sys_dict_data` VALUES (17, '000000', 2, '关闭', '1', 'sys_notice_status', '', 'danger', 'N', '0', 103, 1, '2023-05-14 15:19:41', NULL, NULL, '关闭状态');
|
||||
INSERT INTO `sys_dict_data` VALUES (18, '000000', 1, '新增', '1', 'sys_oper_type', '', 'info', 'N', '0', 103, 1, '2023-05-14 15:19:41', NULL, NULL, '新增操作');
|
||||
INSERT INTO `sys_dict_data` VALUES (19, '000000', 2, '修改', '2', 'sys_oper_type', '', 'info', 'N', '0', 103, 1, '2023-05-14 15:19:41', NULL, NULL, '修改操作');
|
||||
INSERT INTO `sys_dict_data` VALUES (20, '000000', 3, '删除', '3', 'sys_oper_type', '', 'danger', 'N', '0', 103, 1, '2023-05-14 15:19:41', NULL, NULL, '删除操作');
|
||||
INSERT INTO `sys_dict_data` VALUES (21, '000000', 4, '授权', '4', 'sys_oper_type', '', 'primary', 'N', '0', 103, 1, '2023-05-14 15:19:41', NULL, NULL, '授权操作');
|
||||
INSERT INTO `sys_dict_data` VALUES (22, '000000', 5, '导出', '5', 'sys_oper_type', '', 'warning', 'N', '0', 103, 1, '2023-05-14 15:19:41', NULL, NULL, '导出操作');
|
||||
INSERT INTO `sys_dict_data` VALUES (23, '000000', 6, '导入', '6', 'sys_oper_type', '', 'warning', 'N', '0', 103, 1, '2023-05-14 15:19:41', NULL, NULL, '导入操作');
|
||||
INSERT INTO `sys_dict_data` VALUES (24, '000000', 7, '强退', '7', 'sys_oper_type', '', 'danger', 'N', '0', 103, 1, '2023-05-14 15:19:41', NULL, NULL, '强退操作');
|
||||
INSERT INTO `sys_dict_data` VALUES (25, '000000', 8, '生成代码', '8', 'sys_oper_type', '', 'warning', 'N', '0', 103, 1, '2023-05-14 15:19:41', NULL, NULL, '生成操作');
|
||||
INSERT INTO `sys_dict_data` VALUES (26, '000000', 9, '清空数据', '9', 'sys_oper_type', '', 'danger', 'N', '0', 103, 1, '2023-05-14 15:19:41', NULL, NULL, '清空操作');
|
||||
INSERT INTO `sys_dict_data` VALUES (27, '000000', 1, '成功', '0', 'sys_common_status', '', 'primary', 'N', '0', 103, 1, '2023-05-14 15:19:41', NULL, NULL, '正常状态');
|
||||
INSERT INTO `sys_dict_data` VALUES (28, '000000', 2, '失败', '1', 'sys_common_status', '', 'danger', 'N', '0', 103, 1, '2023-05-14 15:19:41', NULL, NULL, '停用状态');
|
||||
INSERT INTO `sys_dict_data` VALUES (29, '000000', 99, '其他', '0', 'sys_oper_type', '', 'info', 'N', '0', 103, 1, '2023-05-14 15:19:41', NULL, NULL, '其他操作');
|
||||
INSERT INTO `sys_dict_data` VALUES (1775756996568993793, '000000', 1, '免费用户', '0', 'sys_user_grade', '', 'info', 'N', '0', 103, 1, '2024-04-04 13:27:15', 1, '2024-04-04 13:30:09', '');
|
||||
INSERT INTO `sys_dict_data` VALUES (1775757116970684418, '000000', 2, '高级会员', '1', 'sys_user_grade', '', 'success', 'N', '0', 103, 1, '2024-04-04 13:27:43', 1, '2024-04-04 13:30:15', '');
|
||||
INSERT INTO `sys_dict_data` VALUES (1776109770934677506, '000000', 0, 'token计费', '1', 'sys_model_billing', '', 'primary', 'N', '0', 103, 1, '2024-04-05 12:49:03', 1, '2024-04-21 00:05:41', '');
|
||||
INSERT INTO `sys_dict_data` VALUES (1776109853377916929, '000000', 0, '次数计费', '2', 'sys_model_billing', '', 'success', 'N', '0', 103, 1, '2024-04-05 12:49:22', 1, '2024-04-05 12:49:22', '');
|
||||
INSERT INTO `sys_dict_data` VALUES (1780264338471858177, '000000', 0, '未支付', '1', 'pay_state', '', 'info', 'N', '0', 103, 1, '2024-04-16 23:57:49', 1, '2024-04-16 23:58:29', '');
|
||||
INSERT INTO `sys_dict_data` VALUES (1780264431589601282, '000000', 2, '已支付', '2', 'pay_state', '', 'success', 'N', '0', 103, 1, '2024-04-16 23:58:11', 1, '2024-04-16 23:58:21', '');
|
||||
INSERT INTO `sys_dict_data` VALUES (1933094189606670338, '000000', 0, '知识库', 'vector', 'prompt_template_type', NULL, '', 'N', '0', 103, 1, '2025-06-12 17:29:05', 1, '2025-06-12 17:29:05', NULL);
|
||||
INSERT INTO `sys_dict_data` VALUES (1938226101050925057, '000000', 1, '中转模型-chat', 'chat', 'chat_model_category', NULL, '', 'N', '0', 103, 1, '2025-06-26 21:21:28', 1, '2025-06-26 21:22:26', NULL);
|
||||
INSERT INTO `sys_dict_data` VALUES (1938226833825193985, '000000', 1, '本地部署模型-ollama', 'ollama', 'chat_model_category', NULL, '', 'N', '0', 103, 1, '2025-06-26 21:24:22', 1, '2025-06-26 21:24:22', NULL);
|
||||
INSERT INTO `sys_dict_data` VALUES (1938226919661625345, '000000', 1, 'DIFY-dify', 'dify', 'chat_model_category', NULL, '', 'N', '0', 103, 1, '2025-06-26 21:24:43', 1, '2025-06-26 21:24:43', NULL);
|
||||
INSERT INTO `sys_dict_data` VALUES (1938226981422751746, '000000', 1, '扣子-coze', 'coze', 'chat_model_category', NULL, '', 'N', '0', 103, 1, '2025-06-26 21:24:58', 1, '2025-06-26 21:24:58', NULL);
|
||||
INSERT INTO `sys_dict_data` VALUES (1938227034350673922, '000000', 1, '智谱清言-zhipu', 'zhipu', 'chat_model_category', NULL, '', 'N', '0', 103, 1, '2025-06-26 21:25:10', 1, '2025-06-26 21:25:10', NULL);
|
||||
INSERT INTO `sys_dict_data` VALUES (1938227086750113793, '000000', 1, '深度求索-deepseek', 'deepseek', 'chat_model_category', NULL, '', 'N', '0', 103, 1, '2025-06-26 21:25:23', 1, '2025-06-26 21:25:23', NULL);
|
||||
INSERT INTO `sys_dict_data` VALUES (1938227141741633537, '000000', 1, '通义千问-qianwen', 'qianwen', 'chat_model_category', NULL, '', 'N', '0', 103, 1, '2025-06-26 21:25:36', 1, '2025-06-26 21:25:36', NULL);
|
||||
INSERT INTO `sys_dict_data` VALUES (1938227191834206209, '000000', 1, '知识库向量模型-vector', 'vector', 'chat_model_category', NULL, '', 'N', '0', 103, 1, '2025-06-26 21:25:48', 1, '2025-06-26 21:25:48', NULL);
|
||||
INSERT INTO `sys_dict_data` VALUES (1938227249417805826, '000000', 1, '图片识别模型-image', 'image', 'chat_model_category', NULL, '', 'N', '0', 103, 1, '2025-06-26 21:26:01', 1, '2025-06-26 21:26:01', NULL);
|
||||
INSERT INTO `sys_dict_data` VALUES (1940594785010503681, '000000', 1, 'FASTGPT-fastgpt', 'fastgpt', 'chat_model_category', NULL, '', 'N', '0', 103, 1, '2025-07-03 10:13:46', 1, '2025-07-03 10:13:46', NULL);
|
||||
INSERT INTO `sys_dict_data` VALUES (1971580207002615809, '000000', 0, '未发布', '0', 'aihuman_is_publish', NULL, '#949494', 'N', '0', NULL, NULL, '2025-09-26 22:18:46', NULL, '2025-09-26 22:18:46', NULL);
|
||||
INSERT INTO `sys_dict_data` VALUES (1971580286589534210, '000000', 1, '已发布', '1', 'aihuman_is_publish', NULL, '#00a89d', 'N', '0', NULL, NULL, '2025-09-26 22:19:05', 1, '2025-09-26 22:19:25', NULL);
|
||||
|
||||
SET FOREIGN_KEY_CHECKS = 1;
|
||||
|
||||
|
||||
SET NAMES utf8mb4;
|
||||
SET FOREIGN_KEY_CHECKS = 0;
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for sys_dict_type
|
||||
-- ----------------------------
|
||||
DROP TABLE IF EXISTS `sys_dict_type`;
|
||||
CREATE TABLE `sys_dict_type` (
|
||||
`dict_id` bigint(0) NOT NULL COMMENT '字典主键',
|
||||
`tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '000000' COMMENT '租户编号',
|
||||
`dict_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '字典名称',
|
||||
`dict_type` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '字典类型',
|
||||
`status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '状态(0正常 1停用)',
|
||||
`create_dept` bigint(0) DEFAULT NULL COMMENT '创建部门',
|
||||
`create_by` bigint(0) DEFAULT NULL COMMENT '创建者',
|
||||
`create_time` datetime(0) DEFAULT NULL COMMENT '创建时间',
|
||||
`update_by` bigint(0) DEFAULT NULL COMMENT '更新者',
|
||||
`update_time` datetime(0) DEFAULT NULL COMMENT '更新时间',
|
||||
`remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注',
|
||||
PRIMARY KEY (`dict_id`) USING BTREE,
|
||||
UNIQUE INDEX `tenant_id`(`tenant_id`, `dict_type`) USING BTREE
|
||||
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '字典类型表' ROW_FORMAT = Dynamic;
|
||||
|
||||
-- ----------------------------
|
||||
-- Records of sys_dict_type
|
||||
-- ----------------------------
|
||||
INSERT INTO `sys_dict_type` VALUES (1, '000000', '用户性别', 'sys_user_sex', '0', 103, 1, '2023-05-14 15:19:41', NULL, NULL, '用户性别列表');
|
||||
INSERT INTO `sys_dict_type` VALUES (2, '000000', '菜单状态', 'sys_show_hide', '0', 103, 1, '2023-05-14 15:19:41', NULL, NULL, '菜单状态列表');
|
||||
INSERT INTO `sys_dict_type` VALUES (3, '000000', '系统开关', 'sys_normal_disable', '0', 103, 1, '2023-05-14 15:19:41', NULL, NULL, '系统开关列表');
|
||||
INSERT INTO `sys_dict_type` VALUES (6, '000000', '系统是否', 'sys_yes_no', '0', 103, 1, '2023-05-14 15:19:41', NULL, NULL, '系统是否列表');
|
||||
INSERT INTO `sys_dict_type` VALUES (7, '000000', '通知类型', 'sys_notice_type', '0', 103, 1, '2023-05-14 15:19:41', NULL, NULL, '通知类型列表');
|
||||
INSERT INTO `sys_dict_type` VALUES (8, '000000', '通知状态', 'sys_notice_status', '0', 103, 1, '2023-05-14 15:19:41', NULL, NULL, '通知状态列表');
|
||||
INSERT INTO `sys_dict_type` VALUES (9, '000000', '操作类型', 'sys_oper_type', '0', 103, 1, '2023-05-14 15:19:41', NULL, NULL, '操作类型列表');
|
||||
INSERT INTO `sys_dict_type` VALUES (10, '000000', '系统状态', 'sys_common_status', '0', 103, 1, '2023-05-14 15:19:41', NULL, NULL, '登录状态列表');
|
||||
INSERT INTO `sys_dict_type` VALUES (1729685494468083714, '911866', '用户性别', 'sys_user_sex', '0', 103, 1, '2023-05-14 15:19:41', 1, '2023-05-14 15:19:41', '用户性别列表');
|
||||
INSERT INTO `sys_dict_type` VALUES (1729685494468083715, '911866', '菜单状态', 'sys_show_hide', '0', 103, 1, '2023-05-14 15:19:41', 1, '2023-05-14 15:19:41', '菜单状态列表');
|
||||
INSERT INTO `sys_dict_type` VALUES (1729685494468083716, '911866', '系统开关', 'sys_normal_disable', '0', 103, 1, '2023-05-14 15:19:41', 1, '2023-05-14 15:19:41', '系统开关列表');
|
||||
INSERT INTO `sys_dict_type` VALUES (1729685494468083717, '911866', '系统是否', 'sys_yes_no', '0', 103, 1, '2023-05-14 15:19:41', 1, '2023-05-14 15:19:41', '系统是否列表');
|
||||
INSERT INTO `sys_dict_type` VALUES (1729685494468083718, '911866', '通知类型', 'sys_notice_type', '0', 103, 1, '2023-05-14 15:19:41', 1, '2023-05-14 15:19:41', '通知类型列表');
|
||||
INSERT INTO `sys_dict_type` VALUES (1729685494468083719, '911866', '通知状态', 'sys_notice_status', '0', 103, 1, '2023-05-14 15:19:41', 1, '2023-05-14 15:19:41', '通知状态列表');
|
||||
INSERT INTO `sys_dict_type` VALUES (1729685494468083720, '911866', '操作类型', 'sys_oper_type', '0', 103, 1, '2023-05-14 15:19:41', 1, '2023-05-14 15:19:41', '操作类型列表');
|
||||
INSERT INTO `sys_dict_type` VALUES (1729685494468083721, '911866', '系统状态', 'sys_common_status', '0', 103, 1, '2023-05-14 15:19:41', 1, '2023-05-14 15:19:41', '登录状态列表');
|
||||
INSERT INTO `sys_dict_type` VALUES (1775756736895438849, '000000', '用户等级', 'sys_user_grade', '0', 103, 1, '2024-04-04 13:26:13', 1, '2024-04-04 13:26:13', '');
|
||||
INSERT INTO `sys_dict_type` VALUES (1776109665045278721, '000000', '模型计费方式', 'sys_model_billing', '0', 103, 1, '2024-04-05 12:48:37', 1, '2024-04-08 11:22:18', '模型计费方式');
|
||||
INSERT INTO `sys_dict_type` VALUES (1780263881368219649, '000000', '支付状态', 'pay_state', '0', 103, 1, '2024-04-16 23:56:00', 1, '2025-03-29 15:21:57', '支付状态');
|
||||
INSERT INTO `sys_dict_type` VALUES (1904565568803217409, '000000', '状态类型', 'status_type', '0', 103, 1, '2025-03-26 00:06:31', 1, '2025-03-26 00:06:31', NULL);
|
||||
INSERT INTO `sys_dict_type` VALUES (1933093946274123777, '000000', '提示词模板分类', 'prompt_template_type', '0', 103, 1, '2025-06-12 17:28:07', 1, '2025-06-12 17:28:07', '提示词模板类型');
|
||||
INSERT INTO `sys_dict_type` VALUES (1938225899023884289, '000000', '模型分类', 'chat_model_category', '0', 103, 1, '2025-06-26 21:20:39', 1, '2025-06-26 21:20:39', '模型分类');
|
||||
INSERT INTO `sys_dict_type` VALUES (1971579935501123586, '000000', '发布状态', 'aihuman_is_publish', '0', NULL, NULL, '2025-09-26 22:17:41', NULL, '2025-09-26 22:17:41', '0 代表未发布,1代表发布');
|
||||
|
||||
SET FOREIGN_KEY_CHECKS = 1;
|
||||
|
||||
|
||||
|
||||
|
||||
SET NAMES utf8mb4;
|
||||
SET FOREIGN_KEY_CHECKS = 0;
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for sys_menu
|
||||
-- ----------------------------
|
||||
DROP TABLE IF EXISTS `sys_menu`;
|
||||
CREATE TABLE `sys_menu` (
|
||||
`menu_id` bigint(0) NOT NULL COMMENT '菜单ID',
|
||||
`menu_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '菜单名称',
|
||||
`parent_id` bigint(0) DEFAULT 0 COMMENT '父菜单ID',
|
||||
`order_num` int(0) DEFAULT 0 COMMENT '显示顺序',
|
||||
`path` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '路由地址',
|
||||
`component` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '组件路径',
|
||||
`query_param` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '路由参数',
|
||||
`is_frame` int(0) DEFAULT 1 COMMENT '是否为外链(0是 1否)',
|
||||
`is_cache` int(0) DEFAULT 0 COMMENT '是否缓存(0缓存 1不缓存)',
|
||||
`menu_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '菜单类型(M目录 C菜单 F按钮)',
|
||||
`visible` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '显示状态(0显示 1隐藏)',
|
||||
`status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '菜单状态(0正常 1停用)',
|
||||
`perms` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '权限标识',
|
||||
`icon` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '#' COMMENT '菜单图标',
|
||||
`create_dept` bigint(0) DEFAULT NULL COMMENT '创建部门',
|
||||
`create_by` bigint(0) DEFAULT NULL COMMENT '创建者',
|
||||
`create_time` datetime(0) DEFAULT NULL COMMENT '创建时间',
|
||||
`update_by` bigint(0) DEFAULT NULL COMMENT '更新者',
|
||||
`update_time` datetime(0) DEFAULT NULL COMMENT '更新时间',
|
||||
`remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '备注',
|
||||
PRIMARY KEY (`menu_id`) USING BTREE
|
||||
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '菜单权限表' ROW_FORMAT = Dynamic;
|
||||
|
||||
-- ----------------------------
|
||||
-- Records of sys_menu
|
||||
-- ----------------------------
|
||||
INSERT INTO `sys_menu` VALUES (1, '系统管理', 0, 5, 'system', '', '', 1, 0, 'M', '0', '0', '', 'eos-icons:system-group', 103, 1, '2023-05-14 15:19:39', 1, '2025-09-26 20:19:31', '系统管理目录');
|
||||
INSERT INTO `sys_menu` VALUES (100, '用户管理', 1775500307898949634, 1, 'user', 'operator/user/index', '', 1, 0, 'C', '0', '0', 'system:user:list', 'ph:user-fill', 103, 1, '2023-05-14 15:19:39', 1, '2024-10-07 21:29:29', '用户管理菜单');
|
||||
INSERT INTO `sys_menu` VALUES (101, '角色管理', 1, 2, 'role', 'system/role/index', '', 1, 0, 'C', '0', '0', 'system:role:list', 'ri:user-3-fill', 103, 1, '2023-05-14 15:19:39', 1, '2024-10-07 21:04:59', '角色管理菜单');
|
||||
INSERT INTO `sys_menu` VALUES (102, '菜单管理', 1, 3, 'menu', 'system/menu/index', '', 1, 0, 'C', '0', '0', 'system:menu:list', 'typcn:th-menu-outline', 103, 1, '2023-05-14 15:19:39', 1, '2024-10-07 21:06:06', '菜单管理菜单');
|
||||
INSERT INTO `sys_menu` VALUES (103, '部门管理', 1, 4, 'dept', 'system/dept/index', '', 1, 0, 'C', '1', '1', 'system:dept:list', 'mdi:company', 103, 1, '2023-05-14 15:19:39', 1, '2024-10-07 21:07:38', '部门管理菜单');
|
||||
INSERT INTO `sys_menu` VALUES (104, '岗位管理', 1, 5, 'post', 'system/post/index', '', 1, 0, 'C', '1', '1', 'system:post:list', 'post', 103, 1, '2023-05-14 15:19:39', 1, '2024-04-04 22:36:15', '岗位管理菜单');
|
||||
INSERT INTO `sys_menu` VALUES (105, '字典管理', 1, 6, 'dict', 'system/dict/index', '', 1, 0, 'C', '0', '0', 'system:dict:list', 'fluent-mdl2:dictionary', 103, 1, '2023-05-14 15:19:40', 1, '2024-10-07 21:14:33', '字典管理菜单');
|
||||
INSERT INTO `sys_menu` VALUES (106, '系统参数', 1, 10, 'config', 'system/config/index', '', 1, 0, 'C', '0', '0', 'system:config:list', 'tdesign:system-code', 103, 1, '2023-05-14 15:19:40', 1, '2024-10-07 21:11:07', '参数设置菜单');
|
||||
INSERT INTO `sys_menu` VALUES (107, '通知公告', 1, 14, 'notice', 'system/notice/index', '', 1, 0, 'C', '0', '0', 'system:notice:list', 'icon-park-solid:volume-notice', 103, 1, '2023-05-14 15:19:40', 1, '2024-10-07 21:11:42', '通知公告菜单');
|
||||
INSERT INTO `sys_menu` VALUES (108, '日志管理', 1, 9, 'log', '', '', 1, 0, 'M', '0', '0', '', 'icon-park-solid:log', 103, 1, '2023-05-14 15:19:40', 1, '2024-10-07 21:10:41', '日志管理菜单');
|
||||
INSERT INTO `sys_menu` VALUES (113, '缓存监控', 1, 5, 'cache', 'monitor/cache/index', '', 1, 0, 'C', '0', '0', 'monitor:cache:list', 'octicon:cache-24', 103, 1, '2023-05-14 15:19:40', 1, '2024-10-07 21:09:44', '缓存监控菜单');
|
||||
INSERT INTO `sys_menu` VALUES (500, '操作日志', 108, 1, 'operlog', 'monitor/operlog/index', '', 1, 0, 'C', '0', '0', 'monitor:operlog:list', 'icon-park-solid:log', 103, 1, '2023-05-14 15:19:40', 1, '2024-10-07 21:13:20', '操作日志菜单');
|
||||
INSERT INTO `sys_menu` VALUES (501, '登录日志', 108, 2, 'logininfor', 'monitor/logininfor/index', '', 1, 0, 'C', '0', '0', 'monitor:logininfor:list', 'icon-park-solid:log', 103, 1, '2023-05-14 15:19:40', 1, '2024-10-07 21:13:33', '登录日志菜单');
|
||||
INSERT INTO `sys_menu` VALUES (1001, '用户查询', 100, 1, '', '', '', 1, 0, 'F', '0', '0', 'system:user:query', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1002, '用户新增', 100, 2, '', '', '', 1, 0, 'F', '0', '0', 'system:user:add', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1003, '用户修改', 100, 3, '', '', '', 1, 0, 'F', '0', '0', 'system:user:edit', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1004, '用户删除', 100, 4, '', '', '', 1, 0, 'F', '0', '0', 'system:user:remove', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1005, '用户导出', 100, 5, '', '', '', 1, 0, 'F', '0', '0', 'system:user:export', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1006, '用户导入', 100, 6, '', '', '', 1, 0, 'F', '0', '0', 'system:user:import', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1007, '重置密码', 100, 7, '', '', '', 1, 0, 'F', '0', '0', 'system:user:resetPwd', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1008, '角色查询', 101, 1, '', '', '', 1, 0, 'F', '0', '0', 'system:role:query', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1009, '角色新增', 101, 2, '', '', '', 1, 0, 'F', '0', '0', 'system:role:add', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1010, '角色修改', 101, 3, '', '', '', 1, 0, 'F', '0', '0', 'system:role:edit', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1011, '角色删除', 101, 4, '', '', '', 1, 0, 'F', '0', '0', 'system:role:remove', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1012, '角色导出', 101, 5, '', '', '', 1, 0, 'F', '0', '0', 'system:role:export', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1013, '菜单查询', 102, 1, '', '', '', 1, 0, 'F', '0', '0', 'system:menu:query', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1014, '菜单新增', 102, 2, '', '', '', 1, 0, 'F', '0', '0', 'system:menu:add', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1015, '菜单修改', 102, 3, '', '', '', 1, 0, 'F', '0', '0', 'system:menu:edit', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1016, '菜单删除', 102, 4, '', '', '', 1, 0, 'F', '0', '0', 'system:menu:remove', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1017, '部门查询', 103, 1, '', '', '', 1, 0, 'F', '0', '0', 'system:dept:query', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1018, '部门新增', 103, 2, '', '', '', 1, 0, 'F', '0', '0', 'system:dept:add', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1019, '部门修改', 103, 3, '', '', '', 1, 0, 'F', '0', '0', 'system:dept:edit', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1020, '部门删除', 103, 4, '', '', '', 1, 0, 'F', '0', '0', 'system:dept:remove', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1021, '岗位查询', 104, 1, '', '', '', 1, 0, 'F', '0', '0', 'system:post:query', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1022, '岗位新增', 104, 2, '', '', '', 1, 0, 'F', '0', '0', 'system:post:add', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1023, '岗位修改', 104, 3, '', '', '', 1, 0, 'F', '0', '0', 'system:post:edit', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1024, '岗位删除', 104, 4, '', '', '', 1, 0, 'F', '0', '0', 'system:post:remove', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1025, '岗位导出', 104, 5, '', '', '', 1, 0, 'F', '0', '0', 'system:post:export', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1026, '字典查询', 105, 1, '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:query', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1027, '字典新增', 105, 2, '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:add', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1028, '字典修改', 105, 3, '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:edit', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1029, '字典删除', 105, 4, '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:remove', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1030, '字典导出', 105, 5, '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:export', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1031, '参数查询', 106, 1, '#', '', '', 1, 0, 'F', '0', '0', 'system:config:query', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1032, '参数新增', 106, 2, '#', '', '', 1, 0, 'F', '0', '0', 'system:config:add', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1033, '参数修改', 106, 3, '#', '', '', 1, 0, 'F', '0', '0', 'system:config:edit', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1034, '参数删除', 106, 4, '#', '', '', 1, 0, 'F', '0', '0', 'system:config:remove', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1035, '参数导出', 106, 5, '#', '', '', 1, 0, 'F', '0', '0', 'system:config:export', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1036, '公告查询', 107, 1, '#', '', '', 1, 0, 'F', '0', '0', 'system:notice:query', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1037, '公告新增', 107, 2, '#', '', '', 1, 0, 'F', '0', '0', 'system:notice:add', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1038, '公告修改', 107, 3, '#', '', '', 1, 0, 'F', '0', '0', 'system:notice:edit', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1039, '公告删除', 107, 4, '#', '', '', 1, 0, 'F', '0', '0', 'system:notice:remove', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1040, '操作查询', 500, 1, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:operlog:query', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1041, '操作删除', 500, 2, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:operlog:remove', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1042, '日志导出', 500, 4, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:operlog:export', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1043, '登录查询', 501, 1, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:query', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1044, '登录删除', 501, 2, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:remove', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1045, '日志导出', 501, 3, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:export', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1050, '账户解锁', 501, 4, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:unlock', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (2000, '在线开发', 0, 20, 'dev', '', '', 1, 0, 'M', '0', '0', '', 'carbon:development', 103, 1, '2025-07-11 19:38:05', 1, '2025-07-11 19:43:03', '在线开发目录');
|
||||
INSERT INTO `sys_menu` VALUES (1775500307898949634, '运营管理', 0, 3, 'operate', '', NULL, 1, 0, 'M', '0', '0', NULL, 'icon-park-outline:appointment', 103, 1, '2024-04-03 20:27:15', 1, '2025-09-26 20:19:38', '');
|
||||
INSERT INTO `sys_menu` VALUES (1775895273104068610, '系统模型', 1775500307898949634, 2, 'model', 'operator/model/index', NULL, 1, 0, 'C', '0', '0', 'system:model:list', 'ph:list-fill', 103, 1, '2024-04-05 12:00:38', 1, '2024-10-07 21:36:00', '系统模型菜单');
|
||||
INSERT INTO `sys_menu` VALUES (1775895273104068611, '系统模型查询', 1775895273104068610, 1, '#', '', NULL, 1, 0, 'F', '0', '0', 'system:model:query', '#', 103, 1, '2024-04-05 12:00:38', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1775895273104068612, '系统模型新增', 1775895273104068610, 2, '#', '', NULL, 1, 0, 'F', '0', '0', 'system:model:add', '#', 103, 1, '2024-04-05 12:00:38', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1775895273104068613, '系统模型修改', 1775895273104068610, 3, '#', '', NULL, 1, 0, 'F', '0', '0', 'system:model:edit', '#', 103, 1, '2024-04-05 12:00:38', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1775895273104068614, '系统模型删除', 1775895273104068610, 4, '#', '', NULL, 1, 0, 'F', '0', '0', 'system:model:remove', '#', 103, 1, '2024-04-05 12:00:38', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1775895273104068615, '系统模型导出', 1775895273104068610, 5, '#', '', NULL, 1, 0, 'F', '0', '0', 'system:model:export', '#', 103, 1, '2024-04-05 12:00:38', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1780240077690507266, '聊天消息', 1775500307898949634, 5, 'chatMessage', 'operator/message/index', NULL, 1, 0, 'C', '0', '0', 'system:message:list', 'bx:chat', 103, 1, '2024-04-16 22:24:48', 1, '2024-10-07 21:38:49', '聊天消息菜单');
|
||||
INSERT INTO `sys_menu` VALUES (1780240077690507267, '聊天消息查询', 1780240077690507266, 1, '#', '', NULL, 1, 0, 'F', '0', '0', 'system:message:query', '#', 103, 1, '2024-04-16 22:24:48', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1780240077690507268, '聊天消息新增', 1780240077690507266, 2, '#', '', NULL, 1, 0, 'F', '0', '0', 'system:message:add', '#', 103, 1, '2024-04-16 22:24:48', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1780240077690507269, '聊天消息修改', 1780240077690507266, 3, '#', '', NULL, 1, 0, 'F', '0', '0', 'system:message:edit', '#', 103, 1, '2024-04-16 22:24:48', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1780240077690507270, '聊天消息删除', 1780240077690507266, 4, '#', '', NULL, 1, 0, 'F', '0', '0', 'system:message:remove', '#', 103, 1, '2024-04-16 22:24:48', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1780240077690507271, '聊天消息导出', 1780240077690507266, 5, '#', '', NULL, 1, 0, 'F', '0', '0', 'system:message:export', '#', 103, 1, '2024-04-16 22:24:48', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1780255628576018433, '支付订单', 1775500307898949634, 6, 'order', 'operator/payOrder/index', NULL, 1, 0, 'C', '0', '0', 'system:order:list', 'material-symbols:order-approve', 103, 1, '2024-04-16 23:32:48', 1, '2025-03-30 21:12:38', '支付订单菜单');
|
||||
INSERT INTO `sys_menu` VALUES (1780255628576018434, '支付订单查询', 1780255628576018433, 1, '#', '', NULL, 1, 0, 'F', '0', '0', 'system:orders:query', '#', 103, 1, '2024-04-16 23:32:48', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1780255628576018435, '支付订单新增', 1780255628576018433, 2, '#', '', NULL, 1, 0, 'F', '0', '0', 'system:orders:add', '#', 103, 1, '2024-04-16 23:32:48', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1780255628576018436, '支付订单修改', 1780255628576018433, 3, '#', '', NULL, 1, 0, 'F', '0', '0', 'system:orders:edit', '#', 103, 1, '2024-04-16 23:32:48', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1780255628576018437, '支付订单删除', 1780255628576018433, 4, '#', '', NULL, 1, 0, 'F', '0', '0', 'system:orders:remove', '#', 103, 1, '2024-04-16 23:32:48', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1780255628576018438, '支付订单导出', 1780255628576018433, 5, '#', '', NULL, 1, 0, 'F', '0', '0', 'system:orders:export', '#', 103, 1, '2024-04-16 23:32:48', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1843281231381852162, '文件管理', 1775500307898949634, 20, 'file', 'operator/oss/index', NULL, 1, 0, 'C', '0', '0', NULL, 'material-symbols-light:folder', 103, 1, '2024-10-07 21:24:27', 1, '2024-12-27 23:03:04', '');
|
||||
INSERT INTO `sys_menu` VALUES (1898286496441393153, '知识库管理', 1775500307898949634, 10, 'knowledgeBase', 'operator/knowledgeBase/index', NULL, 1, 0, 'C', '0', '0', '', 'garden:knowledge-base-26', 103, 1, '2025-03-08 16:15:44', 1, '2025-03-10 00:21:26', '');
|
||||
INSERT INTO `sys_menu` VALUES (1906674838461321217, '配置信息', 1775500307898949634, 13, 'configurationManage', 'operator/configurationManage/index', '', 1, 0, 'C', '0', '0', 'system:config:list', 'mdi:archive-cog-outline', 103, 1, '2025-03-31 19:48:48', 1, '2025-03-31 19:59:58', '配置信息菜单');
|
||||
INSERT INTO `sys_menu` VALUES (1906674838461321218, '配置信息查询', 1906674838461321217, 1, '#', '', NULL, 1, 0, 'F', '0', '0', 'system:config:query', '#', 103, 1, '2025-03-31 19:48:48', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1906674838461321219, '配置信息新增', 1906674838461321217, 2, '#', '', NULL, 1, 0, 'F', '0', '0', 'system:config:add', '#', 103, 1, '2025-03-31 19:48:48', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1906674838461321220, '配置信息修改', 1906674838461321217, 3, '#', '', NULL, 1, 0, 'F', '0', '0', 'system:config:edit', '#', 103, 1, '2025-03-31 19:48:48', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1906674838461321221, '配置信息删除', 1906674838461321217, 4, '#', '', NULL, 1, 0, 'F', '0', '0', 'system:config:remove', '#', 103, 1, '2025-03-31 19:48:48', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1906674838461321222, '配置信息导出', 1906674838461321217, 5, '#', '', NULL, 1, 0, 'F', '0', '0', 'system:config:export', '#', 103, 1, '2025-03-31 19:48:48', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1929170702299045890, '提示词模板', 1775500307898949634, 1, 'promptTemplate', 'operator/promptTemplate/index', '', 1, 0, 'C', '0', '0', 'system:promptTemplate:list', 'fluent:prompt-16-filled', 103, 1, '2025-09-17 16:43:40', NULL, NULL, '提示词模板菜单');
|
||||
INSERT INTO `sys_menu` VALUES (1929170702299045891, '提示词模板查询', 1929170702299045890, 1, '#', '', NULL, 1, 0, 'F', '0', '0', 'system:promptTemplate:query', '#', 103, 1, '2025-09-17 16:43:40', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1929170702299045892, '提示词模板新增', 1929170702299045890, 2, '#', '', NULL, 1, 0, 'F', '0', '0', 'system:promptTemplate:add', '#', 103, 1, '2025-09-17 16:43:40', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1929170702299045893, '提示词模板修改', 1929170702299045890, 3, '#', '', NULL, 1, 0, 'F', '0', '0', 'system:promptTemplate:edit', '#', 103, 1, '2025-09-17 16:43:40', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1929170702299045894, '提示词模板删除', 1929170702299045890, 4, '#', '', NULL, 1, 0, 'F', '0', '0', 'system:promptTemplate:remove', '#', 103, 1, '2025-09-17 16:43:40', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1929170702299045895, '提示词模板导出', 1929170702299045890, 5, '#', '', NULL, 1, 0, 'F', '0', '0', 'system:promptTemplate:export', '#', 103, 1, '2025-09-17 16:43:40', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1944213468857495553, '模型分组', 2000, 1, 'schemaGroup', 'dev/schemaGroup/index', NULL, 1, 0, 'C', '0', '0', NULL, '#', 103, 1, '2025-07-13 09:53:07', 1, '2025-07-13 09:54:45', '模型分组菜单');
|
||||
INSERT INTO `sys_menu` VALUES (1944213468857495554, '模型分组查询', 1944213468857495553, 1, '#', '', NULL, 1, 0, 'F', '0', '0', 'dev:schemaGroup:list', '#', 103, 1, '2025-06-24 19:06:58', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1944213468857495555, '模型分组新增', 1944213468857495553, 2, '#', '', NULL, 1, 0, 'F', '0', '0', 'dev:schemaGroup:add', '#', 103, 1, '2025-06-24 19:06:58', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1944213468857495556, '模型分组修改', 1944213468857495553, 3, '#', '', NULL, 1, 0, 'F', '0', '0', 'dev:schemaGroup:edit', '#', 103, 1, '2025-06-24 19:06:58', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1944213468857495557, '模型分组删除', 1944213468857495553, 4, '#', '', NULL, 1, 0, 'F', '0', '0', 'dev:schemaGroup:remove', '#', 103, 1, '2025-06-24 19:06:58', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1944229086906281985, '数据模型', 2000, 2, 'schema', 'dev/schema/index', NULL, 1, 0, 'C', '0', '0', NULL, '#', 103, 1, '2025-07-13 10:55:11', NULL, '2025-07-13 10:55:11', '数据模型菜单');
|
||||
INSERT INTO `sys_menu` VALUES (1944229086906281986, '模型数据查询', 1944229086906281985, 1, '#', '', NULL, 1, 0, 'F', '0', '0', 'dev:schema:list', '#', 103, 1, '2025-06-24 19:06:58', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1944229086906281987, '模型数据新增', 1944229086906281985, 2, '#', '', NULL, 1, 0, 'F', '0', '0', 'dev:schema:add', '#', 103, 1, '2025-06-24 19:06:58', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1944229086906281988, '模型数据修改', 1944229086906281985, 3, '#', '', NULL, 1, 0, 'F', '0', '0', 'dev:schema:edit', '#', 103, 1, '2025-06-24 19:06:58', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1944229086906281989, '模型数据删除', 1944229086906281985, 4, '#', '', NULL, 1, 0, 'F', '0', '0', 'dev:schema:remove', '#', 103, 1, '2025-06-24 19:06:58', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1946466176918249473, '模型字段管理', 2000, 3, 'schemaField', 'dev/schemaField/index', NULL, 1, 0, 'C', '0', '0', NULL, '#', 103, 1, '2025-07-19 15:04:35', NULL, '2025-07-19 15:04:35', '模型字段管理菜单');
|
||||
INSERT INTO `sys_menu` VALUES (1946466176918249474, '模型字段管理查询', 1946466176918249473, 1, '#', '', NULL, 1, 0, 'F', '0', '0', 'dev:schemaField:list', '#', 103, 1, '2025-06-24 19:06:58', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1946466176918249475, '模型字段管理新增', 1946466176918249473, 2, '#', '', NULL, 1, 0, 'F', '0', '0', 'dev:schemaField:add', '#', 103, 1, '2025-06-24 19:06:58', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1946466176918249476, '模型字段管理修改', 1946466176918249473, 3, '#', '', NULL, 1, 0, 'F', '0', '0', 'dev:schemaField:edit', '#', 103, 1, '2025-06-24 19:06:58', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1946466176918249477, '模型字段管理删除', 1946466176918249473, 4, '#', '', NULL, 1, 0, 'F', '0', '0', 'dev:schemaField:remove', '#', 103, 1, '2025-06-24 19:06:58', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1946483381643743233, '知识库角色管理', 1775500307898949634, 12, 'knowledgeRole', 'operator/knowledgeRole/index', NULL, 1, 0, 'C', '0', '0', NULL, 'ri:user-3-fill', 103, 1, '2025-07-19 16:41:17', NULL, NULL, '知识库角色管理');
|
||||
INSERT INTO `sys_menu` VALUES (1971550631887237121, '数字人管理', 0, 0, 'aihuman', '', NULL, 1, 0, 'M', '0', '0', NULL, 'mdi:account-cog', NULL, NULL, '2025-09-26 20:21:15', NULL, '2025-09-26 20:21:15', '');
|
||||
INSERT INTO `sys_menu` VALUES (1971582278942666752, '交互数字人配置', 1971550631887237121, 1, 'aihumanConfig', 'aihuman/aihumanConfig/index', NULL, 1, 0, 'C', '0', '0', 'aihuman:aihumanConfig:list', '#', 103, 1, '2025-09-26 22:40:40', 1, '2025-09-26 22:43:10', '交互数字人配置菜单');
|
||||
INSERT INTO `sys_menu` VALUES (1971582278942666753, '交互数字人配置查询', 1971582278942666752, 1, '#', '', NULL, 1, 0, 'F', '0', '0', 'aihuman:aihumanConfig:query', '#', 103, 1, '2025-09-26 22:40:40', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1971582278942666754, '交互数字人配置新增', 1971582278942666752, 2, '#', '', NULL, 1, 0, 'F', '0', '0', 'aihuman:aihumanConfig:add', '#', 103, 1, '2025-09-26 22:40:40', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1971582278942666755, '交互数字人配置修改', 1971582278942666752, 3, '#', '', NULL, 1, 0, 'F', '0', '0', 'aihuman:aihumanConfig:edit', '#', 103, 1, '2025-09-26 22:40:40', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1971582278942666756, '交互数字人配置删除', 1971582278942666752, 4, '#', '', NULL, 1, 0, 'F', '0', '0', 'aihuman:aihumanConfig:remove', '#', 103, 1, '2025-09-26 22:40:40', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1971582278942666757, '交互数字人配置导出', 1971582278942666752, 5, '#', '', NULL, 1, 0, 'F', '0', '0', 'aihuman:aihumanConfig:export', '#', 103, 1, '2025-09-26 22:40:40', NULL, NULL, '');
|
||||
INSERT INTO `sys_menu` VALUES (1972543718952386561, 'Live2D数字人体验', 1971550631887237121, 10, 'aihumanPublish', 'aihuman/aihumanPublish/index', NULL, 1, 0, 'C', '0', '0', NULL, '#', NULL, NULL, '2025-09-29 14:07:25', 1, '2025-09-29 14:36:28', '');
|
||||
|
||||
SET FOREIGN_KEY_CHECKS = 1;
|
||||
|
||||
|
||||
|
||||
@@ -1,54 +0,0 @@
|
||||
-- 菜单 SQL
|
||||
insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark)
|
||||
values(1954103099019309056, 'MCP', '2000', '1', 'mcpInfo', 'operator/mcpInfo/index', 1, 0, 'C', '0', '0', 'operator:mcpInfo:list', '#', 103, 1, sysdate(), null, null, 'MCP菜单');
|
||||
|
||||
-- 按钮 SQL
|
||||
insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark)
|
||||
values(1954103099019309057, 'MCP查询', 1954103099019309056, '1', '#', '', 1, 0, 'F', '0', '0', 'operator:mcpInfo:query', '#', 103, 1, sysdate(), null, null, '');
|
||||
|
||||
insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark)
|
||||
values(1954103099019309058, 'MCP新增', 1954103099019309056, '2', '#', '', 1, 0, 'F', '0', '0', 'operator:mcpInfo:add', '#', 103, 1, sysdate(), null, null, '');
|
||||
|
||||
insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark)
|
||||
values(1954103099019309059, 'MCP修改', 1954103099019309056, '3', '#', '', 1, 0, 'F', '0', '0', 'operator:mcpInfo:edit', '#', 103, 1, sysdate(), null, null, '');
|
||||
|
||||
insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark)
|
||||
values(1954103099019309060, 'MCP删除', 1954103099019309056, '4', '#', '', 1, 0, 'F', '0', '0', 'operator:mcpInfo:remove', '#', 103, 1, sysdate(), null, null, '');
|
||||
|
||||
insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark)
|
||||
values(1954103099019309061, 'MCP导出', 1954103099019309056, '5', '#', '', 1, 0, 'F', '0', '0', 'operator:mcpInfo:export', '#', 103, 1, sysdate(), null, null, '');
|
||||
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for mcp_info
|
||||
-- ----------------------------
|
||||
DROP TABLE IF EXISTS `mcp_info`;
|
||||
CREATE TABLE `mcp_info` (
|
||||
`mcp_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||||
`server_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '服务器名称',
|
||||
`transport_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '链接方式',
|
||||
`command` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '命令',
|
||||
`arguments` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '参数',
|
||||
`env` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '环境',
|
||||
`status` tinyint(1) NULL DEFAULT NULL COMMENT '是否启用',
|
||||
`description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '工具描述',
|
||||
`create_dept` bigint(20) NULL DEFAULT NULL COMMENT '创建部门',
|
||||
`create_by` bigint(20) NULL DEFAULT NULL COMMENT '创建者',
|
||||
`create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
|
||||
`update_by` bigint(20) NULL DEFAULT NULL COMMENT '更新者',
|
||||
`update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
|
||||
`remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注',
|
||||
PRIMARY KEY (`mcp_id`) USING BTREE
|
||||
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = 'mcp工具管理' ROW_FORMAT = Dynamic;
|
||||
|
||||
-- ----------------------------
|
||||
-- Records of mcp_info
|
||||
-- ----------------------------
|
||||
INSERT INTO `mcp_info` VALUES (1, 'howtocook-mcp', 'STDIO', 'npx', '[\"-y\", \"howtocook-mcp\"]', NULL, 1, NULL, NULL, NULL, '2025-08-11 17:19:25', 1, '2025-08-11 18:24:22', NULL);
|
||||
|
||||
|
||||
INSERT INTO `ruoyi-ai`.`sys_dict_data` (`dict_code`, `tenant_id`, `dict_sort`, `dict_label`, `dict_value`, `dict_type`, `css_class`, `list_class`, `is_default`, `status`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (1954098808913211393, '000000', 0, 'STDIO', 'STDIO', 'mcp_transport_type', NULL, '', 'N', '0', NULL, NULL, '2025-08-09 16:33:56', 1, '2025-08-09 16:34:19', NULL);
|
||||
INSERT INTO `ruoyi-ai`.`sys_dict_data` (`dict_code`, `tenant_id`, `dict_sort`, `dict_label`, `dict_value`, `dict_type`, `css_class`, `list_class`, `is_default`, `status`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (1954098960432443394, '000000', 1, 'SSE', 'SSE', 'mcp_transport_type', NULL, '', 'N', '0', NULL, NULL, '2025-08-09 16:34:32', NULL, '2025-08-09 16:34:32', NULL);
|
||||
INSERT INTO `ruoyi-ai`.`sys_dict_data` (`dict_code`, `tenant_id`, `dict_sort`, `dict_label`, `dict_value`, `dict_type`, `css_class`, `list_class`, `is_default`, `status`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (1954099421436784642, '000000', 2, 'HTTP', 'HTTP', 'mcp_transport_type', NULL, '', 'N', '0', NULL, NULL, '2025-08-09 16:36:22', NULL, '2025-08-09 16:36:22', NULL);
|
||||
INSERT INTO `ruoyi-ai`.`sys_dict_type` (`dict_id`, `tenant_id`, `dict_name`, `dict_type`, `status`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (1954098639622713345, '000000', 'mcp链接方式', 'mcp_transport_type', '0', NULL, NULL, '2025-08-09 16:33:16', NULL, '2025-08-09 16:33:16', NULL);
|
||||
|
||||
@@ -1,13 +0,0 @@
|
||||
-- 为 chat_model 表添加 provider_name 字段
|
||||
-- 变更日期: 2025-10-04
|
||||
-- 负责人: Robust_H
|
||||
-- 说明: 嵌入模型供应商 (用于实现动态选择嵌入模型实现类)
|
||||
ALTER TABLE `ruoyi-ai`.chat_model
|
||||
ADD COLUMN `provider_name` varchar(20) DEFAULT NULL COMMENT '模型供应商' AFTER `model_name`;
|
||||
|
||||
-- 修改 knowledge_info 中的 ‘embedding_model_name’ 为 ‘embedding_model_id’
|
||||
-- 变更日期: 2025-10-04
|
||||
-- 负责人: Robust_H
|
||||
-- 说明: 用于区分多个供应商实现同一嵌入模型的情况
|
||||
ALTER TABLE `ruoyi-ai`.knowledge_info
|
||||
ADD COLUMN `embedding_model_id` bigint DEFAULT NULL COMMENT '模型id' AFTER `embedding_model_name`;
|
||||
@@ -1,35 +0,0 @@
|
||||
-- ========================================
|
||||
-- 为 graph_build_task 表添加缺失字段
|
||||
-- ========================================
|
||||
-- 执行日期: 2025-10-11
|
||||
-- 说明: 添加 create_dept 和 update_by 字段以符合 MyBatis-Plus BaseEntity 规范
|
||||
-- ========================================
|
||||
|
||||
-- 检查表是否存在
|
||||
SELECT 'Adding fields to graph_build_task table...' AS status;
|
||||
|
||||
-- 添加 create_dept 字段(如果不存在)
|
||||
ALTER TABLE `graph_build_task`
|
||||
ADD COLUMN `create_dept` BIGINT(20) NULL COMMENT '创建部门' AFTER `end_time`;
|
||||
|
||||
-- 添加 update_by 字段(如果已存在 create_by 但缺少 update_by)
|
||||
-- 注意:update_by 应该在 create_time 之前
|
||||
ALTER TABLE `graph_build_task`
|
||||
ADD COLUMN `update_by` VARCHAR(64) DEFAULT '' COMMENT '更新者' AFTER `create_by`;
|
||||
|
||||
-- 验证字段是否添加成功
|
||||
SELECT 'Fields added successfully!' AS status;
|
||||
|
||||
-- 查看表结构
|
||||
DESCRIBE `graph_build_task`;
|
||||
|
||||
-- ========================================
|
||||
-- 说明
|
||||
-- ========================================
|
||||
-- create_dept: 创建部门ID,与创建者关联
|
||||
-- update_by: 更新者用户名或ID
|
||||
--
|
||||
-- 这两个字段是 MyBatis-Plus BaseEntity 的标准字段
|
||||
-- 添加后可以正常使用自动填充功能
|
||||
-- ========================================
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user