16 Commits

Author SHA1 Message Date
ageerle
be12ebadbe feat: 更新项目介绍 2025-11-07 18:37:56 +08:00
ageerle
a5fc55f50a feat: 更新项目介绍 2025-11-07 17:15:36 +08:00
ageerle
7186afbbc4 feat(yml): 默认关闭知识图谱功能,移除无用配置 2025-11-07 16:56:40 +08:00
ageerle
1fba109cce Merge pull request #237 from xiaonieli7/main
fix(billing): 当 knowledge.graph.enabled=false 时:所有知识图谱相关的 Bean 都不会被创建…
2025-11-07 16:53:17 +08:00
ageerle
d8382bfb44 feat(sql): 合并sql文件 2025-11-07 16:50:54 +08:00
xiaonieli7
2353b0adf6 Merge branch 'ageerle:main' into main 2025-11-07 16:26:46 +08:00
Administrator
dcacd8753f fix(billing): 当 knowledge.graph.enabled=false 时:所有知识图谱相关的 Bean 都不会被创建Neo4j 配置不会被加载即使没有配置 Neo4j 连接信息,默认禁用了知识图谱功能 2025-11-07 16:15:35 +08:00
ageerle
aca72a5892 Merge pull request #234 from seven-ocean/feature/aihuman
add:添加真人数字人
2025-11-07 14:42:18 +08:00
Maxchen
362307e4ba Merge remote-tracking branch 'origin/feature/aihuman' into feature/aihuman 2025-11-07 14:40:53 +08:00
Maxchen
cb26e452bb 完成火山引擎适配 2025-11-07 11:54:11 +08:00
Maxchen
e402330692 add:添加火山引擎语音合成 2025-11-06 19:43:52 +08:00
Maxchen
f3e1aa6cdd 从Git跟踪中移除application-dev.yml文件,使其不再被提交 2025-10-28 11:36:29 +08:00
Maxchen
c1d830bfd6 Resolve conflicts in application-dev.yml 2025-10-28 11:25:33 +08:00
Maxchen
c06ae8271d 排除generator.yml文件并更新.gitignore 2025-10-28 10:42:52 +08:00
Maxchen
e71d9faf8d 排除application-dev.yml文件并更新.gitignore 2025-10-28 10:32:55 +08:00
Maxchen
0d403b6725 add:添加真人数字人 2025-10-27 14:04:42 +08:00
53 changed files with 3041 additions and 1380 deletions

BIN
.gitignore vendored

Binary file not shown.

View File

@@ -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>

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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>

View File

@@ -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);
}
}

View File

@@ -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("停止真人交互数字人任务失败或没有正在运行的任务");
}
}
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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> {
}

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -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");
}
}
}

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -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);
}
}
}
}

View File

@@ -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);
}
}

View File

@@ -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);
}

View File

@@ -0,0 +1,4 @@
package org.ruoyi.aihuman.service;
public interface AihumanVolcengineService {
}

View File

@@ -0,0 +1,4 @@
package org.ruoyi.aihuman.service.impl;
public class AihumanVolcengineServiceImpl {
}

View File

@@ -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, '');

View File

@@ -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();
}
}
}

View File

@@ -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>

View File

@@ -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_

View File

@@ -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 {
/**

View File

@@ -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 {

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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
-- ----------------------------

View File

@@ -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

View File

@@ -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', '');

View File

@@ -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;

View File

@@ -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);

View File

@@ -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_nameembedding_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`;

View File

@@ -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