Compare commits
212 Commits
96c53390aa
...
v3.1.0
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3c175ba28d | ||
|
|
e34592c3d4 | ||
|
|
fd044a4752 | ||
|
|
6e264ad500 | ||
|
|
83fd1ee983 | ||
|
|
7640de34e5 | ||
|
|
77846601ee | ||
|
|
b80dc6e23f | ||
|
|
176cc67a5c | ||
|
|
afaa86ef6e | ||
|
|
d1a820728f | ||
|
|
11bb1dba0f | ||
|
|
345d2819d8 | ||
|
|
36e3cf8c52 | ||
|
|
06ff95cdc3 | ||
|
|
9adeee6c83 | ||
|
|
e42d35f3bf | ||
|
|
a69d1f51b9 | ||
|
|
911ae6cb1f | ||
|
|
9a2f326e42 | ||
|
|
46a8d6b552 | ||
|
|
cf5423f69f | ||
|
|
177375a7b7 | ||
|
|
016bdbdd94 | ||
|
|
41e0dcb528 | ||
|
|
787e447d09 | ||
|
|
9c092ae3bb | ||
|
|
42bc8fea95 | ||
|
|
c4fc1e6fcf | ||
|
|
6f6d0893ec | ||
|
|
a6a55202a3 | ||
|
|
24bee53f9e | ||
|
|
afc9d3d17d | ||
|
|
97ce15d116 | ||
|
|
879fe48945 | ||
|
|
5d834d924a | ||
|
|
fece90b307 | ||
|
|
06d110ed16 | ||
|
|
dfcadda2bb | ||
|
|
3c9546ded9 | ||
|
|
a3d82e092e | ||
|
|
96a1b741df | ||
|
|
e7b7d1d084 | ||
|
|
efc30c3ac8 | ||
|
|
2ae13aafd4 | ||
|
|
e925050207 | ||
|
|
7aa67cfc2f | ||
|
|
6d38e2bf25 | ||
|
|
8ed5e61f63 | ||
|
|
c3c89f8cc8 | ||
|
|
a3a6bdbc55 | ||
|
|
07d9fc1f45 | ||
|
|
73a60e3591 | ||
|
|
c79848c654 | ||
|
|
ec092a11c3 | ||
|
|
9a7b727413 | ||
|
|
b8d16b7669 | ||
|
|
058a4aee2a | ||
|
|
1b50c7f9f1 | ||
|
|
e7f53fd55f | ||
|
|
07bdc5e585 | ||
|
|
e1b8a5f011 | ||
|
|
80ca76ea37 | ||
|
|
2c6ff66830 | ||
|
|
4f79a66559 | ||
|
|
22883b4334 | ||
|
|
081da6d18d | ||
|
|
74eb5b2530 | ||
|
|
b0328fe0ef | ||
|
|
2ee0aae57e | ||
|
|
d9c3de660a | ||
|
|
ccbf5c9520 | ||
|
|
c4f7c1f5d0 | ||
|
|
1208c46cca | ||
|
|
06a63c377e | ||
|
|
c1fc02894b | ||
|
|
0fa25032a3 | ||
|
|
28ad29d6ed | ||
|
|
bf7b5eac72 | ||
|
|
d602b805bd | ||
|
|
9cf18904bb | ||
|
|
2f39fa0f53 | ||
|
|
d2005cfa48 | ||
|
|
4e38f853f3 | ||
|
|
3cfb185dde | ||
|
|
ef99c540bb | ||
|
|
b9097b4989 | ||
|
|
3071bfd0f9 | ||
|
|
7bb938c145 | ||
|
|
75b21d3633 | ||
|
|
7ed9d8def4 | ||
|
|
63ed7ddb02 | ||
|
|
11696a016d | ||
|
|
5d14eb20af | ||
|
|
1a10104751 | ||
|
|
f95cb17933 | ||
|
|
0687b49542 | ||
|
|
27ad00ac3a | ||
|
|
c84d6247b0 | ||
|
|
f582f38570 | ||
|
|
13800dc389 | ||
|
|
619d9b1e84 | ||
|
|
556cc93f14 | ||
|
|
a50375616e | ||
|
|
e33447d023 | ||
|
|
7be277b3e6 | ||
|
|
5fa385e90b | ||
|
|
0a78966737 | ||
|
|
0eb7f00867 | ||
|
|
00ce7f2d98 | ||
|
|
003c066361 | ||
|
|
a5e7c59fd4 | ||
|
|
accac603cf | ||
|
|
7c96c730e6 | ||
|
|
a2dbdb30ff | ||
|
|
772e4af9bf | ||
|
|
e601eb6db5 | ||
|
|
84dbc2cfbf | ||
|
|
f160ec714b | ||
|
|
a8bd4b47a0 | ||
|
|
6c4c661516 | ||
|
|
b85c17a126 | ||
|
|
a59ddf6070 | ||
|
|
797ecbb054 | ||
|
|
b6b78afea9 | ||
|
|
0690156362 | ||
|
|
02240f3fd0 | ||
|
|
dc1e84bc52 | ||
|
|
4977df0ba8 | ||
|
|
27211b67f9 | ||
|
|
1600ab384e | ||
|
|
418805a1ef | ||
|
|
4c4b52bca7 | ||
|
|
7245259bc4 | ||
|
|
6690c8204c | ||
|
|
d8fc597f85 | ||
|
|
7f1146ecae | ||
|
|
0130028952 | ||
|
|
5a716da5a6 | ||
|
|
2470ec7573 | ||
|
|
e3fb25fba6 | ||
|
|
a916f14efc | ||
|
|
523628ade6 | ||
|
|
2259a2f717 | ||
|
|
8df37274da | ||
|
|
393057ab24 | ||
|
|
2aa7e0f4f1 | ||
|
|
b2d2fb34b8 | ||
|
|
c1e2a03178 | ||
|
|
fd38d2030e | ||
|
|
a42f881b67 | ||
|
|
20d531c0db | ||
|
|
1e6046cf52 | ||
|
|
495f2de6ef | ||
|
|
e97bd4e201 | ||
|
|
70e5e393ef | ||
|
|
8954f59cd7 | ||
|
|
c78b1a14a9 | ||
|
|
e768c4b356 | ||
|
|
d059f50ba6 | ||
|
|
26bcfbba8a | ||
|
|
d6e4a50d6e | ||
|
|
0a115f289e | ||
|
|
31e8df8bc0 | ||
|
|
ee477213e0 | ||
|
|
1e6e236d3c | ||
|
|
593a0d0049 | ||
|
|
d4f8f91893 | ||
|
|
f25ebdf9ec | ||
|
|
32b8144b56 | ||
|
|
b40805cb57 | ||
|
|
008f64617f | ||
|
|
3539e222d2 | ||
|
|
c4d1ea974d | ||
|
|
ace7e961a4 | ||
|
|
5dc21653c0 | ||
|
|
d0d4b2229f | ||
|
|
07c9727345 | ||
|
|
689adf079d | ||
|
|
1d1b72c6e2 | ||
|
|
d9bdce1d8a | ||
|
|
885d46a4aa | ||
|
|
420e05ecf3 | ||
|
|
afa3c78180 | ||
|
|
ee8c882b6f | ||
|
|
69ec2a33a4 | ||
|
|
1cd8ae1cd9 | ||
|
|
91a44e1ba8 | ||
|
|
4a36aaa780 | ||
|
|
c78b456dbf | ||
|
|
e8c187125f | ||
|
|
7b8cfe02a1 | ||
|
|
eb2e8f3ff8 | ||
|
|
2f7bff0bf0 | ||
|
|
c89f9657f3 | ||
|
|
588c1730a6 | ||
|
|
3f1506b34b | ||
|
|
deea428bfa | ||
|
|
66f133f089 | ||
|
|
e5ed5d0ef6 | ||
|
|
f04842ae12 | ||
|
|
77aeabb4be | ||
|
|
f63ccbe7bd | ||
|
|
1087f86259 | ||
|
|
a041acfdbb | ||
|
|
b854885c99 | ||
|
|
777c899651 | ||
|
|
7c7d5838cd | ||
|
|
995507e757 | ||
|
|
f155bc284d | ||
|
|
c22c5eac7f | ||
|
|
9df246321e |
32
.editorconfig
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
# http://editorconfig.org
|
||||||
|
root = true
|
||||||
|
|
||||||
|
# 所有文件 ([*]):
|
||||||
|
# 使用空格缩进,每级 4 个空格
|
||||||
|
# UTF-8 编码
|
||||||
|
# Unix 风格换行符 (LF)
|
||||||
|
# 自动删除行尾空格
|
||||||
|
# 文件末尾自动添加空行
|
||||||
|
# JSON/YAML 文件:
|
||||||
|
# 缩进改为 2 个空格
|
||||||
|
# Markdown 文件:
|
||||||
|
# 不在末尾添加空行
|
||||||
|
# 保留行尾空格(Markdown 语法需要)
|
||||||
|
# 作用:
|
||||||
|
# 支持此标准的编辑器(VS Code、IDEA、Sublime 等)会自动读取并应用这些规则,确保不同开发者使用不同编辑器时,代码格式保持一致。
|
||||||
|
|
||||||
|
|
||||||
|
[*]
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 4
|
||||||
|
charset = utf-8
|
||||||
|
end_of_line = lf
|
||||||
|
trim_trailing_whitespace = true
|
||||||
|
insert_final_newline = true
|
||||||
|
|
||||||
|
[*.{json,yml,yaml}]
|
||||||
|
indent_size = 2
|
||||||
|
|
||||||
|
[*.md]
|
||||||
|
insert_final_newline = false
|
||||||
|
trim_trailing_whitespace = false
|
||||||
41
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
---
|
||||||
|
name: 漏洞报告
|
||||||
|
about: 报告项目中的Bug或安全问题
|
||||||
|
title: '[Bug] '
|
||||||
|
labels: 'bug'
|
||||||
|
assignees: ''
|
||||||
|
---
|
||||||
|
|
||||||
|
## 问题描述
|
||||||
|
|
||||||
|
简要描述遇到的问题:
|
||||||
|
|
||||||
|
## 复现步骤
|
||||||
|
|
||||||
|
1.
|
||||||
|
2.
|
||||||
|
3.
|
||||||
|
|
||||||
|
## 期望行为
|
||||||
|
|
||||||
|
描述你期望发生的情况:
|
||||||
|
|
||||||
|
## 实际行为
|
||||||
|
|
||||||
|
描述实际发生的情况:
|
||||||
|
|
||||||
|
## 环境信息
|
||||||
|
|
||||||
|
| 项目 | 信息 |
|
||||||
|
|:---|:---|
|
||||||
|
| 操作系统 | |
|
||||||
|
| JDK版本 | |
|
||||||
|
| 项目版本 | |
|
||||||
|
|
||||||
|
## 截图/日志
|
||||||
|
|
||||||
|
如有相关信息,请在此粘贴:
|
||||||
|
|
||||||
|
## 补充说明
|
||||||
|
|
||||||
|
其他补充信息:
|
||||||
1
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
blank_issues_enabled: true
|
||||||
15
.github/ISSUE_TEMPLATE/custom.md
vendored
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
---
|
||||||
|
name: 自定义
|
||||||
|
about: 其他问题或讨论
|
||||||
|
title: ''
|
||||||
|
labels: ''
|
||||||
|
assignees: ''
|
||||||
|
---
|
||||||
|
|
||||||
|
## 描述
|
||||||
|
|
||||||
|
请详细描述你的问题或需求:
|
||||||
|
|
||||||
|
## 补充信息
|
||||||
|
|
||||||
|
如有其他补充,请在此填写:
|
||||||
57
.github/ISSUE_TEMPLATE/enterprise-collaboration.md
vendored
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
---
|
||||||
|
name: 企业AI应用合作登记
|
||||||
|
about: 登记企业信息与合作意向,获取免费技术支持
|
||||||
|
title: '[合作登记] 企业AI应用需求登记'
|
||||||
|
labels: '合作登记'
|
||||||
|
assignees: ''
|
||||||
|
---
|
||||||
|
|
||||||
|
## 登记说明
|
||||||
|
|
||||||
|
感谢您关注 RuoYi AI!我们团队今年的重点是帮助企业落地AI应用,如果贵公司符合要求,我们可以提供**免费的技术支持**。
|
||||||
|
|
||||||
|
请在下方评论中填写登记信息,格式如下:
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 登记格式预览
|
||||||
|
|
||||||
|
| 字段 | 内容 |
|
||||||
|
|:---|:---|
|
||||||
|
| 公司名称 | (必填) |
|
||||||
|
| 公司Logo地址 | (可选) |
|
||||||
|
| 所属行业 | (必填) |
|
||||||
|
| 公司所在地 | (必填) |
|
||||||
|
| 项目名称 | (必填) |
|
||||||
|
| 项目Logo地址 | (可选) |
|
||||||
|
| 项目简介 | (必填) |
|
||||||
|
| 当前AI应用状态 | □ 尚未开始 □ 规划中 □ 已有初步应用 □ 已有成熟应用 |
|
||||||
|
| 计划落地时间 | □ 1个月内 □ 1-3个月 □ 3-6个月 □ 6个月以上 |
|
||||||
|
| 当前痛点或挑战 | (可选) |
|
||||||
|
| 公司简介 | (可选) |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 可复制格式
|
||||||
|
|
||||||
|
复制下方内容并在评论中填写:
|
||||||
|
|
||||||
|
```
|
||||||
|
| 字段 | 内容 |
|
||||||
|
|:---|:---|
|
||||||
|
| 公司名称 | |
|
||||||
|
| 公司Logo地址 | |
|
||||||
|
| 所属行业 | |
|
||||||
|
| 公司所在地 | |
|
||||||
|
| 项目名称 | |
|
||||||
|
| 项目Logo地址 | |
|
||||||
|
| 项目简介 | |
|
||||||
|
| 当前AI应用状态 | |
|
||||||
|
| 计划落地时间 | |
|
||||||
|
| 当前痛点或挑战 | |
|
||||||
|
| 公司简介 | |
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
> **温馨提示**:提交的信息仅用于合作沟通,不会对外公开。
|
||||||
31
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
---
|
||||||
|
name: 想法建议
|
||||||
|
about: 提出新功能建议或改进想法
|
||||||
|
title: '[Feature] '
|
||||||
|
labels: 'enhancement'
|
||||||
|
assignees: ''
|
||||||
|
---
|
||||||
|
|
||||||
|
## 建议类型
|
||||||
|
|
||||||
|
□ 新功能 □ 功能改进 □ 文档完善 □ 其他
|
||||||
|
|
||||||
|
## 建议描述
|
||||||
|
|
||||||
|
清晰描述你的建议内容:
|
||||||
|
|
||||||
|
## 使用场景
|
||||||
|
|
||||||
|
描述这个功能在什么场景下会用到:
|
||||||
|
|
||||||
|
## 期望效果
|
||||||
|
|
||||||
|
描述你期望的效果:
|
||||||
|
|
||||||
|
## 参考示例
|
||||||
|
|
||||||
|
如有类似的参考实现或产品,请提供链接:
|
||||||
|
|
||||||
|
## 补充说明
|
||||||
|
|
||||||
|
其他补充信息:
|
||||||
107
.github/workflows/publish-images.yml
vendored
Normal file
@@ -0,0 +1,107 @@
|
|||||||
|
name: Publish Docker Images
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
tags:
|
||||||
|
- 'v*.*.*'
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: publish-images-${{ github.ref_name }}
|
||||||
|
cancel-in-progress: false
|
||||||
|
|
||||||
|
env:
|
||||||
|
REGISTRY: ghcr.io
|
||||||
|
IMAGE_OWNER: ${{ github.repository_owner }}
|
||||||
|
RELEASE_TAG: ${{ github.ref_name }}
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
publish:
|
||||||
|
name: Publish ${{ matrix.image }}
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
packages: write
|
||||||
|
attestations: write
|
||||||
|
id-token: write
|
||||||
|
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
- image: ruoyi-ai-backend
|
||||||
|
source: local
|
||||||
|
context: .
|
||||||
|
dockerfile: docs/docker/ruoyi-ai/Dockerfile.backend
|
||||||
|
- image: ruoyi-ai-mysql
|
||||||
|
source: local
|
||||||
|
context: .
|
||||||
|
dockerfile: docs/docker/ruoyi-ai/Dockerfile.mysql
|
||||||
|
- image: ruoyi-ai-admin
|
||||||
|
source: admin
|
||||||
|
context: build/ruoyi-admin
|
||||||
|
dockerfile: build/ruoyi-admin/apps/web-antd/Dockerfile
|
||||||
|
- image: ruoyi-ai-web
|
||||||
|
source: web
|
||||||
|
context: build/ruoyi-web
|
||||||
|
dockerfile: build/ruoyi-web/Dockerfile.frontend
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout backend repository
|
||||||
|
uses: actions/checkout@v6
|
||||||
|
with:
|
||||||
|
ref: ${{ env.RELEASE_TAG }}
|
||||||
|
fetch-depth: 1
|
||||||
|
|
||||||
|
- name: Checkout admin repository
|
||||||
|
if: matrix.source == 'admin'
|
||||||
|
uses: actions/checkout@v6
|
||||||
|
with:
|
||||||
|
repository: ${{ github.repository_owner }}/ruoyi-admin
|
||||||
|
ref: ${{ env.RELEASE_TAG }}
|
||||||
|
path: build/ruoyi-admin
|
||||||
|
fetch-depth: 1
|
||||||
|
|
||||||
|
- name: Checkout web repository
|
||||||
|
if: matrix.source == 'web'
|
||||||
|
uses: actions/checkout@v6
|
||||||
|
with:
|
||||||
|
repository: ${{ github.repository_owner }}/ruoyi-web
|
||||||
|
ref: ${{ env.RELEASE_TAG }}
|
||||||
|
path: build/ruoyi-web
|
||||||
|
fetch-depth: 1
|
||||||
|
|
||||||
|
- name: Set up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v3
|
||||||
|
|
||||||
|
- name: Log in to GHCR
|
||||||
|
uses: docker/login-action@v3
|
||||||
|
with:
|
||||||
|
registry: ${{ env.REGISTRY }}
|
||||||
|
username: ${{ github.actor }}
|
||||||
|
password: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
- name: Extract Docker metadata
|
||||||
|
id: meta
|
||||||
|
uses: docker/metadata-action@v5
|
||||||
|
with:
|
||||||
|
images: ${{ env.REGISTRY }}/${{ env.IMAGE_OWNER }}/${{ matrix.image }}
|
||||||
|
tags: |
|
||||||
|
type=raw,value=${{ env.RELEASE_TAG }}
|
||||||
|
type=raw,value=latest
|
||||||
|
labels: |
|
||||||
|
org.opencontainers.image.source=https://github.com/${{ github.repository }}
|
||||||
|
org.opencontainers.image.version=${{ env.RELEASE_TAG }}
|
||||||
|
|
||||||
|
- name: Build and push image
|
||||||
|
uses: docker/build-push-action@v6
|
||||||
|
with:
|
||||||
|
context: ${{ matrix.context }}
|
||||||
|
file: ${{ matrix.dockerfile }}
|
||||||
|
platforms: linux/amd64
|
||||||
|
push: true
|
||||||
|
tags: ${{ steps.meta.outputs.tags }}
|
||||||
|
labels: ${{ steps.meta.outputs.labels }}
|
||||||
|
cache-from: type=gha,scope=${{ matrix.image }}
|
||||||
|
cache-to: type=gha,mode=max,scope=${{ matrix.image }}
|
||||||
|
provenance: true
|
||||||
|
sbom: true
|
||||||
BIN
.gitignore
vendored
2
LICENSE
@@ -1,6 +1,6 @@
|
|||||||
The MIT License (MIT)
|
The MIT License (MIT)
|
||||||
|
|
||||||
Copyright (c) 2023 ruoyi-ai
|
Copyright (c) 2026 ruoyi-ai
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
this software and associated documentation files (the "Software"), to deal in
|
this software and associated documentation files (the "Software"), to deal in
|
||||||
|
|||||||
305
README.md
@@ -2,11 +2,7 @@
|
|||||||
|
|
||||||
<div align="center">
|
<div align="center">
|
||||||
|
|
||||||
[![Contributors][contributors-shield]][contributors-url]
|
[![Contributors][contributors-shield]][contributors-url] [![Forks][forks-shield]][forks-url] [![Stargazers][stars-shield]][stars-url] [![Issues][issues-shield]][issues-url] [![MIT License][license-shield]][license-url]
|
||||||
[![Forks][forks-shield]][forks-url]
|
|
||||||
[![Stargazers][stars-shield]][stars-url]
|
|
||||||
[![Issues][issues-shield]][issues-url]
|
|
||||||
[![MIT License][license-shield]][license-url]
|
|
||||||
|
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
@@ -15,142 +11,237 @@
|
|||||||
</a>
|
</a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
<img src="docs/image/logo.png" alt="RuoYi AI Logo" width="120" height="120">
|
||||||
|
|
||||||
<img src="image/00.png" alt="RuoYi AI Logo" width="120" height="120">
|
### Enterprise-Grade AI Assistant Platform
|
||||||
|
|
||||||
|
*An out-of-the-box full-stack AI platform supporting multi-agent collaboration, Supervisor mode orchestration, and multiple decision models, with advanced RAG technology and visual workflow orchestration capabilities*
|
||||||
|
|
||||||
|
**[中文](README_ZH.md)** | **[📖 Documentation](https://doc.ruoyiai.chat/)** |
|
||||||
### 企业级AI助手平台
|
**[🚀 Live Demo](https://web.ruoyiai.chat/)** | **[🐛 Report Issues](https://github.com/ageerle/ruoyi-ai/issues)** | **[💡 Feature Requests](https://github.com/ageerle/ruoyi-ai/issues)**
|
||||||
|
|
||||||
*开箱即用的智能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)**
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
## ✨ 核心亮点
|
|
||||||
|
|
||||||
### 智能AI引擎
|
|
||||||
- **多模型接入**:支持 OpenAI GPT-4、Azure、ChatGLM、通义千问、智谱AI 等主流模型
|
|
||||||
- **AI平台集成**:深度集成 **FastGPT**、**扣子(Coze)**、**DIFY** 等主流AI应用平台
|
|
||||||
- **Spring AI MCP 集成**:基于模型上下文协议,打造可扩展的AI工具生态系统
|
|
||||||
- **实时流式对话**:采用 SSE/WebSocket 技术,提供丝滑的对话体验
|
|
||||||
- **AI 编程助手**:内置智能代码分析和项目脚手架生成能力
|
|
||||||
|
|
||||||
### AI平台生态集成
|
|
||||||
- **FastGPT 深度集成**:原生支持 FastGPT API,包括知识库检索、工作流编排和上下文管理
|
|
||||||
- **扣子(Coze) 官方SDK**:集成字节跳动扣子平台官方SDK,支持Bot对话和流式响应
|
|
||||||
- **DIFY 完整兼容**:使用 DIFY Java Client,支持应用编排、工作流和知识库管理
|
|
||||||
- **统一聊天接口**:提供统一的聊天服务接口,支持多平台无缝切换和负载均衡
|
|
||||||
|
|
||||||
### 本地化RAG方案
|
|
||||||
- **私有知识库**:基于 Langchain4j 框架 + BGE-large-zh-v1.5 中文向量模型
|
|
||||||
- **多种向量库**:支持 Milvus、Weaviate、Qdrant 等主流向量数据库
|
|
||||||
- **数据安全可控**:支持完全本地部署,保护企业数据隐私
|
|
||||||
- **灵活模型部署**:兼容 Ollama、vLLM 等本地推理框架
|
|
||||||
|
|
||||||
### AI创作工具
|
|
||||||
- **AI 绘画创作**:深度集成 DALL·E-3、MidJourney、Stable Diffusion
|
|
||||||
- **智能PPT生成**:一键将文本内容转换为精美演示文稿
|
|
||||||
- **多模态理解**:支持文本、图片、文档等多种格式的智能处理
|
|
||||||
|
|
||||||
### 知识图谱与智能编排
|
|
||||||
- **知识图谱构建**:自动从文档和对话中提取实体关系,构建可视化知识网络
|
|
||||||
- **AI 流程编排**:可视化工作流设计器,支持复杂AI任务的编排和自动化执行
|
|
||||||
- **数字人交互**:集成数字人形象,提供更自然的人机交互体验
|
|
||||||
- **智能推理引擎**:基于知识图谱的智能推理和问答能力
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## 🚀 快速体验
|
## ✨ Core Features
|
||||||
|
|
||||||
### 在线演示
|
| Module | Current Capabilities |
|
||||||
- **用户端体验**:[web.pandarobot.chat](https://web.pandarobot.chat) (账号:admin 密码:admin123)
|
|:---:|---|
|
||||||
- **管理后台**:[admin.pandarobot.chat](https://admin.pandarobot.chat) (账号:admin 密码:admin123)
|
| **Model Management** | Multi-model integration (DeepSeek/Zhipu/MIMO/Bailian/OpenAI), multi-modal understanding, Coze/DIFY/FastGPT/RAGFlow platform integration |
|
||||||
|
| **Knowledge Management** | Local RAG + Vector DB (Milvus/Weaviate/Qdrant) + Document parsing |
|
||||||
|
| **Tool Management** | MCP protocol integration, Skills capability + Extensible tool ecosystem |
|
||||||
|
| **Workflow Orchestration** | Visual workflow designer, drag-and-drop node orchestration, SSE streaming execution, currently supports model calls, email sending, manual review, and other nodes |
|
||||||
|
| **Multi-Agent** | Agent framework based on Langchain4j, Supervisor mode orchestration, supports multiple decision models, can flexibly combine tools and skills |
|
||||||
|
|
||||||
### 项目源码
|
### Project Repositories
|
||||||
| 项目模块 | GitHub 仓库 | Gitee 仓库 | GitCode 仓库 |
|
|
||||||
|---------|------------|-----------|-------------|
|
|
||||||
| 🔧 后端服务 | [ruoyi-ai](https://github.com/ageerle/ruoyi-ai) | [ruoyi-ai](https://gitee.com/ageerle/ruoyi-ai) | [ruoyi-ai](https://gitcode.com/ageerle/ruoyi-ai) |
|
|
||||||
| 🎨 用户前端 | [ruoyi-web](https://github.com/ageerle/ruoyi-web) | [ruoyi-web](https://gitee.com/ageerle/ruoyi-web) | [ruoyi-web](https://gitcode.com/ageerle/ruoyi-web) |
|
|
||||||
| 🛠️ 管理后台 | [ruoyi-admin](https://github.com/ageerle/ruoyi-admin) | [ruoyi-admin](https://gitee.com/ageerle/ruoyi-admin) | [ruoyi-admin](https://gitcode.com/ageerle/ruoyi-admin) |
|
|
||||||
|
|
||||||
### 合作项目
|
| Module | GitHub Repository | Gitee Repository | GitCode Repository |
|
||||||
| 项目介绍 | GitHub 仓库 | Gitee 仓库 |
|
|----------|-------------------------------------------------------|------------------------------------------------------|--------------------------------------------------------|
|
||||||
|:--------:|:----------:|:----------:|
|
| 🔧 Backend | [ruoyi-ai](https://github.com/ageerle/ruoyi-ai) | [ruoyi-ai](https://gitee.com/ageerle/ruoyi-ai) | [ruoyi-ai](https://gitcode.com/ageerle/ruoyi-ai) |
|
||||||
| 前端简化版 | [ruoyi-element-ai](https://github.com/element-plus-x/ruoyi-element-ai) | [ruoyi-element-ai](https://gitee.com/he-jiayue/ruoyi-element-ai) |
|
| 🎨 User Frontend | [ruoyi-web](https://github.com/ageerle/ruoyi-web) | [ruoyi-web](https://gitee.com/ageerle/ruoyi-web) | [ruoyi-web](https://gitcode.com/ageerle/ruoyi-web) |
|
||||||
|
| 🛠️ Admin Panel | [ruoyi-admin](https://github.com/ageerle/ruoyi-admin) | [ruoyi-admin](https://gitee.com/ageerle/ruoyi-admin) | [ruoyi-admin](https://gitcode.com/ageerle/ruoyi-admin) |
|
||||||
|
| 🎬 Drama | [ruoyi-drama](https://github.com/ageerle/ruoyi-drama) | [ruoyi-drama](https://gitee.com/ageerle/ruoyi-drama) | [ruoyi-drama](https://gitcode.com/ageerle/ruoyi-drama) |
|
||||||
|
| 🤖 Copilot | [ruoyi-copilot](https://github.com/ageerle/ruoyi-copilot) | [ruoyi-copilot](https://gitee.com/ageerle/ruoyi-copilot) | [ruoyi-copilot](https://gitcode.com/ageerle/ruoyi-copilot) |
|
||||||
|
| 📱 Mini-App | [ruoyi-uniapp](https://github.com/ageerle/ruoyi-uniapp) | [ruoyi-uniapp](https://gitee.com/ageerle/ruoyi-uniapp) | [ruoyi-uniapp](https://gitcode.com/ageerle/ruoyi-uniapp) |
|
||||||
|
|
||||||
|
### Partner Projects
|
||||||
|
| Project Name | GitHub Repository | Gitee Repository |
|
||||||
|
|----------------|-------------------------------------------------------|------------------------------------------------------|
|
||||||
|
| element-plus-x | [element-plus-x](https://github.com/element-plus-x/Element-Plus-X) | [element-plus-x](https://gitee.com/he-jiayue/element-plus-x) |
|
||||||
|
|
||||||
|
## 🛠️ Technical Architecture
|
||||||
|
|
||||||
|
### Core Framework
|
||||||
|
- **Backend**: Spring Boot 3.5.8 + Langchain4j
|
||||||
|
- **Data Storage**: MySQL 8.0 + Redis + Vector Databases (Milvus/Weaviate/Qdrant)
|
||||||
|
- **Frontend**: Vue 3 + Vben Admin + element-plus-x
|
||||||
|
- **Security**: Sa-Token + JWT dual-layer security
|
||||||
|
- **Document Processing**: PDF, Word, Excel parsing, intelligent image analysis
|
||||||
|
- **Real-time Communication**: WebSocket real-time communication, SSE streaming response
|
||||||
|
- **System Monitoring**: Comprehensive logging system, performance monitoring, service health checks
|
||||||
|
|
||||||
## 🛠️ 技术架构
|
## 🐳 Docker Deployment
|
||||||
|
|
||||||
### 核心框架
|
This project provides two Docker deployment methods:
|
||||||
- **后端架构**:Spring Boot 3.4 + Spring AI + Langchain4j
|
|
||||||
- **数据存储**:MySQL 8.0 + Redis + 向量数据库(Milvus/Weaviate/Qdrant)
|
|
||||||
- **前端技术**:Vue 3 + Vben Admin + Naive UI
|
|
||||||
- **安全认证**:Sa-Token + JWT 双重保障
|
|
||||||
|
|
||||||
### 系统组件
|
### Method 1: One-click Start All Services (Recommended)
|
||||||
- **文档处理**:PDF、Word、Excel 解析,图像智能分析
|
|
||||||
- **实时通信**:WebSocket 实时通信,SSE 流式响应
|
|
||||||
- **系统监控**:完善的日志体系、性能监控、服务健康检查
|
|
||||||
|
|
||||||
## 📚 使用文档
|
Use `docker-compose-all.yaml` to start all services at once (including backend, admin panel, user frontend, and dependencies):
|
||||||
|
|
||||||
想要深入了解安装部署、功能配置和二次开发?
|
```bash
|
||||||
|
# Clone the repository
|
||||||
|
git clone https://github.com/ageerle/ruoyi-ai.git
|
||||||
|
cd ruoyi-ai
|
||||||
|
|
||||||
**👉 [完整使用文档](https://doc.pandarobot.chat)**
|
# Start all services (pull pre-built images from GHCR)
|
||||||
|
docker compose -f docs/docker/ruoyi-ai/docker-compose-all.yaml up -d
|
||||||
|
|
||||||
## 🤝 参与贡献
|
# Check service status
|
||||||
|
docker compose -f docs/docker/ruoyi-ai/docker-compose-all.yaml ps
|
||||||
|
|
||||||
我们热烈欢迎社区贡献!无论您是资深开发者还是初学者,都可以为项目贡献力量 💪
|
# Access services
|
||||||
|
# Admin Panel: http://localhost:25666 (admin / admin123)
|
||||||
|
# User Frontend: http://localhost:25137
|
||||||
|
# Backend API: http://localhost:26039
|
||||||
|
```
|
||||||
|
|
||||||
### 贡献方式
|
### Method 2: Step-by-step Deployment (Source Build)
|
||||||
1. **Fork** 项目到您的账户
|
|
||||||
2. **创建分支** (`git checkout -b feature/新功能名称`)
|
|
||||||
3. **提交代码** (`git commit -m '添加某某功能'`)
|
|
||||||
4. **推送分支** (`git push origin feature/新功能名称`)
|
|
||||||
5. **发起 Pull Request**
|
|
||||||
|
|
||||||
> 💡 **小贴士**:建议将 PR 提交到 GitHub,我们会自动同步到其他代码托管平台
|
If you need to build backend services from source, follow these steps:
|
||||||
|
|
||||||
## 📄 开源协议
|
#### Step 1: Deploy Backend Service
|
||||||
|
|
||||||
本项目采用 **MIT 开源协议**,详情请查看 [LICENSE](LICENSE) 文件。
|
```bash
|
||||||
|
# Enter backend project directory
|
||||||
|
cd ruoyi-ai
|
||||||
|
|
||||||
## 🙏 特别鸣谢
|
# Start backend service (build from source)
|
||||||
|
docker-compose up -d --build
|
||||||
|
|
||||||
感谢以下优秀的开源项目为本项目提供支持:
|
# Wait for backend service to start
|
||||||
|
docker-compose logs -f backend
|
||||||
|
```
|
||||||
|
|
||||||
- [Spring AI Alibaba Copilot](https://github.com/springaialibaba/spring-ai-alibaba-copilot) - 基于spring-ai-alibaba 的智能编码助手
|
#### Step 2: Deploy Admin Panel
|
||||||
- [Spring AI](https://spring.io/projects/spring-ai) - Spring 官方 AI 集成框架
|
|
||||||
- [Langchain4j](https://github.com/langchain4j/langchain4j) - 强大的 Java LLM 开发框架
|
|
||||||
- [RuoYi-Vue-Plus](https://gitee.com/dromara/RuoYi-Vue-Plus) - 成熟的企业级快速开发框架
|
|
||||||
- [Vben Admin](https://github.com/vbenjs/vue-vben-admin) - 现代化的 Vue 后台管理模板
|
|
||||||
- [chatgpt-java](https://github.com/Grt1228/chatgpt-java) - 优秀的 ChatGPT Java SDK
|
|
||||||
|
|
||||||
## 🌐 生态伙伴
|
```bash
|
||||||
|
# Enter admin panel project directory
|
||||||
|
cd ruoyi-admin
|
||||||
|
|
||||||
- [PPIO 派欧云](https://ppinfra.com/user/register?invited_by=P8QTUY&utm_source=github_ruoyi-ai) - 提供高性价比的 GPU 算力和模型 API 服务
|
# Build and start admin panel
|
||||||
- [优云智算](https://www.compshare.cn/?ytag=GPU_YY-gh_ruoyi) - 万卡RTX40系GPU+海内外主流模型API服务,秒级响应,按量计费,新客免费用。
|
docker-compose up -d --build
|
||||||
- [胜算云](https://www.shengsuanyun.com/?from=CH_3WG71ZOS) - AI模型算力聚合超市云服务。
|
|
||||||
|
|
||||||
## 💬 社区交流
|
# Access admin panel
|
||||||
|
# URL: http://localhost:5666
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Step 3: Deploy User Frontend (Optional)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Enter user frontend project directory
|
||||||
|
cd ruoyi-web
|
||||||
|
|
||||||
|
# Build and start user frontend
|
||||||
|
docker-compose up -d --build
|
||||||
|
|
||||||
|
# Access user frontend
|
||||||
|
# URL: http://localhost:5137
|
||||||
|
```
|
||||||
|
|
||||||
|
### Service Ports
|
||||||
|
|
||||||
|
| Service | One-click Port | Step-by-step Port | Description |
|
||||||
|
|------|-------------|-------------|------|
|
||||||
|
| Admin Panel | 25666 | 5666 | Admin backend access |
|
||||||
|
| User Frontend | 25137 | 5137 | User frontend access |
|
||||||
|
| Backend Service | 26039 | 6039 | Backend API service |
|
||||||
|
| MySQL | 23306 | 23306 | Database service |
|
||||||
|
| Redis | 26379 | 6379 | Cache service |
|
||||||
|
| Weaviate | 28080 | 28080 | Vector database |
|
||||||
|
| MinIO API | 29000 | 9000 | Object storage API |
|
||||||
|
| MinIO Console | 29090 | 9090 | Object storage console |
|
||||||
|
|
||||||
|
### Image Registry
|
||||||
|
|
||||||
|
Application images are published to GitHub Container Registry (GHCR) by GitHub Actions when a release tag such as `v3.1.0` is pushed:
|
||||||
|
|
||||||
|
```
|
||||||
|
ghcr.io/ageerle/ruoyi-ai-backend:v3.1.0
|
||||||
|
ghcr.io/ageerle/ruoyi-ai-mysql:v3.1.0
|
||||||
|
ghcr.io/ageerle/ruoyi-ai-admin:v3.1.0
|
||||||
|
ghcr.io/ageerle/ruoyi-ai-web:v3.1.0
|
||||||
|
```
|
||||||
|
|
||||||
|
The Compose file defaults to `latest`. To pin a release, create `docs/docker/ruoyi-ai/.env` with `RUIYI_VERSION=v3.1.0`.
|
||||||
|
|
||||||
|
After the first workflow run, set the four GHCR packages to `Public` in GitHub so deployment servers can pull them without logging in.
|
||||||
|
|
||||||
|
The same release tag must exist in `ageerle/ruoyi-admin` and `ageerle/ruoyi-web`; the publish workflow checks out those repositories at the backend release tag before building their images.
|
||||||
|
|
||||||
|
### Common Commands
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Stop all services
|
||||||
|
docker compose -f docs/docker/ruoyi-ai/docker-compose-all.yaml down
|
||||||
|
|
||||||
|
# View service logs
|
||||||
|
docker compose -f docs/docker/ruoyi-ai/docker-compose-all.yaml logs -f [service-name]
|
||||||
|
|
||||||
|
# Restart a service
|
||||||
|
docker compose -f docs/docker/ruoyi-ai/docker-compose-all.yaml restart [service-name]
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📚 Documentation
|
||||||
|
|
||||||
|
Want to learn more about installation, deployment, configuration, and secondary development?
|
||||||
|
|
||||||
|
**👉 [Complete Documentation](https://doc.ruoyiai.chat/)**
|
||||||
|
|
||||||
|
## 🤝 Contributing
|
||||||
|
|
||||||
|
We warmly welcome community contributions! Whether you are a seasoned developer or just getting started, you can contribute to the project 💪
|
||||||
|
|
||||||
|
### How to Contribute
|
||||||
|
|
||||||
|
1. **Fork** the project to your account
|
||||||
|
2. **Create a branch** (`git checkout -b feature/new-feature-name`)
|
||||||
|
3. **Commit your changes** (`git commit -m 'Add new feature'`)
|
||||||
|
4. **Push to the branch** (`git push origin feature/new-feature-name`)
|
||||||
|
5. **Create a Pull Request**
|
||||||
|
|
||||||
|
> 💡 **Tip**: We recommend submitting PRs to GitHub, we will automatically sync to other code hosting platforms
|
||||||
|
|
||||||
|
## 📄 License
|
||||||
|
|
||||||
|
This project is licensed under the **MIT License**. See the [LICENSE](LICENSE) file for details.
|
||||||
|
|
||||||
|
## 🙏 Acknowledgments
|
||||||
|
|
||||||
|
Thanks to the following excellent open-source projects for their support:
|
||||||
|
- [Langchain4j](https://github.com/langchain4j/langchain4j) - Powerful Java LLM development framework
|
||||||
|
- [RuoYi-Vue-Plus](https://gitee.com/dromara/RuoYi-Vue-Plus) - Mature enterprise-level rapid development framework
|
||||||
|
- [Vben Admin](https://github.com/vbenjs/vue-vben-admin) - Modern Vue admin template
|
||||||
|
|
||||||
|
## 💎 Sponsors
|
||||||
|
|
||||||
|
**Thanks to the following sponsors for supporting this project:**
|
||||||
|
|
||||||
|
<a href="https://www.atlascloud.ai?ref=89F97E">
|
||||||
|
<img src="docs/image/sponsor/atlascloud_banner.png" alt="Atlas Cloud" width="160" height="80">
|
||||||
|
</a>
|
||||||
|
|
||||||
|
[Visit Atlas Cloud](https://www.atlascloud.ai?ref=89F97E&utm_source=github&utm_campaign=ruoyi-drama) · [Coding Plan Promotion](https://www.atlascloud.ai/console/coding-plan)
|
||||||
|
A full-modal AI inference platform that gives developers a unified AI API, supporting video generation, image generation, and LLMs. Connect once to access **300+ curated models**.
|
||||||
|
|
||||||
|
<a href="https://www.volcengine.com/activity/codingplan?utm_campaign=hw&utm_content=hw&utm_medium=devrel_tool_web&utm_source=OWO&utm_term=ageerle-ruoyi-ai">
|
||||||
|
<img src="docs/image/sponsor/huoshan.png" alt="Volcengine CodingPlan" width="160" height="80">
|
||||||
|
</a>
|
||||||
|
|
||||||
|
[Sign up to claim 25 million tokens — go now](https://www.volcengine.com/activity/ai618?utm_campaign=hw&utm_content=hw&utm_medium=devrel_tool_web&utm_source=OWO&utm_term=ageerle-ruoyi-ai)
|
||||||
|
Enjoy ByteDance's in-house Doubao models plus full-power open-source SOTA models, covering text, VLM, and image generation — all modalities in one stop: Seed-2.1, Seedream-5.0, GLM-5.2, DeepSeek, and more. Not just for coding — it can also tackle complex long-horizon Agent tasks!
|
||||||
|
|
||||||
|
## 💬 Community Chat
|
||||||
|
|
||||||
<div align="center">
|
<div align="center">
|
||||||
|
|
||||||
<table>
|
<table>
|
||||||
<tr>
|
<tr>
|
||||||
<td align="center">
|
<td align="center">
|
||||||
<img src="image/wx.png" alt="微信二维码" width="200" height="200"><br>
|
<img src="docs/image/wx.png" alt="WeChat QR Code" width="200" height="200"><br>
|
||||||
<strong>扫码添加作者微信</strong><br>
|
<strong>Scan to add author on WeChat</strong><br>
|
||||||
<em>邀请进群学习</em>
|
<em>Join group for learning</em>
|
||||||
</td>
|
</td>
|
||||||
<td align="center">
|
<td align="center">
|
||||||
<img src="image/qq.png" alt="QQ群二维码" width="200" height="200"><br>
|
<img src="docs/image/wx06.png" alt="WeChat QR Code" width="200" height="200"><br>
|
||||||
<strong>QQ技术交流群</strong><br>
|
<strong>WeChat Tech Exchange Group</strong><br>
|
||||||
<em>技术讨论</em>
|
<em>Technical discussion</em>
|
||||||
|
</td>
|
||||||
|
<td align="center">
|
||||||
|
<img src="docs/image/qq.png" alt="QQ Group QR Code" width="200" height="200"><br>
|
||||||
|
<strong>QQ Tech Exchange Group</strong><br>
|
||||||
|
<em>Technical discussion</em>
|
||||||
</td>
|
</td>
|
||||||
|
|
||||||
</tr>
|
</tr>
|
||||||
@@ -162,20 +253,30 @@
|
|||||||
|
|
||||||
<div align="center">
|
<div align="center">
|
||||||
|
|
||||||
**[⭐ 点个Star支持一下](https://github.com/ageerle/ruoyi-ai)** • **[🍴 Fork 开始贡献](https://github.com/ageerle/ruoyi-ai/fork)** • **[📚 English](README_EN.md)** • **[📖 查看完整文档](https://doc.pandarobot.chat)**
|
**[⭐ Star to Support](https://github.com/ageerle/ruoyi-ai)** • **[Fork to Contribute](https://github.com/ageerle/ruoyi-ai/fork)** • **[📚 中文](README_ZH.md)** • **[📖 Complete Documentation](https://doc.ruoyiai.chat/)**
|
||||||
|
|
||||||
*用 ❤️ 打造,由 RuoYi AI 开源社区维护*
|
*Built with ❤️, maintained by the RuoYi AI open-source community*
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Badge Links -->
|
<!-- Badge Links -->
|
||||||
|
|
||||||
[contributors-shield]: https://img.shields.io/github/contributors/ageerle/ruoyi-ai.svg?style=flat-square
|
[contributors-shield]: https://img.shields.io/github/contributors/ageerle/ruoyi-ai.svg?style=flat-square
|
||||||
|
|
||||||
[contributors-url]: https://github.com/ageerle/ruoyi-ai/graphs/contributors
|
[contributors-url]: https://github.com/ageerle/ruoyi-ai/graphs/contributors
|
||||||
|
|
||||||
[forks-shield]: https://img.shields.io/github/forks/ageerle/ruoyi-ai.svg?style=flat-square
|
[forks-shield]: https://img.shields.io/github/forks/ageerle/ruoyi-ai.svg?style=flat-square
|
||||||
|
|
||||||
[forks-url]: https://github.com/ageerle/ruoyi-ai/network/members
|
[forks-url]: https://github.com/ageerle/ruoyi-ai/network/members
|
||||||
|
|
||||||
[stars-shield]: https://img.shields.io/github/stars/ageerle/ruoyi-ai.svg?style=flat-square
|
[stars-shield]: https://img.shields.io/github/stars/ageerle/ruoyi-ai.svg?style=flat-square
|
||||||
|
|
||||||
[stars-url]: https://github.com/ageerle/ruoyi-ai/stargazers
|
[stars-url]: https://github.com/ageerle/ruoyi-ai/stargazers
|
||||||
|
|
||||||
[issues-shield]: https://img.shields.io/github/issues/ageerle/ruoyi-ai.svg?style=flat-square
|
[issues-shield]: https://img.shields.io/github/issues/ageerle/ruoyi-ai.svg?style=flat-square
|
||||||
|
|
||||||
[issues-url]: https://github.com/ageerle/ruoyi-ai/issues
|
[issues-url]: https://github.com/ageerle/ruoyi-ai/issues
|
||||||
|
|
||||||
[license-shield]: https://img.shields.io/github/license/ageerle/ruoyi-ai.svg?style=flat-square
|
[license-shield]: https://img.shields.io/github/license/ageerle/ruoyi-ai.svg?style=flat-square
|
||||||
|
|
||||||
[license-url]: https://github.com/ageerle/ruoyi-ai/blob/main/LICENSE
|
[license-url]: https://github.com/ageerle/ruoyi-ai/blob/main/LICENSE
|
||||||
|
|||||||
173
README_EN.md
@@ -1,173 +0,0 @@
|
|||||||
|
|
||||||
# RuoYi AI
|
|
||||||
|
|
||||||
<div align="center">
|
|
||||||
|
|
||||||
[![Contributors][contributors-shield]][contributors-url]
|
|
||||||
[![Forks][forks-shield]][forks-url]
|
|
||||||
[![Stargazers][stars-shield]][stars-url]
|
|
||||||
[![Issues][issues-shield]][issues-url]
|
|
||||||
[![MIT License][license-shield]][license-url]
|
|
||||||
|
|
||||||
<img src="image/00.png" alt="RuoYi AI Logo" width="120" height="120">
|
|
||||||
|
|
||||||
### Enterprise-Grade AI Assistant Platform
|
|
||||||
|
|
||||||
*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)**
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
## ✨ Key Features
|
|
||||||
|
|
||||||
### 🤖 Advanced AI Engine
|
|
||||||
- **Multi-Model Support**: OpenAI GPT-4, Azure, ChatGLM, Qwen, ZhipuAI
|
|
||||||
- **AI Platform Integration**: Deep integration with **FastGPT**, **Coze**, **DIFY** and other leading AI platforms
|
|
||||||
- **Spring AI MCP Integration**: Extensible tool ecosystem with Model Context Protocol
|
|
||||||
- **Streaming Chat**: Real-time SSE/WebSocket communication
|
|
||||||
- **AI Copilot**: Intelligent code analysis and project scaffolding
|
|
||||||
|
|
||||||
### 🌟 AI Platform Ecosystem
|
|
||||||
- **FastGPT Deep Integration**: Native FastGPT API support with knowledge base retrieval, workflow orchestration and context management
|
|
||||||
- **Coze Official SDK**: Integration with ByteDance Coze platform official SDK, supporting Bot conversations and streaming responses
|
|
||||||
- **DIFY Full Compatibility**: Using DIFY Java Client for app orchestration, workflows and knowledge base management
|
|
||||||
- **Unified Chat Interface**: Standardized chat service interface supporting seamless platform switching and load balancing
|
|
||||||
|
|
||||||
### 🧠 Enterprise RAG Solution
|
|
||||||
- **Local Knowledge Base**: Langchain4j + BGE-large-zh-v1.5 embeddings
|
|
||||||
- **Vector Database Support**: Milvus, Weaviate, Qdrant
|
|
||||||
- **Privacy-First**: On-premise deployment with local LLM support
|
|
||||||
- **Ollama & vLLM Compatible**: Flexible model deployment options
|
|
||||||
|
|
||||||
### 🎨 Creative AI Tools
|
|
||||||
- **AI Art Generation**: DALL·E-3, MidJourney, Stable Diffusion integration
|
|
||||||
- **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
|
|
||||||
|
|
||||||
### Live Demo
|
|
||||||
- **User Portal**: [web.pandarobot.chat](https://web.pandarobot.chat) (demo/demo123)
|
|
||||||
- **Admin Panel**: [admin.pandarobot.chat](https://admin.pandarobot.chat) (admin/admin123)
|
|
||||||
|
|
||||||
### Source Code
|
|
||||||
| Component | GitHub | Gitee | GitCode |
|
|
||||||
|-----------|--------|-------|---------|
|
|
||||||
| Backend API | [ruoyi-ai](https://github.com/ageerle/ruoyi-ai) | [ruoyi-ai](https://gitee.com/ageerle/ruoyi-ai) | [ruoyi-ai](https://gitcode.com/ageerle/ruoyi-ai) |
|
|
||||||
| User Frontend | [ruoyi-web](https://github.com/ageerle/ruoyi-web) | [ruoyi-web](https://gitee.com/ageerle/ruoyi-web) | [ruoyi-web](https://gitcode.com/ageerle/ruoyi-web) |
|
|
||||||
| Admin Frontend | [ruoyi-admin](https://github.com/ageerle/ruoyi-admin) | [ruoyi-admin](https://gitee.com/ageerle/ruoyi-admin) | [ruoyi-admin](https://gitcode.com/ageerle/ruoyi-admin) |
|
|
||||||
|
|
||||||
### Collaborative Projects
|
|
||||||
| Project Description | GitHub Repository | Gitee Repository |
|
|
||||||
|:-------------------:|:-----------------:|:----------------:|
|
|
||||||
| Simplified Frontend | [ruoyi-element-ai](https://github.com/element-plus-x/ruoyi-element-ai) | [ruoyi-element-ai](https://gitee.com/he-jiayue/ruoyi-element-ai) |
|
|
||||||
|
|
||||||
|
|
||||||
## 🛠️ Tech Stack
|
|
||||||
|
|
||||||
### Core Framework
|
|
||||||
- **Backend**: Spring Boot 3.4, Spring AI, Langchain4j
|
|
||||||
- **Database**: MySQL 8.0, Redis, Vector Databases (Milvus/Weaviate/Qdrant)
|
|
||||||
- **Frontend**: Vue 3, Vben Admin, Naive UI
|
|
||||||
- **Authentication**: Sa-Token, JWT
|
|
||||||
|
|
||||||
### System Components
|
|
||||||
- **File Processing**: PDF, Word, Excel parsing, intelligent image analysis
|
|
||||||
- **Real-time Communication**: WebSocket real-time communication, SSE streaming
|
|
||||||
- **System Monitoring**: Comprehensive logging, performance monitoring, health checks
|
|
||||||
|
|
||||||
## 📚 Documentation
|
|
||||||
|
|
||||||
For detailed setup, configuration, and development guides, visit our comprehensive documentation:
|
|
||||||
|
|
||||||
**[📖 Official Documentation](https://doc.pandarobot.chat)**
|
|
||||||
|
|
||||||
## 🤝 Contributing
|
|
||||||
|
|
||||||
We welcome contributions from developers of all skill levels! Whether you're fixing bugs, adding features, or improving documentation, your help is appreciated.
|
|
||||||
|
|
||||||
### How to Contribute
|
|
||||||
1. Fork the repository
|
|
||||||
2. Create your feature branch (`git checkout -b feature/amazing-feature`)
|
|
||||||
3. Commit your changes (`git commit -m 'Add amazing feature'`)
|
|
||||||
4. Push to the branch (`git push origin feature/amazing-feature`)
|
|
||||||
5. Open a Pull Request
|
|
||||||
|
|
||||||
*Please submit PRs to GitHub - they will be synchronized to other platforms automatically.*
|
|
||||||
|
|
||||||
## 📄 License
|
|
||||||
|
|
||||||
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
|
|
||||||
|
|
||||||
|
|
||||||
## 🙏 Acknowledgments
|
|
||||||
|
|
||||||
Special thanks to these amazing open source projects:
|
|
||||||
|
|
||||||
- [Spring AI Alibaba Copilot](https://github.com/springaialibaba/spring-ai-alibaba-copilot) - Intelligent coding assistant based on spring-ai-alibaba with MCP protocol integration for project analysis and code generation
|
|
||||||
- [Spring AI](https://spring.io/projects/spring-ai) - Spring's AI integration framework
|
|
||||||
- [Langchain4j](https://github.com/langchain4j/langchain4j) - Java LLM framework
|
|
||||||
- [RuoYi-Vue-Plus](https://gitee.com/dromara/RuoYi-Vue-Plus) - Enterprise development framework
|
|
||||||
- [Vben Admin](https://github.com/vbenjs/vue-vben-admin) - Vue admin template
|
|
||||||
- [chatgpt-java](https://github.com/Grt1228/chatgpt-java) - ChatGPT Java SDK
|
|
||||||
|
|
||||||
## 🌐 Ecosystem Partners
|
|
||||||
|
|
||||||
- [PPIO Cloud](https://ppinfra.com/user/register?invited_by=P8QTUY&utm_source=github_ruoyi-ai) - Cost-effective GPU containers and model APIs
|
|
||||||
|
|
||||||
## 💬 Community
|
|
||||||
|
|
||||||
<div align="center">
|
|
||||||
|
|
||||||
<table>
|
|
||||||
<tr>
|
|
||||||
<td align="center">
|
|
||||||
<img src="image/wx.png" alt="WeChat" width="200" height="200"><br>
|
|
||||||
<strong>Add Author WeChat</strong><br>
|
|
||||||
<em>Scan to join learning group</em>
|
|
||||||
</td>
|
|
||||||
<td align="center">
|
|
||||||
<img src="image/qq.png" alt="QQ Group" width="200" height="200"><br>
|
|
||||||
<strong>QQ Group</strong><br>
|
|
||||||
<em>Technical discussion</em>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
<div align="center">
|
|
||||||
|
|
||||||
**[⭐ Star this repo](https://github.com/ageerle/ruoyi-ai)** • **[🍴 Fork it](https://github.com/ageerle/ruoyi-ai/fork)** • **[📖 中文文档](README.md)** • **[📚 Documentation](https://doc.pandarobot.chat)**
|
|
||||||
|
|
||||||
*Built with ❤️ by the RuoYi AI community*
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Badge Links -->
|
|
||||||
[contributors-shield]: https://img.shields.io/github/contributors/ageerle/ruoyi-ai.svg?style=flat-square
|
|
||||||
[contributors-url]: https://github.com/ageerle/ruoyi-ai/graphs/contributors
|
|
||||||
[forks-shield]: https://img.shields.io/github/forks/ageerle/ruoyi-ai.svg?style=flat-square
|
|
||||||
[forks-url]: https://github.com/ageerle/ruoyi-ai/network/members
|
|
||||||
[stars-shield]: https://img.shields.io/github/stars/ageerle/ruoyi-ai.svg?style=flat-square
|
|
||||||
[stars-url]: https://github.com/ageerle/ruoyi-ai/stargazers
|
|
||||||
[issues-shield]: https://img.shields.io/github/issues/ageerle/ruoyi-ai.svg?style=flat-square
|
|
||||||
[issues-url]: https://github.com/ageerle/ruoyi-ai/issues
|
|
||||||
[license-shield]: https://img.shields.io/github/license/ageerle/ruoyi-ai.svg?style=flat-square
|
|
||||||
[license-url]: https://github.com/ageerle/ruoyi-ai/blob/main/LICENSE
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
282
README_ZH.md
Normal file
@@ -0,0 +1,282 @@
|
|||||||
|
# RuoYi AI
|
||||||
|
|
||||||
|
<div align="center">
|
||||||
|
|
||||||
|
[![Contributors][contributors-shield]][contributors-url] [![Forks][forks-shield]][forks-url] [![Stargazers][stars-shield]][stars-url] [![Issues][issues-shield]][issues-url] [![MIT License][license-shield]][license-url]
|
||||||
|
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<a href="https://trendshift.io/repositories/13209">
|
||||||
|
<img src="https://trendshift.io/api/badge/repositories/13209" alt="GitHub Trending">
|
||||||
|
</a>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<img src="docs/image/logo.png" alt="RuoYi AI Logo" width="120" height="120">
|
||||||
|
|
||||||
|
### 企业级AI助手平台
|
||||||
|
|
||||||
|
*开箱即用的全栈AI平台,支持多智能体协同、Supervisor模式编排、多种决策模式、RAG技术和流程编排能力*
|
||||||
|
|
||||||
|
**[English](README.md)** | **[📖 使用文档](https://doc.ruoyiai.chat/)** |
|
||||||
|
**[🚀 在线体验](https://web.ruoyiai.chat/)** | **[🐛 问题反馈](https://github.com/ageerle/ruoyi-ai/issues)** | **[💡 功能建议](https://github.com/ageerle/ruoyi-ai/issues)**
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
## ✨ 核心亮点
|
||||||
|
|
||||||
|
| 模块 | 现有能力
|
||||||
|
|:---------:|---
|
||||||
|
| **模型管理** | 多模型接入(DeepSeek/智谱/MIMO/百炼/OpenAI)、多模态理解、Coze/DIFY/FastGPT/RAGFlow平台集成
|
||||||
|
| **知识管理** | 本地RAG + 向量库(Milvus/Weaviate/Qdrant) + 文档解析
|
||||||
|
| **工具管理** | Mcp协议集成、Skills能力 + 可扩展工具生态
|
||||||
|
| **流程编排** | 可视化工作流设计器、节点拖拽编排、SSE流式执行,目前已经支持模型调用,邮件发送,人工审核等节点
|
||||||
|
| **智能体管理** | 基于Langchain4j的Agent框架、Supervisor模式编排,支持多种决策模型,可以灵活搭配工具,skills
|
||||||
|
|
||||||
|
|
||||||
|
### 项目源码
|
||||||
|
|
||||||
|
| 项目模块 | GitHub 仓库 | Gitee 仓库 | GitCode 仓库 |
|
||||||
|
|----------|-------------------------------------------------------|------------------------------------------------------|--------------------------------------------------------|
|
||||||
|
| 🔧 后端服务 | [ruoyi-ai](https://github.com/ageerle/ruoyi-ai) | [ruoyi-ai](https://gitee.com/ageerle/ruoyi-ai) | [ruoyi-ai](https://gitcode.com/ageerle/ruoyi-ai) |
|
||||||
|
| 🎨 用户前端 | [ruoyi-web](https://github.com/ageerle/ruoyi-web) | [ruoyi-web](https://gitee.com/ageerle/ruoyi-web) | [ruoyi-web](https://gitcode.com/ageerle/ruoyi-web) |
|
||||||
|
| 🛠️ 管理后台 | [ruoyi-admin](https://github.com/ageerle/ruoyi-admin) | [ruoyi-admin](https://gitee.com/ageerle/ruoyi-admin) | [ruoyi-admin](https://gitcode.com/ageerle/ruoyi-admin) |
|
||||||
|
| 🎬 短剧平台 | [ruoyi-drama](https://github.com/ageerle/ruoyi-drama) | [ruoyi-drama](https://gitee.com/ageerle/ruoyi-drama) | [ruoyi-drama](https://gitcode.com/ageerle/ruoyi-drama) |
|
||||||
|
| 🤖 编程助手 | [ruoyi-copilot](https://github.com/ageerle/ruoyi-copilot) | [ruoyi-copilot](https://gitee.com/ageerle/ruoyi-copilot) | [ruoyi-copilot](https://gitcode.com/ageerle/ruoyi-copilot) |
|
||||||
|
| 📱 小程序端 | [ruoyi-uniapp](https://github.com/ageerle/ruoyi-uniapp) | [ruoyi-uniapp](https://gitee.com/ageerle/ruoyi-uniapp) | [ruoyi-uniapp](https://gitcode.com/ageerle/ruoyi-uniapp) |
|
||||||
|
|
||||||
|
### 合作项目
|
||||||
|
| 项目名称 | GitHub 仓库 | Gitee 仓库
|
||||||
|
|----------------|-------------------------------------------------------|------------------------------------------------------|
|
||||||
|
| element-plus-x | [element-plus-x](https://github.com/element-plus-x/Element-Plus-X) | [element-plus-x](https://gitee.com/he-jiayue/element-plus-x) |
|
||||||
|
|
||||||
|
## 🛠️ 技术架构
|
||||||
|
|
||||||
|
### 核心框架
|
||||||
|
- **后端架构**:Spring Boot 3.5.8 + Langchain4j
|
||||||
|
- **数据存储**:MySQL 8.0 + Redis + 向量数据库(Milvus/Weaviate/Qdrant)
|
||||||
|
- **前端技术**:Vue 3 + Vben Admin + element-plus-x
|
||||||
|
- **安全认证**:Sa-Token + JWT 双重保障
|
||||||
|
- **文档处理**:PDF、Word、Excel 解析,图像智能分析
|
||||||
|
- **实时通信**:WebSocket 实时通信,SSE 流式响应
|
||||||
|
- **系统监控**:完善的日志体系、性能监控、服务健康检查
|
||||||
|
|
||||||
|
## 🐳 Docker 部署
|
||||||
|
|
||||||
|
本项目提供两种 Docker 部署方式:
|
||||||
|
|
||||||
|
### 方式一:一键启动所有服务(推荐)
|
||||||
|
|
||||||
|
使用 `docker-compose-all.yaml` 可以一键启动所有服务(包括后端、管理端、用户端及依赖服务):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 克隆仓库
|
||||||
|
git clone https://github.com/ageerle/ruoyi-ai.git
|
||||||
|
cd ruoyi-ai
|
||||||
|
|
||||||
|
# 启动所有服务(从 GHCR 拉取预构建镜像)
|
||||||
|
docker compose -f docs/docker/ruoyi-ai/docker-compose-all.yaml up -d
|
||||||
|
|
||||||
|
# 查看服务状态
|
||||||
|
docker compose -f docs/docker/ruoyi-ai/docker-compose-all.yaml ps
|
||||||
|
|
||||||
|
# 访问服务
|
||||||
|
# 管理端: http://localhost:25666 (admin / admin123)
|
||||||
|
# 用户端: http://localhost:25137
|
||||||
|
# 后端API: http://localhost:26039
|
||||||
|
```
|
||||||
|
|
||||||
|
### 方式二:分步部署(源码编译)
|
||||||
|
|
||||||
|
如果您需要从源码构建后端服务,请按照以下步骤操作:
|
||||||
|
|
||||||
|
#### 第一步:部署后端服务
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 进入后端项目目录
|
||||||
|
cd ruoyi-ai
|
||||||
|
|
||||||
|
# 启动后端服务(源码编译构建)
|
||||||
|
docker-compose up -d --build
|
||||||
|
|
||||||
|
# 等待后端服务启动完成
|
||||||
|
docker-compose logs -f backend
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 第二步:部署管理端
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 进入管理端项目目录
|
||||||
|
cd ruoyi-admin
|
||||||
|
|
||||||
|
# 构建并启动管理端
|
||||||
|
docker-compose up -d --build
|
||||||
|
|
||||||
|
# 访问管理端
|
||||||
|
# 地址: http://localhost:5666
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 第三步:部署用户端(可选)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 进入用户端项目目录
|
||||||
|
cd ruoyi-web
|
||||||
|
|
||||||
|
# 构建并启动用户端
|
||||||
|
docker-compose up -d --build
|
||||||
|
|
||||||
|
# 访问用户端
|
||||||
|
# 地址: http://localhost:5137
|
||||||
|
```
|
||||||
|
|
||||||
|
### 服务端口说明
|
||||||
|
|
||||||
|
| 服务 | 一键启动端口 | 分步部署端口 | 说明 |
|
||||||
|
|------|-------------|-------------|------|
|
||||||
|
| 管理端 | 25666 | 5666 | 管理后台访问地址 |
|
||||||
|
| 用户端 | 25137 | 5137 | 用户前端访问地址 |
|
||||||
|
| 后端服务 | 26039 | 6039 | 后端 API 服务 |
|
||||||
|
| MySQL | 23306 | 23306 | 数据库服务 |
|
||||||
|
| Redis | 26379 | 6379 | 缓存服务 |
|
||||||
|
| Weaviate | 28080 | 28080 | 向量数据库 |
|
||||||
|
| MinIO API | 29000 | 9000 | 对象存储 API |
|
||||||
|
| MinIO Console | 29090 | 9090 | 对象存储控制台 |
|
||||||
|
|
||||||
|
### 镜像仓库
|
||||||
|
|
||||||
|
每次推送类似 `v3.1.0` 的版本标签后,GitHub Actions 会自动构建并发布应用镜像到 GitHub Container Registry(GHCR):
|
||||||
|
|
||||||
|
```
|
||||||
|
ghcr.io/ageerle/ruoyi-ai-backend:v3.1.0
|
||||||
|
ghcr.io/ageerle/ruoyi-ai-mysql:v3.1.0
|
||||||
|
ghcr.io/ageerle/ruoyi-ai-admin:v3.1.0
|
||||||
|
ghcr.io/ageerle/ruoyi-ai-web:v3.1.0
|
||||||
|
```
|
||||||
|
|
||||||
|
Compose 默认使用 `latest`。如需固定版本,可在 `docs/docker/ruoyi-ai/.env` 中设置 `RUIYI_VERSION=v3.1.0`。
|
||||||
|
|
||||||
|
首次工作流运行完成后,请在 GitHub 的 Packages 设置中将这四个 GHCR 镜像设为 `Public`,用户服务器才能免登录拉取。
|
||||||
|
|
||||||
|
管理端 `ageerle/ruoyi-admin` 和用户端 `ageerle/ruoyi-web` 也必须存在同名版本标签;发布工作流会使用后端发布标签检出这两个仓库后再构建镜像。
|
||||||
|
|
||||||
|
### 常用命令
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 停止所有服务
|
||||||
|
docker compose -f docs/docker/ruoyi-ai/docker-compose-all.yaml down
|
||||||
|
|
||||||
|
# 查看服务日志
|
||||||
|
docker compose -f docs/docker/ruoyi-ai/docker-compose-all.yaml logs -f [服务名]
|
||||||
|
|
||||||
|
# 重启某个服务
|
||||||
|
docker compose -f docs/docker/ruoyi-ai/docker-compose-all.yaml restart [服务名]
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📚 使用文档
|
||||||
|
|
||||||
|
想要深入了解安装部署、功能配置和二次开发?
|
||||||
|
|
||||||
|
**👉 [完整使用文档](https://doc.ruoyiai.chat/)**
|
||||||
|
|
||||||
|
## 🤝 参与贡献
|
||||||
|
|
||||||
|
我们热烈欢迎社区贡献!无论您是资深开发者还是初学者,都可以为项目贡献力量 💪
|
||||||
|
|
||||||
|
### 贡献方式
|
||||||
|
|
||||||
|
1. **Fork** 项目到您的账户
|
||||||
|
2. **创建分支** (`git checkout -b feature/新功能名称`)
|
||||||
|
3. **提交代码** (`git commit -m '添加某某功能'`)
|
||||||
|
4. **推送分支** (`git push origin feature/新功能名称`)
|
||||||
|
5. **发起 Pull Request**
|
||||||
|
|
||||||
|
> 💡 **小贴士**:建议将 PR 提交到 GitHub,我们会自动同步到其他代码托管平台
|
||||||
|
|
||||||
|
## 📄 开源协议
|
||||||
|
|
||||||
|
本项目采用 **MIT 开源协议**,详情请查看 [LICENSE](LICENSE) 文件。
|
||||||
|
|
||||||
|
## 🙏 特别鸣谢
|
||||||
|
|
||||||
|
感谢以下优秀的开源项目为本项目提供支持:
|
||||||
|
- [Langchain4j](https://github.com/langchain4j/langchain4j) - 强大的 Java LLM 开发框架
|
||||||
|
- [RuoYi-Vue-Plus](https://gitee.com/dromara/RuoYi-Vue-Plus) - 成熟的企业级快速开发框架
|
||||||
|
- [Vben Admin](https://github.com/vbenjs/vue-vben-admin) - 现代化的 Vue 后台管理模板
|
||||||
|
|
||||||
|
|
||||||
|
## 💎 赞助商
|
||||||
|
|
||||||
|
**感谢以下赞助商对本项目的支持:**
|
||||||
|
|
||||||
|
<a href="https://www.atlascloud.ai?ref=89F97E">
|
||||||
|
<img src="docs/image/sponsor/atlascloud_banner.png" alt="Atlas Cloud" width="160" height="80">
|
||||||
|
</a>
|
||||||
|
|
||||||
|
[访问Atlas Cloud官网](https://www.atlascloud.ai?ref=89F97E&utm_source=github&utm_campaign=ruoyi-drama) · [编程计划优惠](https://www.atlascloud.ai/console/coding-plan)
|
||||||
|
全模态 AI 推理平台,为开发者提供统一的 AI API,支持视频生成、图像生成和大语言模型。一次接入,即可访问 **300+ 精选模型**。
|
||||||
|
|
||||||
|
<a href="https://www.volcengine.com/activity/codingplan?utm_campaign=hw&utm_content=hw&utm_medium=devrel_tool_web&utm_source=OWO&utm_term=ageerle-ruoyi-ai">
|
||||||
|
<img src="docs/image/sponsor/huoshan.png" alt="火山引擎 CodingPlan" width="160" height="80">
|
||||||
|
</a>
|
||||||
|
|
||||||
|
[注册即领2500万Tokens,立即前往](https://www.volcengine.com/activity/ai618?utm_campaign=hw&utm_content=hw&utm_medium=devrel_tool_web&utm_source=OWO&utm_term=ageerle-ruoyi-ai)
|
||||||
|
享字节自研豆包模型+满血版开源 SOTA模型,覆盖文本、VLM、图像生成,全模态一站配齐:Seed-2.1、Seedream-5.0、GLM-5.2、DeepSeek等。不止编程、更能解决 Agent 复杂长程任务!
|
||||||
|
|
||||||
|
|
||||||
|
## 💬 社区交流
|
||||||
|
|
||||||
|
<div align="center">
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<td align="center">
|
||||||
|
<img src="docs/image/wx.png" alt="微信二维码" width="200" height="200"><br>
|
||||||
|
<strong>扫码添加作者微信</strong><br>
|
||||||
|
<em>邀请进群学习</em>
|
||||||
|
</td>
|
||||||
|
<td align="center">
|
||||||
|
<img src="docs/image/wx06.png" alt="微信二维码" width="200" height="200"><br>
|
||||||
|
<strong>微信技术交流群</strong><br>
|
||||||
|
<em>技术讨论</em>
|
||||||
|
</td>
|
||||||
|
<td align="center">
|
||||||
|
<img src="docs/image/qq.png" alt="QQ群二维码" width="200" height="200"><br>
|
||||||
|
<strong>QQ技术交流群</strong><br>
|
||||||
|
<em>技术讨论</em>
|
||||||
|
</td>
|
||||||
|
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
---
|
||||||
|
<div align="center">
|
||||||
|
|
||||||
|
**[⭐ 点个Star支持一下](https://github.com/ageerle/ruoyi-ai)** • **[ Fork 开始贡献](https://github.com/ageerle/ruoyi-ai/fork)** • **[📚 English](README.md)** • **[📖 查看完整文档](https://doc.ruoyiai.chat/)**
|
||||||
|
|
||||||
|
*用 ❤️ 打造,由 RuoYi AI 开源社区维护*
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Badge Links -->
|
||||||
|
|
||||||
|
[contributors-shield]: https://img.shields.io/github/contributors/ageerle/ruoyi-ai.svg?style=flat-square
|
||||||
|
|
||||||
|
[contributors-url]: https://github.com/ageerle/ruoyi-ai/graphs/contributors
|
||||||
|
|
||||||
|
[forks-shield]: https://img.shields.io/github/forks/ageerle/ruoyi-ai.svg?style=flat-square
|
||||||
|
|
||||||
|
[forks-url]: https://github.com/ageerle/ruoyi-ai/network/members
|
||||||
|
|
||||||
|
[stars-shield]: https://img.shields.io/github/stars/ageerle/ruoyi-ai.svg?style=flat-square
|
||||||
|
|
||||||
|
[stars-url]: https://github.com/ageerle/ruoyi-ai/stargazers
|
||||||
|
|
||||||
|
[issues-shield]: https://img.shields.io/github/issues/ageerle/ruoyi-ai.svg?style=flat-square
|
||||||
|
|
||||||
|
[issues-url]: https://github.com/ageerle/ruoyi-ai/issues
|
||||||
|
|
||||||
|
[license-shield]: https://img.shields.io/github/license/ageerle/ruoyi-ai.svg?style=flat-square
|
||||||
|
|
||||||
|
[license-url]: https://github.com/ageerle/ruoyi-ai/blob/main/LICENSE
|
||||||
@@ -1,222 +0,0 @@
|
|||||||
## RuoYi-AI 后端部署教程(Docker 部署版)
|
|
||||||
|
|
||||||
### 一、前置条件
|
|
||||||
|
|
||||||
在部署前,请确保系统已满足以下条件:
|
|
||||||
|
|
||||||
#### ✅ 系统环境要求
|
|
||||||
|
|
||||||
- 操作系统:Linux / MacOS(推荐 Linux 服务器)
|
|
||||||
- CPU:4 核以上
|
|
||||||
- 内存:≥ 4GB
|
|
||||||
- 磁盘空间:≥ 10GB(建议 20GB+)
|
|
||||||
|
|
||||||
#### ✅ 已安装软件
|
|
||||||
|
|
||||||
- **Docker**
|
|
||||||
- **Docker Compose**
|
|
||||||
|
|
||||||
验证命令是否可用:
|
|
||||||
|
|
||||||
```
|
|
||||||
docker -v
|
|
||||||
docker compose version
|
|
||||||
```
|
|
||||||
|
|
||||||
若无输出或提示“command not found”,请先安装 Docker 及 Compose。
|
|
||||||
|
|
||||||
------
|
|
||||||
|
|
||||||
### 二、目录结构配置
|
|
||||||
|
|
||||||
#### 1️⃣ 创建部署目录
|
|
||||||
|
|
||||||
在目标服务器执行以下命令:
|
|
||||||
|
|
||||||
```
|
|
||||||
# 第一级目录
|
|
||||||
mkdir /ruoyi-ai
|
|
||||||
cd /ruoyi-ai
|
|
||||||
|
|
||||||
# 第二级目录
|
|
||||||
mkdir deploy
|
|
||||||
cd deploy
|
|
||||||
|
|
||||||
# 第三级目录
|
|
||||||
mkdir data mysql-init
|
|
||||||
|
|
||||||
# 第四级目录
|
|
||||||
mkdir logs minio minio-config mysql redis weaviate
|
|
||||||
```
|
|
||||||
|
|
||||||
> 💡 `data` 目录用于挂载容器运行期间生成的数据文件。
|
|
||||||
|
|
||||||
最终目录结构示例:
|
|
||||||
|
|
||||||
```
|
|
||||||
/ruoyi-ai
|
|
||||||
└── deploy
|
|
||||||
├── data/
|
|
||||||
├── mysql-init/
|
|
||||||
├── logs/
|
|
||||||
├── minio/
|
|
||||||
├── minio-config/
|
|
||||||
├── mysql/
|
|
||||||
├── redis/
|
|
||||||
├── weaviate/
|
|
||||||
```
|
|
||||||
|
|
||||||
------
|
|
||||||
|
|
||||||
### 三、上传配置文件
|
|
||||||
|
|
||||||
将以下配置文件上传到 `/ruoyi-ai/deploy` 目录:
|
|
||||||
|
|
||||||
- `docker-compose.yaml`
|
|
||||||
- `.env`
|
|
||||||
- `ruoyi-ai.sql`
|
|
||||||
- `Dockerfile`
|
|
||||||
|
|
||||||
> 📂 这些文件在项目目录 `/script/deploy/deploy` 下。
|
|
||||||
> 上传后请检查文件路径是否与上方目录结构一致。
|
|
||||||
|
|
||||||
------
|
|
||||||
|
|
||||||
### 四、构建 Jar 包
|
|
||||||
|
|
||||||
1. 打开 IDEA 或其他构建工具
|
|
||||||
2. 选择 **Maven 构建配置**,勾选 `prod` 环境,取消 `dev` 环境
|
|
||||||
3. 点击 `package` 进行打包
|
|
||||||
4. **注意:** 在构建前请将 `application-prod.yml` 拖入
|
|
||||||
`ruoyi-admin/src/main/resources` 目录中
|
|
||||||
|
|
||||||
构建完成后会在:
|
|
||||||
|
|
||||||
```
|
|
||||||
ruoyi-admin/target/ruoyi-admin.jar
|
|
||||||
```
|
|
||||||
|
|
||||||
生成打包文件。
|
|
||||||
|
|
||||||
------
|
|
||||||
|
|
||||||
### 五、上传 Jar 包至服务器
|
|
||||||
|
|
||||||
将生成的 `ruoyi-admin.jar` 上传到服务器 `/ruoyi-ai/deploy` 目录下。
|
|
||||||
确保与 `Dockerfile` 同目录。
|
|
||||||
|
|
||||||
------
|
|
||||||
|
|
||||||
### 六、构建 Docker 镜像
|
|
||||||
|
|
||||||
`Dockerfile` 内容如下:
|
|
||||||
|
|
||||||
```
|
|
||||||
FROM openjdk:17-jdk
|
|
||||||
|
|
||||||
RUN mkdir -p /ruoyi/server/logs \
|
|
||||||
/ruoyi/server/temp
|
|
||||||
|
|
||||||
WORKDIR /ruoyi/server
|
|
||||||
COPY ruoyi-admin.jar ruoyi-admin.jar
|
|
||||||
|
|
||||||
ENTRYPOINT ["java","-jar","ruoyi-admin.jar"]
|
|
||||||
```
|
|
||||||
|
|
||||||
在 `/ruoyi-ai/deploy` 目录执行以下命令:
|
|
||||||
|
|
||||||
```
|
|
||||||
# 构建镜像
|
|
||||||
docker build -t ruoyi-ai-backend:v20251013 .
|
|
||||||
|
|
||||||
# 查看镜像是否构建成功
|
|
||||||
docker image ls
|
|
||||||
```
|
|
||||||
|
|
||||||
然后在 `docker-compose.yaml` 文件中,将对应服务的镜像名修改为:
|
|
||||||
|
|
||||||
```
|
|
||||||
image: ruoyi-ai-backend:v20251013
|
|
||||||
```
|
|
||||||
|
|
||||||
------
|
|
||||||
|
|
||||||
### 七、启动容器服务
|
|
||||||
|
|
||||||
在启动前请确认:
|
|
||||||
|
|
||||||
- `.env` 中端口号、数据库密码、环境变量已正确配置
|
|
||||||
- `docker-compose.yaml` 中 MySQL 的端口已开放(用于导入数据)
|
|
||||||
|
|
||||||
如示例:
|
|
||||||
|
|
||||||
```
|
|
||||||
ports:
|
|
||||||
- "3306:3306"
|
|
||||||
```
|
|
||||||
|
|
||||||
#### 启动命令:
|
|
||||||
|
|
||||||
```
|
|
||||||
cd /ruoyi-ai/deploy
|
|
||||||
docker compose up -d
|
|
||||||
```
|
|
||||||
|
|
||||||
#### 查看运行状态:
|
|
||||||
|
|
||||||
```
|
|
||||||
docker compose ps
|
|
||||||
```
|
|
||||||
|
|
||||||
#### 查看日志:
|
|
||||||
|
|
||||||
```
|
|
||||||
docker logs -f <容器名称>
|
|
||||||
```
|
|
||||||
|
|
||||||
> ⚠️ 初次启动时可仅运行 `ruoyi-admin`(后端)模块,将前端 `ruoyi-web` 服务暂时注释,确认后端服务正常后再启用前端容器。
|
|
||||||
|
|
||||||
------
|
|
||||||
|
|
||||||
### 八、数据库初始化
|
|
||||||
|
|
||||||
启动 MySQL 容器后,执行以下操作:
|
|
||||||
|
|
||||||
```
|
|
||||||
docker exec -it <mysql_container_name> bash
|
|
||||||
mysql -uroot -p
|
|
||||||
source /docker-entrypoint-initdb.d/ruoyi-ai.sql;
|
|
||||||
```
|
|
||||||
|
|
||||||
或手动在客户端中导入 `/ruoyi-ai/deploy/ruoyi-ai.sql` 文件。
|
|
||||||
|
|
||||||
------
|
|
||||||
|
|
||||||
### 九、常用 Docker 命令
|
|
||||||
|
|
||||||
| 功能 | 命令 |
|
|
||||||
| ----------------- | --------------------------------- |
|
|
||||||
| 查看容器状态 | `docker ps -a` |
|
|
||||||
| 查看日志 | `docker logs -f <容器名>` |
|
|
||||||
| 停止服务 | `docker compose down` |
|
|
||||||
| 重启服务 | `docker compose restart` |
|
|
||||||
| 重新构建镜像 | `docker compose build --no-cache` |
|
|
||||||
| 清理无用镜像/容器 | `docker system prune -a` |
|
|
||||||
|
|
||||||
------
|
|
||||||
|
|
||||||
### 🔍 十、部署验证
|
|
||||||
|
|
||||||
1. 检查容器是否全部启动成功:
|
|
||||||
|
|
||||||
```
|
|
||||||
docker compose ps
|
|
||||||
```
|
|
||||||
|
|
||||||
2. 访问后端接口:
|
|
||||||
|
|
||||||
```
|
|
||||||
http://<服务器IP>:<后端端口>
|
|
||||||
```
|
|
||||||
|
|
||||||
3. 检查日志输出无异常。
|
|
||||||
@@ -42,7 +42,7 @@ services:
|
|||||||
networks:
|
networks:
|
||||||
- ruoyi-network
|
- ruoyi-network
|
||||||
healthcheck:
|
healthcheck:
|
||||||
test: ["CMD-SHELL", "wget --no-verbose --tries=1 --spider localhost:7474 || exit 1"]
|
test: [ "CMD-SHELL", "wget --no-verbose --tries=1 --spider localhost:7474 || exit 1" ]
|
||||||
interval: 30s
|
interval: 30s
|
||||||
timeout: 10s
|
timeout: 10s
|
||||||
retries: 5
|
retries: 5
|
||||||
70
docs/docker/milvus/docker-compose.yml
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
services:
|
||||||
|
etcd:
|
||||||
|
container_name: ruoyi-rag-milvus-etcd
|
||||||
|
image: quay.io/coreos/etcd:v3.5.18
|
||||||
|
environment:
|
||||||
|
- ETCD_AUTO_COMPACTION_MODE=revision
|
||||||
|
- ETCD_AUTO_COMPACTION_RETENTION=1000
|
||||||
|
- ETCD_QUOTA_BACKEND_BYTES=4294967296
|
||||||
|
- ETCD_SNAPSHOT_COUNT=50000
|
||||||
|
volumes:
|
||||||
|
- ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/etcd:/etcd
|
||||||
|
command: etcd -advertise-client-urls=http://etcd:2379 -listen-client-urls http://0.0.0.0:2379 --data-dir /etcd
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "etcdctl", "endpoint", "health"]
|
||||||
|
interval: 30s
|
||||||
|
timeout: 20s
|
||||||
|
retries: 3
|
||||||
|
|
||||||
|
minio:
|
||||||
|
container_name: ruoyi-rag-milvus-minio
|
||||||
|
image: minio/minio:RELEASE.2023-03-20T20-16-18Z
|
||||||
|
environment:
|
||||||
|
MINIO_ACCESS_KEY: minioadmin
|
||||||
|
MINIO_SECRET_KEY: minioadmin
|
||||||
|
volumes:
|
||||||
|
- ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/minio:/minio_data
|
||||||
|
command: minio server /minio_data --console-address ":9001"
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
|
||||||
|
interval: 30s
|
||||||
|
timeout: 20s
|
||||||
|
retries: 3
|
||||||
|
|
||||||
|
standalone:
|
||||||
|
container_name: ruoyi-rag-milvus
|
||||||
|
image: milvusdb/milvus:v2.5.7
|
||||||
|
command: ["milvus", "run", "standalone"]
|
||||||
|
security_opt:
|
||||||
|
- seccomp:unconfined
|
||||||
|
environment:
|
||||||
|
ETCD_ENDPOINTS: etcd:2379
|
||||||
|
MINIO_ADDRESS: minio:9000
|
||||||
|
volumes:
|
||||||
|
- ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvus
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "curl", "-f", "http://localhost:9091/healthz"]
|
||||||
|
interval: 30s
|
||||||
|
start_period: 90s
|
||||||
|
timeout: 20s
|
||||||
|
retries: 3
|
||||||
|
ports:
|
||||||
|
- "19530:19530"
|
||||||
|
- "9091:9091"
|
||||||
|
depends_on:
|
||||||
|
- "etcd"
|
||||||
|
- "minio"
|
||||||
|
|
||||||
|
attu:
|
||||||
|
container_name: ruoyi-rag-attu
|
||||||
|
image: zilliz/attu:v2.5.7
|
||||||
|
environment:
|
||||||
|
MILVUS_URL: milvus-standalone:19530
|
||||||
|
ports:
|
||||||
|
- "19500:3000" # 外部端口19500可以自定义
|
||||||
|
depends_on:
|
||||||
|
- "standalone"
|
||||||
|
|
||||||
|
networks:
|
||||||
|
default:
|
||||||
|
name: ruoyi-rag-milvus
|
||||||
20
docs/docker/qdrant/docker-compose.yml
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
---
|
||||||
|
services:
|
||||||
|
qdrant:
|
||||||
|
container_name: ruoyi-rag-qdrant
|
||||||
|
image: qdrant/qdrant:v1.17.0
|
||||||
|
ports:
|
||||||
|
- 6333:6333
|
||||||
|
- 6334:6334
|
||||||
|
volumes:
|
||||||
|
- qdrant_data:/qdrant/storage
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD-SHELL", "bash -c 'exec 3<>/dev/tcp/127.0.0.1/6333 && printf \"GET /healthz HTTP/1.1\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n\" >&3 && grep -q \"200 OK\" <&3'"]
|
||||||
|
interval: 10s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 12
|
||||||
|
start_period: 10s
|
||||||
|
restart: unless-stopped
|
||||||
|
volumes:
|
||||||
|
qdrant_data:
|
||||||
|
...
|
||||||
6
docs/docker/ruoyi-ai/.env.example
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
# GitHub Container Registry namespace owner.
|
||||||
|
# For the upstream project this is ageerle; change it when using a fork.
|
||||||
|
IMAGE_OWNER=ageerle
|
||||||
|
|
||||||
|
# Use latest for convenience, or pin a release such as v3.1.0.
|
||||||
|
RUIYI_VERSION=latest
|
||||||
52
docs/docker/ruoyi-ai/Dockerfile.backend
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
# RuoYi-AI 后端 Dockerfile
|
||||||
|
# 基于 Maven + OpenJDK 17
|
||||||
|
|
||||||
|
FROM maven:3.9-eclipse-temurin-17 AS builder
|
||||||
|
|
||||||
|
# 设置工作目录
|
||||||
|
WORKDIR /build
|
||||||
|
|
||||||
|
# 复制 pom.xml 和源码
|
||||||
|
COPY pom.xml .
|
||||||
|
COPY ruoyi-admin ./ruoyi-admin
|
||||||
|
COPY ruoyi-common ./ruoyi-common
|
||||||
|
COPY ruoyi-modules ./ruoyi-modules
|
||||||
|
COPY ruoyi-extend ./ruoyi-extend
|
||||||
|
|
||||||
|
|
||||||
|
# 构建项目 (使用 prod profile)
|
||||||
|
RUN mvn clean package -Pprod -DskipTests
|
||||||
|
|
||||||
|
# 最终运行镜像
|
||||||
|
FROM eclipse-temurin:17-jre-alpine
|
||||||
|
|
||||||
|
RUN set -eux; \
|
||||||
|
apk add --no-cache ffmpeg; \
|
||||||
|
for filter in scale pad fps setsar format tpad trim settb setpts xfade \
|
||||||
|
aresample aformat apad atrim asetpts anullsrc concat acrossfade; do \
|
||||||
|
ffmpeg -hide_banner -filters 2>/dev/null | grep -Eq "[[:space:]]${filter}[[:space:]]"; \
|
||||||
|
done; \
|
||||||
|
ffmpeg -hide_banner -h filter=xfade 2>&1 | grep -q dissolve; \
|
||||||
|
ffmpeg -hide_banner -h filter=xfade 2>&1 | grep -q fadeblack; \
|
||||||
|
ffmpeg -hide_banner -h filter=xfade 2>&1 | grep -q slideleft; \
|
||||||
|
ffmpeg -hide_banner -encoders 2>/dev/null | grep -Eq '[[:space:]]libx264[[:space:]]'; \
|
||||||
|
ffmpeg -hide_banner -encoders 2>/dev/null | grep -Eq '[[:space:]]aac[[:space:]]'; \
|
||||||
|
ffprobe -hide_banner -version >/dev/null
|
||||||
|
|
||||||
|
ENV FFMPEG_PATH=/usr/bin/ffmpeg \
|
||||||
|
FFPROBE_PATH=/usr/bin/ffprobe
|
||||||
|
|
||||||
|
# 设置工作目录
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# 从构建阶段复制 jar 包
|
||||||
|
COPY --from=builder /build/ruoyi-admin/target/ruoyi-admin.jar ./ruoyi-admin.jar
|
||||||
|
|
||||||
|
# 创建日志目录
|
||||||
|
RUN mkdir -p /ruoyi/server/logs /ruoyi/server/temp
|
||||||
|
|
||||||
|
# 暴露端口
|
||||||
|
EXPOSE 6039
|
||||||
|
|
||||||
|
# 启动命令
|
||||||
|
ENTRYPOINT ["java", "-Djava.io.tmpdir=/ruoyi/server/temp", "-jar", "ruoyi-admin.jar", "--spring.profiles.active=prod"]
|
||||||
19
docs/docker/ruoyi-ai/Dockerfile.mysql
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
# 基于官方MySQL 8.0镜像构建自定义镜像
|
||||||
|
# 构建命令: docker build -t registry.cn-hangzhou.aliyuncs.com/ruoyi-ai/mysql:v3 -f Dockerfile.mysql .
|
||||||
|
FROM mysql:8.0
|
||||||
|
|
||||||
|
# 设置时区
|
||||||
|
ENV TZ=Asia/Shanghai
|
||||||
|
|
||||||
|
# MySQL 官方入口会按文件名顺序执行初始化目录中的 SQL。
|
||||||
|
# ruoyi-ai.sql 会导入 MYSQL_DATABASE,snail_job_mysql.sql 会自行创建并切换数据库。
|
||||||
|
COPY docs/script/sql/ruoyi-ai.sql /docker-entrypoint-initdb.d/01-ruoyi-ai.sql
|
||||||
|
COPY docs/script/sql/snail_job_mysql.sql /docker-entrypoint-initdb.d/02-snail-job.sql
|
||||||
|
|
||||||
|
# MySQL启动参数
|
||||||
|
CMD ["--default-authentication-plugin=mysql_native_password", \
|
||||||
|
"--character-set-server=utf8mb4", \
|
||||||
|
"--collation-server=utf8mb4_general_ci", \
|
||||||
|
"--explicit_defaults_for_timestamp=true", \
|
||||||
|
"--lower_case_table_names=1", \
|
||||||
|
"--skip-ssl"]
|
||||||
181
docs/docker/ruoyi-ai/docker-compose-all.yaml
Normal file
@@ -0,0 +1,181 @@
|
|||||||
|
# RuoYi-AI 一键启动全部服务
|
||||||
|
# 使用方式: docker-compose up -d
|
||||||
|
#
|
||||||
|
# 包含服务:
|
||||||
|
# - MySQL 8.0 (数据库,包含初始化SQL)
|
||||||
|
# - Redis 6.2 (缓存)
|
||||||
|
# - Weaviate (向量数据库)
|
||||||
|
# - MinIO (对象存储)
|
||||||
|
# - RuoYi-Backend (后端服务)
|
||||||
|
# - RuoYi-Admin (管理端前端)
|
||||||
|
# - RuoYi-Web (用户端前端)
|
||||||
|
#
|
||||||
|
# 镜像仓库地址: ghcr.io/ageerle
|
||||||
|
|
||||||
|
services:
|
||||||
|
# ==================== MySQL 数据库 ====================
|
||||||
|
mysql:
|
||||||
|
# GHCR 镜像(包含初始化SQL)
|
||||||
|
image: ghcr.io/${IMAGE_OWNER:-ageerle}/ruoyi-ai-mysql:${RUIYI_VERSION:-latest}
|
||||||
|
container_name: ruoyi-ai-mysql
|
||||||
|
restart: always
|
||||||
|
ports:
|
||||||
|
- "23306:3306"
|
||||||
|
environment:
|
||||||
|
MYSQL_ROOT_PASSWORD: root
|
||||||
|
MYSQL_DATABASE: ruoyi-ai-agent
|
||||||
|
TZ: Asia/Shanghai
|
||||||
|
volumes:
|
||||||
|
- mysql-data:/var/lib/mysql
|
||||||
|
healthcheck:
|
||||||
|
# Force TCP: during first-time initialization MySQL exposes a temporary
|
||||||
|
# socket-only server. A socket ping would mark the service healthy before
|
||||||
|
# the real network listener (used by the backend) is ready.
|
||||||
|
test: ["CMD", "mysqladmin", "ping", "--protocol=tcp", "-h", "127.0.0.1", "-u", "root", "-proot"]
|
||||||
|
interval: 15s
|
||||||
|
timeout: 10s
|
||||||
|
retries: 10
|
||||||
|
start_period: 60s
|
||||||
|
networks:
|
||||||
|
- ruoyi-net
|
||||||
|
|
||||||
|
# ==================== Redis 缓存 ====================
|
||||||
|
redis:
|
||||||
|
image: redis:6.2
|
||||||
|
container_name: ruoyi-ai-redis
|
||||||
|
restart: always
|
||||||
|
ports:
|
||||||
|
- "26379:6379"
|
||||||
|
volumes:
|
||||||
|
- redis-data:/data
|
||||||
|
command: redis-server --appendonly yes
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "redis-cli", "ping"]
|
||||||
|
interval: 10s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 5
|
||||||
|
networks:
|
||||||
|
- ruoyi-net
|
||||||
|
|
||||||
|
# ==================== Weaviate 向量数据库 ====================
|
||||||
|
weaviate:
|
||||||
|
image: semitechnologies/weaviate:1.30.0
|
||||||
|
container_name: ruoyi-ai-weaviate
|
||||||
|
restart: always
|
||||||
|
ports:
|
||||||
|
- "28080:8080"
|
||||||
|
environment:
|
||||||
|
QUERY_DEFAULTS_LIMIT: 25
|
||||||
|
AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: "true"
|
||||||
|
PERSISTENCE_DATA_PATH: /var/lib/weaviate
|
||||||
|
DEFAULT_VECTORIZER_MODULE: none
|
||||||
|
ENABLE_MODULES: text2vec-cohere,text2vec-huggingface,text2vec-palm,text2vec-openai,generative-openai,generative-cohere,generative-palm,ref2vec-centroid,reranker-cohere,qna-openai
|
||||||
|
CLUSTER_HOSTNAME: node1
|
||||||
|
volumes:
|
||||||
|
- weaviate-data:/var/lib/weaviate
|
||||||
|
networks:
|
||||||
|
- ruoyi-net
|
||||||
|
|
||||||
|
# ==================== MinIO 对象存储 ====================
|
||||||
|
minio:
|
||||||
|
image: minio/minio:latest
|
||||||
|
container_name: ruoyi-ai-minio
|
||||||
|
restart: always
|
||||||
|
ports:
|
||||||
|
- "29000:9000"
|
||||||
|
- "29090:9090"
|
||||||
|
environment:
|
||||||
|
MINIO_ROOT_USER: ruoyi
|
||||||
|
MINIO_ROOT_PASSWORD: ruoyi123
|
||||||
|
volumes:
|
||||||
|
- minio-data:/data
|
||||||
|
command: server /data --console-address ":9090"
|
||||||
|
networks:
|
||||||
|
- ruoyi-net
|
||||||
|
|
||||||
|
# ==================== RuoYi-AI 后端服务 ====================
|
||||||
|
backend:
|
||||||
|
image: ghcr.io/${IMAGE_OWNER:-ageerle}/ruoyi-ai-backend:${RUIYI_VERSION:-latest}
|
||||||
|
container_name: ruoyi-ai-backend
|
||||||
|
restart: always
|
||||||
|
ports:
|
||||||
|
- "26039:6039"
|
||||||
|
environment:
|
||||||
|
TZ: Asia/Shanghai
|
||||||
|
# MySQL 配置
|
||||||
|
SPRING_DATASOURCE_DYNAMIC_PRIMARY: master
|
||||||
|
SPRING_DATASOURCE_DYNAMIC_DATASOURCE_MASTER_DRIVERCLASSNAME: com.mysql.cj.jdbc.Driver
|
||||||
|
SPRING_DATASOURCE_DYNAMIC_DATASOURCE_MASTER_URL: jdbc:mysql://mysql:3306/ruoyi-ai-agent?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true
|
||||||
|
SPRING_DATASOURCE_DYNAMIC_DATASOURCE_MASTER_USERNAME: root
|
||||||
|
SPRING_DATASOURCE_DYNAMIC_DATASOURCE_MASTER_PASSWORD: root
|
||||||
|
# Redis 配置
|
||||||
|
SPRING_DATA_REDIS_HOST: redis
|
||||||
|
SPRING_DATA_REDIS_PORT: 6379
|
||||||
|
SPRING_DATA_REDIS_DATABASE: 0
|
||||||
|
# 日志配置
|
||||||
|
LOGGING_LEVEL_ORG_RUOYI: info
|
||||||
|
LOGGING_LEVEL_ORG_SPRINGFRAMEWORK: warn
|
||||||
|
SYS_UPLOAD_PATH: /ruoyi/upload
|
||||||
|
volumes:
|
||||||
|
- logs-data:/ruoyi/server/logs
|
||||||
|
- upload-data:/ruoyi/upload
|
||||||
|
depends_on:
|
||||||
|
mysql:
|
||||||
|
condition: service_healthy
|
||||||
|
redis:
|
||||||
|
condition: service_started
|
||||||
|
networks:
|
||||||
|
- ruoyi-net
|
||||||
|
|
||||||
|
# ==================== RuoYi-AI 管理端前端 ====================
|
||||||
|
admin-frontend:
|
||||||
|
image: ghcr.io/${IMAGE_OWNER:-ageerle}/ruoyi-ai-admin:${RUIYI_VERSION:-latest}
|
||||||
|
container_name: ruoyi-ai-admin
|
||||||
|
restart: always
|
||||||
|
ports:
|
||||||
|
- "25666:5666"
|
||||||
|
environment:
|
||||||
|
# 后端 API 地址 - 运行时动态配置(无需重新构建镜像)
|
||||||
|
# nginx upstream 配置不需要 http:// 前缀,直接使用 host:port
|
||||||
|
UPSTREAM_HOST: backend:6039
|
||||||
|
# 资源限制 - 防止 CPU 和内存耗尽
|
||||||
|
deploy:
|
||||||
|
resources:
|
||||||
|
limits:
|
||||||
|
cpus: '2'
|
||||||
|
memory: 3G
|
||||||
|
reservations:
|
||||||
|
cpus: '1'
|
||||||
|
memory: 1G
|
||||||
|
depends_on:
|
||||||
|
- backend
|
||||||
|
networks:
|
||||||
|
- ruoyi-net
|
||||||
|
|
||||||
|
# ==================== RuoYi-AI 用户端前端 ====================
|
||||||
|
web-frontend:
|
||||||
|
image: ghcr.io/${IMAGE_OWNER:-ageerle}/ruoyi-ai-web:${RUIYI_VERSION:-latest}
|
||||||
|
container_name: ruoyi-ai-web
|
||||||
|
restart: always
|
||||||
|
ports:
|
||||||
|
- "25137:5137"
|
||||||
|
environment:
|
||||||
|
UPSTREAM_URL: http://backend:6039
|
||||||
|
depends_on:
|
||||||
|
- backend
|
||||||
|
networks:
|
||||||
|
- ruoyi-net
|
||||||
|
|
||||||
|
# ==================== 网络配置 ====================
|
||||||
|
networks:
|
||||||
|
ruoyi-net:
|
||||||
|
driver: bridge
|
||||||
|
|
||||||
|
# ==================== 数据卷配置 ====================
|
||||||
|
volumes:
|
||||||
|
mysql-data:
|
||||||
|
redis-data:
|
||||||
|
weaviate-data:
|
||||||
|
minio-data:
|
||||||
|
logs-data:
|
||||||
|
upload-data:
|
||||||
146
docs/docker/ruoyi-ai/docker-compose.yaml
Normal file
@@ -0,0 +1,146 @@
|
|||||||
|
# RuoYi-AI 一键启动后端服务
|
||||||
|
# 使用方式: docker-compose up -d --build
|
||||||
|
#
|
||||||
|
# 包含服务:
|
||||||
|
# - MySQL 8.0 (数据库)
|
||||||
|
# - Redis 6.2 (缓存)
|
||||||
|
# - Weaviate (向量数据库)
|
||||||
|
# - MinIO (对象存储)
|
||||||
|
# - RuoYi-Backend (后端服务,源码编译)
|
||||||
|
|
||||||
|
services:
|
||||||
|
# MySQL 数据库
|
||||||
|
mysql:
|
||||||
|
image: mysql:8.0.33
|
||||||
|
container_name: ruoyi-ai-mysql
|
||||||
|
restart: always
|
||||||
|
ports:
|
||||||
|
- "23306:3306"
|
||||||
|
environment:
|
||||||
|
MYSQL_ROOT_PASSWORD: root
|
||||||
|
MYSQL_DATABASE: ruoyi-ai-agent
|
||||||
|
TZ: Asia/Shanghai
|
||||||
|
volumes:
|
||||||
|
- ../../script/sql/ruoyi-ai.sql:/docker-entrypoint-initdb.d/01-ruoyi-ai.sql:ro
|
||||||
|
- ../../script/sql/snail_job_mysql.sql:/docker-entrypoint-initdb.d/02-snail-job.sql:ro
|
||||||
|
- mysql-data:/var/lib/mysql
|
||||||
|
command:
|
||||||
|
--default-authentication-plugin=mysql_native_password
|
||||||
|
--character-set-server=utf8mb4
|
||||||
|
--collation-server=utf8mb4_general_ci
|
||||||
|
--explicit_defaults_for_timestamp=true
|
||||||
|
--lower_case_table_names=1
|
||||||
|
--skip-ssl
|
||||||
|
healthcheck:
|
||||||
|
# Do not let the socket-only initialization server satisfy the check.
|
||||||
|
# The backend connects over TCP and must wait for that listener.
|
||||||
|
test: ["CMD", "mysqladmin", "ping", "--protocol=tcp", "-h", "127.0.0.1", "-u", "root", "-proot"]
|
||||||
|
interval: 15s
|
||||||
|
timeout: 10s
|
||||||
|
retries: 10
|
||||||
|
start_period: 60s
|
||||||
|
networks:
|
||||||
|
- ruoyi-net
|
||||||
|
|
||||||
|
# Redis 缓存
|
||||||
|
redis:
|
||||||
|
image: redis:6.2
|
||||||
|
container_name: ruoyi-ai-redis
|
||||||
|
restart: always
|
||||||
|
ports:
|
||||||
|
- "6379:6379"
|
||||||
|
volumes:
|
||||||
|
- redis-data:/data
|
||||||
|
command: redis-server --appendonly yes
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "redis-cli", "ping"]
|
||||||
|
interval: 10s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 5
|
||||||
|
networks:
|
||||||
|
- ruoyi-net
|
||||||
|
|
||||||
|
# Weaviate 向量数据库
|
||||||
|
weaviate:
|
||||||
|
image: semitechnologies/weaviate:1.30.0
|
||||||
|
container_name: ruoyi-ai-weaviate
|
||||||
|
restart: always
|
||||||
|
ports:
|
||||||
|
- "28080:8080"
|
||||||
|
environment:
|
||||||
|
QUERY_DEFAULTS_LIMIT: 25
|
||||||
|
AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: true
|
||||||
|
PERSISTENCE_DATA_PATH: /var/lib/weaviate
|
||||||
|
DEFAULT_VECTORIZER_MODULE: none
|
||||||
|
ENABLE_MODULES: text2vec-cohere,text2vec-huggingface,text2vec-palm,text2vec-openai,generative-openai,generative-cohere,generative-palm,ref2vec-centroid,reranker-cohere,qna-openai
|
||||||
|
CLUSTER_HOSTNAME: node1
|
||||||
|
volumes:
|
||||||
|
- weaviate-data:/var/lib/weaviate
|
||||||
|
networks:
|
||||||
|
- ruoyi-net
|
||||||
|
|
||||||
|
# MinIO 对象存储
|
||||||
|
minio:
|
||||||
|
image: minio/minio
|
||||||
|
container_name: ruoyi-ai-minio
|
||||||
|
restart: always
|
||||||
|
ports:
|
||||||
|
- "9000:9000"
|
||||||
|
- "9090:9090"
|
||||||
|
environment:
|
||||||
|
MINIO_ROOT_USER: ruoyi
|
||||||
|
MINIO_ROOT_PASSWORD: ruoyi123
|
||||||
|
volumes:
|
||||||
|
- minio-data:/data
|
||||||
|
command: server /data --console-address ":9090"
|
||||||
|
networks:
|
||||||
|
- ruoyi-net
|
||||||
|
|
||||||
|
# RuoYi-AI 后端服务 (源码编译)
|
||||||
|
backend:
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
dockerfile: Dockerfile.backend
|
||||||
|
container_name: ruoyi-ai-backend
|
||||||
|
restart: always
|
||||||
|
ports:
|
||||||
|
- "26039:6039"
|
||||||
|
environment:
|
||||||
|
TZ: Asia/Shanghai
|
||||||
|
# MySQL 配置
|
||||||
|
SPRING_DATASOURCE_DYNAMIC_PRIMARY: master
|
||||||
|
SPRING_DATASOURCE_DYNAMIC_DATASOURCE_MASTER_DRIVERCLASSNAME: com.mysql.cj.jdbc.Driver
|
||||||
|
SPRING_DATASOURCE_DYNAMIC_DATASOURCE_MASTER_URL: jdbc:mysql://mysql:3306/ruoyi-ai-agent?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true
|
||||||
|
SPRING_DATASOURCE_DYNAMIC_DATASOURCE_MASTER_USERNAME: root
|
||||||
|
SPRING_DATASOURCE_DYNAMIC_DATASOURCE_MASTER_PASSWORD: root
|
||||||
|
# Redis 配置
|
||||||
|
SPRING_DATA_REDIS_HOST: redis
|
||||||
|
SPRING_DATA_REDIS_PORT: 6379
|
||||||
|
SPRING_DATA_REDIS_DATABASE: 0
|
||||||
|
# 日志配置
|
||||||
|
LOGGING_LEVEL_ORG_RUOYI: info
|
||||||
|
LOGGING_LEVEL_ORG_SPRINGFRAMEWORK: warn
|
||||||
|
SYS_UPLOAD_PATH: /ruoyi/upload # 新增:对应 sys.upload.path
|
||||||
|
volumes:
|
||||||
|
- logs-data:/ruoyi/server/logs
|
||||||
|
- upload-data:/ruoyi/upload
|
||||||
|
depends_on:
|
||||||
|
mysql:
|
||||||
|
condition: service_healthy
|
||||||
|
redis:
|
||||||
|
condition: service_started
|
||||||
|
networks:
|
||||||
|
- ruoyi-net
|
||||||
|
|
||||||
|
networks:
|
||||||
|
ruoyi-net:
|
||||||
|
driver: bridge
|
||||||
|
|
||||||
|
# 数据卷 支持手动指定 空为默认值
|
||||||
|
volumes:
|
||||||
|
mysql-data:
|
||||||
|
redis-data:
|
||||||
|
weaviate-data:
|
||||||
|
minio-data:
|
||||||
|
logs-data:
|
||||||
|
upload-data:
|
||||||
@@ -5,12 +5,12 @@ services:
|
|||||||
- --host
|
- --host
|
||||||
- 0.0.0.0
|
- 0.0.0.0
|
||||||
- --port
|
- --port
|
||||||
- '6038'
|
- '8080'
|
||||||
- --scheme
|
- --scheme
|
||||||
- http
|
- http
|
||||||
image: semitechnologies/weaviate:1.19.7
|
image: semitechnologies/weaviate:1.30.0
|
||||||
ports:
|
ports:
|
||||||
- 6038:6038
|
- 28080:8080
|
||||||
- 50051:50051
|
- 50051:50051
|
||||||
volumes:
|
volumes:
|
||||||
- weaviate_data:/var/lib/weaviate
|
- weaviate_data:/var/lib/weaviate
|
||||||
BIN
docs/image/01.png
Normal file
|
After Width: | Height: | Size: 298 KiB |
BIN
docs/image/02.png
Normal file
|
After Width: | Height: | Size: 185 KiB |
BIN
docs/image/03.png
Normal file
|
After Width: | Height: | Size: 316 KiB |
BIN
docs/image/bibi.png
Normal file
|
After Width: | Height: | Size: 70 KiB |
BIN
docs/image/dy.png
Normal file
|
After Width: | Height: | Size: 156 KiB |
BIN
docs/image/logo.png
Normal file
|
After Width: | Height: | Size: 86 KiB |
BIN
docs/image/qq.png
Normal file
|
After Width: | Height: | Size: 193 KiB |
BIN
docs/image/sponsor/atlascloud_banner.png
Normal file
|
After Width: | Height: | Size: 32 KiB |
BIN
docs/image/sponsor/huoshan.png
Normal file
|
After Width: | Height: | Size: 105 KiB |
BIN
docs/image/wx.png
Normal file
|
After Width: | Height: | Size: 151 KiB |
BIN
docs/image/wx06.png
Normal file
|
After Width: | Height: | Size: 112 KiB |
86
docs/script/install-ffmpeg-windows.ps1
Normal file
@@ -0,0 +1,86 @@
|
|||||||
|
[CmdletBinding()]
|
||||||
|
param(
|
||||||
|
[switch]$Force
|
||||||
|
)
|
||||||
|
|
||||||
|
$ErrorActionPreference = 'Stop'
|
||||||
|
|
||||||
|
function Find-Executable([string]$Name) {
|
||||||
|
$command = Get-Command $Name -ErrorAction SilentlyContinue
|
||||||
|
if ($command) {
|
||||||
|
return $command.Source
|
||||||
|
}
|
||||||
|
|
||||||
|
$roots = @(
|
||||||
|
(Join-Path $env:LOCALAPPDATA 'Microsoft\WinGet\Packages'),
|
||||||
|
(Join-Path $env:USERPROFILE 'scoop\apps\ffmpeg'),
|
||||||
|
'C:\ProgramData\chocolatey\bin',
|
||||||
|
'C:\ffmpeg'
|
||||||
|
)
|
||||||
|
foreach ($root in $roots) {
|
||||||
|
if (-not (Test-Path $root)) { continue }
|
||||||
|
$match = Get-ChildItem -Path $root -Filter "$Name.exe" -Recurse -ErrorAction SilentlyContinue |
|
||||||
|
Select-Object -First 1 -ExpandProperty FullName
|
||||||
|
if ($match) { return $match }
|
||||||
|
}
|
||||||
|
return $null
|
||||||
|
}
|
||||||
|
|
||||||
|
$ffmpeg = Find-Executable 'ffmpeg'
|
||||||
|
$ffprobe = Find-Executable 'ffprobe'
|
||||||
|
|
||||||
|
if ($Force -or -not $ffmpeg -or -not $ffprobe) {
|
||||||
|
$winget = Get-Command winget -ErrorAction SilentlyContinue
|
||||||
|
if (-not $winget) {
|
||||||
|
throw '未找到 winget。请先从 Microsoft Store 安装“应用安装程序”,或使用项目 Dockerfile 运行后端。'
|
||||||
|
}
|
||||||
|
|
||||||
|
Write-Host '正在通过 winget 安装 FFmpeg...' -ForegroundColor Cyan
|
||||||
|
& winget install --id Gyan.FFmpeg --exact --source winget `
|
||||||
|
--accept-package-agreements --accept-source-agreements
|
||||||
|
if ($LASTEXITCODE -ne 0) {
|
||||||
|
throw "winget 安装失败,退出码: $LASTEXITCODE"
|
||||||
|
}
|
||||||
|
|
||||||
|
$ffmpeg = Find-Executable 'ffmpeg'
|
||||||
|
$ffprobe = Find-Executable 'ffprobe'
|
||||||
|
}
|
||||||
|
|
||||||
|
if (-not $ffmpeg -or -not $ffprobe) {
|
||||||
|
throw 'FFmpeg 已安装但未能定位 ffmpeg.exe 或 ffprobe.exe。请重新打开 PowerShell 后再次运行脚本。'
|
||||||
|
}
|
||||||
|
|
||||||
|
$binDirectory = Split-Path -Parent $ffmpeg
|
||||||
|
[Environment]::SetEnvironmentVariable('FFMPEG_PATH', $ffmpeg, 'User')
|
||||||
|
[Environment]::SetEnvironmentVariable('FFPROBE_PATH', $ffprobe, 'User')
|
||||||
|
|
||||||
|
$userPath = [Environment]::GetEnvironmentVariable('Path', 'User')
|
||||||
|
$pathParts = @($userPath -split ';' | Where-Object { $_ })
|
||||||
|
if ($pathParts -notcontains $binDirectory) {
|
||||||
|
$newPath = (@($pathParts) + $binDirectory) -join ';'
|
||||||
|
[Environment]::SetEnvironmentVariable('Path', $newPath, 'User')
|
||||||
|
}
|
||||||
|
|
||||||
|
$env:FFMPEG_PATH = $ffmpeg
|
||||||
|
$env:FFPROBE_PATH = $ffprobe
|
||||||
|
if (($env:Path -split ';') -notcontains $binDirectory) {
|
||||||
|
$env:Path = "$binDirectory;$env:Path"
|
||||||
|
}
|
||||||
|
|
||||||
|
Write-Host "ffmpeg: $ffmpeg" -ForegroundColor Green
|
||||||
|
Write-Host "ffprobe: $ffprobe" -ForegroundColor Green
|
||||||
|
|
||||||
|
& $ffmpeg -hide_banner -version | Select-Object -First 1
|
||||||
|
& $ffprobe -hide_banner -version | Select-Object -First 1
|
||||||
|
|
||||||
|
$encoders = & $ffmpeg -hide_banner -encoders 2>&1 | Out-String
|
||||||
|
if ($encoders -notmatch '\blibx264\b') {
|
||||||
|
throw '当前 FFmpeg 不包含 libx264 编码器,无法满足短剧合成配置。'
|
||||||
|
}
|
||||||
|
if ($encoders -notmatch '\baac\b') {
|
||||||
|
throw '当前 FFmpeg 不包含 AAC 编码器,无法满足短剧合成配置。'
|
||||||
|
}
|
||||||
|
|
||||||
|
Write-Host ''
|
||||||
|
Write-Host '安装与配置完成。请完全重启 IntelliJ IDEA 和 ruoyi-ai 后端服务。' -ForegroundColor Yellow
|
||||||
|
Write-Host '重启后,Spring 将从 FFMPEG_PATH 和 FFPROBE_PATH 读取绝对路径。'
|
||||||
129
docs/script/leave/leave1.json
Normal file
@@ -0,0 +1,129 @@
|
|||||||
|
{
|
||||||
|
"nodeList": [
|
||||||
|
{
|
||||||
|
"nodeType": "0",
|
||||||
|
"nodeCode": "d5ee3ddf-3968-4379-a86f-9ceabde5faac",
|
||||||
|
"nodeName": "开始",
|
||||||
|
"permissionFlag": null,
|
||||||
|
"nodeRatio": "0.000",
|
||||||
|
"anyNodeSkip": null,
|
||||||
|
"listenerType": null,
|
||||||
|
"listenerPath": null,
|
||||||
|
"formCustom": "N",
|
||||||
|
"formPath": null,
|
||||||
|
"ext": "[]",
|
||||||
|
"coordinate": "200,200|200,200",
|
||||||
|
"version": "1",
|
||||||
|
"skipList": [
|
||||||
|
{
|
||||||
|
"skipType": "PASS",
|
||||||
|
"skipCondition": null,
|
||||||
|
"skipName": null,
|
||||||
|
"nowNodeCode": "d5ee3ddf-3968-4379-a86f-9ceabde5faac",
|
||||||
|
"nextNodeCode": "dd515cdd-59f6-446f-94ca-25ca062afb42",
|
||||||
|
"coordinate": "220,200;310,200"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nodeType": "1",
|
||||||
|
"nodeCode": "dd515cdd-59f6-446f-94ca-25ca062afb42",
|
||||||
|
"nodeName": "申请人",
|
||||||
|
"permissionFlag": "",
|
||||||
|
"nodeRatio": "0.000",
|
||||||
|
"anyNodeSkip": null,
|
||||||
|
"listenerType": "",
|
||||||
|
"listenerPath": "",
|
||||||
|
"formCustom": "N",
|
||||||
|
"formPath": null,
|
||||||
|
"ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination,file,copy\"}]",
|
||||||
|
"coordinate": "360,200|360,200",
|
||||||
|
"version": "1",
|
||||||
|
"skipList": [
|
||||||
|
{
|
||||||
|
"skipType": "PASS",
|
||||||
|
"skipCondition": null,
|
||||||
|
"skipName": null,
|
||||||
|
"nowNodeCode": "dd515cdd-59f6-446f-94ca-25ca062afb42",
|
||||||
|
"nextNodeCode": "78fa8e5b-e809-44ed-978a-41092409ebcf",
|
||||||
|
"coordinate": "410,200;490,200"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nodeType": "1",
|
||||||
|
"nodeCode": "78fa8e5b-e809-44ed-978a-41092409ebcf",
|
||||||
|
"nodeName": "组长",
|
||||||
|
"permissionFlag": "role:1",
|
||||||
|
"nodeRatio": "0.000",
|
||||||
|
"anyNodeSkip": null,
|
||||||
|
"listenerType": "",
|
||||||
|
"listenerPath": "",
|
||||||
|
"formCustom": "N",
|
||||||
|
"formPath": null,
|
||||||
|
"ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination,copy,transfer,trust,file\"}]",
|
||||||
|
"coordinate": "540,200|540,200",
|
||||||
|
"version": "1",
|
||||||
|
"skipList": [
|
||||||
|
{
|
||||||
|
"skipType": "PASS",
|
||||||
|
"skipCondition": null,
|
||||||
|
"skipName": null,
|
||||||
|
"nowNodeCode": "78fa8e5b-e809-44ed-978a-41092409ebcf",
|
||||||
|
"nextNodeCode": "a8abf15f-b83e-428a-86cc-033555ea9bbe",
|
||||||
|
"coordinate": "590,200;670,200"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nodeType": "1",
|
||||||
|
"nodeCode": "a8abf15f-b83e-428a-86cc-033555ea9bbe",
|
||||||
|
"nodeName": "部门主管",
|
||||||
|
"permissionFlag": "role:3@@role:4",
|
||||||
|
"nodeRatio": "0.000",
|
||||||
|
"anyNodeSkip": null,
|
||||||
|
"listenerType": "",
|
||||||
|
"listenerPath": "",
|
||||||
|
"formCustom": "N",
|
||||||
|
"formPath": null,
|
||||||
|
"ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination,copy,transfer,trust,file\"}]",
|
||||||
|
"coordinate": "720,200|720,200",
|
||||||
|
"version": "1",
|
||||||
|
"skipList": [
|
||||||
|
{
|
||||||
|
"skipType": "PASS",
|
||||||
|
"skipCondition": null,
|
||||||
|
"skipName": null,
|
||||||
|
"nowNodeCode": "a8abf15f-b83e-428a-86cc-033555ea9bbe",
|
||||||
|
"nextNodeCode": "8b82b7d7-8660-455e-b880-d6d22ea3eb6d",
|
||||||
|
"coordinate": "770,200;880,200"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nodeType": "2",
|
||||||
|
"nodeCode": "8b82b7d7-8660-455e-b880-d6d22ea3eb6d",
|
||||||
|
"nodeName": "结束",
|
||||||
|
"permissionFlag": null,
|
||||||
|
"nodeRatio": "0.000",
|
||||||
|
"anyNodeSkip": null,
|
||||||
|
"listenerType": null,
|
||||||
|
"listenerPath": null,
|
||||||
|
"formCustom": "N",
|
||||||
|
"formPath": null,
|
||||||
|
"ext": "[]",
|
||||||
|
"coordinate": "900,200|900,200",
|
||||||
|
"version": "1",
|
||||||
|
"skipList": []
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"flowCode": "leave1",
|
||||||
|
"flowName": "请假申请-普通",
|
||||||
|
"modelValue": "CLASSICS",
|
||||||
|
"category": "103",
|
||||||
|
"version": "1",
|
||||||
|
"formCustom": "N",
|
||||||
|
"formPath": "/workflow/leaveEdit/index",
|
||||||
|
"listenerType": null,
|
||||||
|
"listenerPath": null
|
||||||
|
}
|
||||||
187
docs/script/leave/leave2.json
Normal file
@@ -0,0 +1,187 @@
|
|||||||
|
{
|
||||||
|
"nodeList": [
|
||||||
|
{
|
||||||
|
"nodeType": "0",
|
||||||
|
"nodeCode": "cef3895c-f7d8-4598-8bf3-8ec2ef6ce84a",
|
||||||
|
"nodeName": "开始",
|
||||||
|
"permissionFlag": null,
|
||||||
|
"nodeRatio": "0.000",
|
||||||
|
"anyNodeSkip": null,
|
||||||
|
"listenerType": null,
|
||||||
|
"listenerPath": null,
|
||||||
|
"formCustom": "N",
|
||||||
|
"formPath": null,
|
||||||
|
"ext": "[]",
|
||||||
|
"coordinate": "300,240|300,240",
|
||||||
|
"version": "1",
|
||||||
|
"skipList": [
|
||||||
|
{
|
||||||
|
"skipType": "PASS",
|
||||||
|
"skipCondition": null,
|
||||||
|
"skipName": null,
|
||||||
|
"nowNodeCode": "cef3895c-f7d8-4598-8bf3-8ec2ef6ce84a",
|
||||||
|
"nextNodeCode": "fdcae93b-b69c-498a-b231-09255e74bcbd",
|
||||||
|
"coordinate": "320,240;390,240"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nodeType": "1",
|
||||||
|
"nodeCode": "fdcae93b-b69c-498a-b231-09255e74bcbd",
|
||||||
|
"nodeName": "申请人",
|
||||||
|
"permissionFlag": "",
|
||||||
|
"nodeRatio": "0.000",
|
||||||
|
"anyNodeSkip": null,
|
||||||
|
"listenerType": "",
|
||||||
|
"listenerPath": "",
|
||||||
|
"formCustom": "N",
|
||||||
|
"formPath": null,
|
||||||
|
"ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination,file\"}]",
|
||||||
|
"coordinate": "440,240|440,240",
|
||||||
|
"version": "1",
|
||||||
|
"skipList": [
|
||||||
|
{
|
||||||
|
"skipType": "PASS",
|
||||||
|
"skipCondition": null,
|
||||||
|
"skipName": null,
|
||||||
|
"nowNodeCode": "fdcae93b-b69c-498a-b231-09255e74bcbd",
|
||||||
|
"nextNodeCode": "7b8c7ead-7dc8-4951-a7f3-f0c41995909e",
|
||||||
|
"coordinate": "490,240;535,240"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nodeType": "3",
|
||||||
|
"nodeCode": "7b8c7ead-7dc8-4951-a7f3-f0c41995909e",
|
||||||
|
"permissionFlag": null,
|
||||||
|
"nodeRatio": "0.000",
|
||||||
|
"anyNodeSkip": null,
|
||||||
|
"listenerType": null,
|
||||||
|
"listenerPath": null,
|
||||||
|
"formCustom": "N",
|
||||||
|
"formPath": null,
|
||||||
|
"ext": "[]",
|
||||||
|
"coordinate": "560,240",
|
||||||
|
"version": "1",
|
||||||
|
"skipList": [
|
||||||
|
{
|
||||||
|
"skipType": "PASS",
|
||||||
|
"skipCondition": "le@@leaveDays|2",
|
||||||
|
"skipName": null,
|
||||||
|
"nowNodeCode": "7b8c7ead-7dc8-4951-a7f3-f0c41995909e",
|
||||||
|
"nextNodeCode": "b3528155-dcb7-4445-bbdf-3d00e3499e86",
|
||||||
|
"coordinate": "560,265;560,320;670,320"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"skipType": "PASS",
|
||||||
|
"skipCondition": "gt@@leaveDays|2",
|
||||||
|
"skipName": "大于两天",
|
||||||
|
"nowNodeCode": "7b8c7ead-7dc8-4951-a7f3-f0c41995909e",
|
||||||
|
"nextNodeCode": "5ed2362b-fc0c-4d52-831f-95208b830605",
|
||||||
|
"coordinate": "560,215;560,160;670,160|560,187"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nodeType": "1",
|
||||||
|
"nodeCode": "b3528155-dcb7-4445-bbdf-3d00e3499e86",
|
||||||
|
"nodeName": "组长",
|
||||||
|
"permissionFlag": "3@@4",
|
||||||
|
"nodeRatio": "0.000",
|
||||||
|
"anyNodeSkip": null,
|
||||||
|
"listenerType": "",
|
||||||
|
"listenerPath": "",
|
||||||
|
"formCustom": "N",
|
||||||
|
"formPath": null,
|
||||||
|
"ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination,file,transfer,trust,copy\"}]",
|
||||||
|
"coordinate": "720,320|720,320",
|
||||||
|
"version": "1",
|
||||||
|
"skipList": [
|
||||||
|
{
|
||||||
|
"skipType": "PASS",
|
||||||
|
"skipCondition": null,
|
||||||
|
"skipName": null,
|
||||||
|
"nowNodeCode": "b3528155-dcb7-4445-bbdf-3d00e3499e86",
|
||||||
|
"nextNodeCode": "c9fa6d7d-2a74-4e78-b947-0cad8a6af869",
|
||||||
|
"coordinate": "770,320;860,320;860,280"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nodeType": "1",
|
||||||
|
"nodeCode": "c9fa6d7d-2a74-4e78-b947-0cad8a6af869",
|
||||||
|
"nodeName": "总经理",
|
||||||
|
"permissionFlag": "role:1",
|
||||||
|
"nodeRatio": "0.000",
|
||||||
|
"anyNodeSkip": null,
|
||||||
|
"listenerType": "",
|
||||||
|
"listenerPath": "",
|
||||||
|
"formCustom": "N",
|
||||||
|
"formPath": null,
|
||||||
|
"ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination,file,transfer,trust,copy\"}]",
|
||||||
|
"coordinate": "860,240|860,240",
|
||||||
|
"version": "1",
|
||||||
|
"skipList": [
|
||||||
|
{
|
||||||
|
"skipType": "PASS",
|
||||||
|
"skipCondition": null,
|
||||||
|
"skipName": null,
|
||||||
|
"nowNodeCode": "c9fa6d7d-2a74-4e78-b947-0cad8a6af869",
|
||||||
|
"nextNodeCode": "40aa65fd-0712-4d23-b6f7-d0432b920fd1",
|
||||||
|
"coordinate": "910,240;980,240"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nodeType": "2",
|
||||||
|
"nodeCode": "40aa65fd-0712-4d23-b6f7-d0432b920fd1",
|
||||||
|
"nodeName": "结束",
|
||||||
|
"permissionFlag": null,
|
||||||
|
"nodeRatio": "0.000",
|
||||||
|
"anyNodeSkip": null,
|
||||||
|
"listenerType": null,
|
||||||
|
"listenerPath": null,
|
||||||
|
"formCustom": "N",
|
||||||
|
"formPath": null,
|
||||||
|
"ext": "[]",
|
||||||
|
"coordinate": "1000,240|1000,240",
|
||||||
|
"version": "1",
|
||||||
|
"skipList": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nodeType": "1",
|
||||||
|
"nodeCode": "5ed2362b-fc0c-4d52-831f-95208b830605",
|
||||||
|
"nodeName": "部门领导",
|
||||||
|
"permissionFlag": "role:1",
|
||||||
|
"nodeRatio": "0.000",
|
||||||
|
"anyNodeSkip": null,
|
||||||
|
"listenerType": "",
|
||||||
|
"listenerPath": "",
|
||||||
|
"formCustom": "N",
|
||||||
|
"formPath": null,
|
||||||
|
"ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination,file,transfer,trust,copy\"}]",
|
||||||
|
"coordinate": "720,160|720,160",
|
||||||
|
"version": "1",
|
||||||
|
"skipList": [
|
||||||
|
{
|
||||||
|
"skipType": "PASS",
|
||||||
|
"skipCondition": null,
|
||||||
|
"skipName": null,
|
||||||
|
"nowNodeCode": "5ed2362b-fc0c-4d52-831f-95208b830605",
|
||||||
|
"nextNodeCode": "c9fa6d7d-2a74-4e78-b947-0cad8a6af869",
|
||||||
|
"nextNodeType": "1",
|
||||||
|
"coordinate": "770,160;860,160;860,200"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"flowCode": "leave2",
|
||||||
|
"flowName": "请假申请-排他网关",
|
||||||
|
"modelValue": "CLASSICS",
|
||||||
|
"category": "103",
|
||||||
|
"version": "1",
|
||||||
|
"formCustom": "N",
|
||||||
|
"formPath": "/workflow/leaveEdit/index",
|
||||||
|
"listenerType": null,
|
||||||
|
"listenerPath": null
|
||||||
|
}
|
||||||
211
docs/script/leave/leave3.json
Normal file
@@ -0,0 +1,211 @@
|
|||||||
|
{
|
||||||
|
"nodeList": [
|
||||||
|
{
|
||||||
|
"nodeType": "0",
|
||||||
|
"nodeCode": "a80ecf9f-f465-4ae5-a429-e30ec5d0f957",
|
||||||
|
"nodeName": "开始",
|
||||||
|
"permissionFlag": null,
|
||||||
|
"nodeRatio": "0.000",
|
||||||
|
"anyNodeSkip": null,
|
||||||
|
"listenerType": null,
|
||||||
|
"listenerPath": null,
|
||||||
|
"formCustom": "N",
|
||||||
|
"formPath": null,
|
||||||
|
"ext": "[]",
|
||||||
|
"coordinate": "380,220|380,220",
|
||||||
|
"version": "1",
|
||||||
|
"skipList": [
|
||||||
|
{
|
||||||
|
"skipType": "PASS",
|
||||||
|
"skipCondition": null,
|
||||||
|
"skipName": null,
|
||||||
|
"nowNodeCode": "a80ecf9f-f465-4ae5-a429-e30ec5d0f957",
|
||||||
|
"nextNodeCode": "b7bbb571-06de-455c-8083-f83c07bf0b99",
|
||||||
|
"coordinate": "400,220;470,220"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nodeType": "1",
|
||||||
|
"nodeCode": "b7bbb571-06de-455c-8083-f83c07bf0b99",
|
||||||
|
"nodeName": "申请人",
|
||||||
|
"permissionFlag": "",
|
||||||
|
"nodeRatio": "0.000",
|
||||||
|
"anyNodeSkip": null,
|
||||||
|
"listenerType": "",
|
||||||
|
"listenerPath": "",
|
||||||
|
"formCustom": "N",
|
||||||
|
"formPath": null,
|
||||||
|
"ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination,file\"}]",
|
||||||
|
"coordinate": "520,220|520,220",
|
||||||
|
"version": "1",
|
||||||
|
"skipList": [
|
||||||
|
{
|
||||||
|
"skipType": "PASS",
|
||||||
|
"skipCondition": null,
|
||||||
|
"skipName": null,
|
||||||
|
"nowNodeCode": "b7bbb571-06de-455c-8083-f83c07bf0b99",
|
||||||
|
"nextNodeCode": "84d7ed24-bb44-4ba1-bf1f-e6f5092d3f0a",
|
||||||
|
"coordinate": "570,220;655,220"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nodeType": "4",
|
||||||
|
"nodeCode": "84d7ed24-bb44-4ba1-bf1f-e6f5092d3f0a",
|
||||||
|
"permissionFlag": null,
|
||||||
|
"nodeRatio": "0.000",
|
||||||
|
"anyNodeSkip": null,
|
||||||
|
"listenerType": null,
|
||||||
|
"listenerPath": null,
|
||||||
|
"formCustom": "N",
|
||||||
|
"formPath": null,
|
||||||
|
"ext": "[]",
|
||||||
|
"coordinate": "680,220",
|
||||||
|
"version": "1",
|
||||||
|
"skipList": [
|
||||||
|
{
|
||||||
|
"skipType": "PASS",
|
||||||
|
"skipCondition": null,
|
||||||
|
"skipName": null,
|
||||||
|
"nowNodeCode": "84d7ed24-bb44-4ba1-bf1f-e6f5092d3f0a",
|
||||||
|
"nextNodeCode": "4b7743cd-940c-431b-926f-e7b614fbf1fe",
|
||||||
|
"coordinate": "680,195;680,140;750,140"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"skipType": "PASS",
|
||||||
|
"skipCondition": null,
|
||||||
|
"skipName": null,
|
||||||
|
"nowNodeCode": "84d7ed24-bb44-4ba1-bf1f-e6f5092d3f0a",
|
||||||
|
"nextNodeCode": "762cb975-37d8-4276-b6db-79a4c3606394",
|
||||||
|
"coordinate": "680,245;680,300;750,300"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nodeType": "1",
|
||||||
|
"nodeCode": "4b7743cd-940c-431b-926f-e7b614fbf1fe",
|
||||||
|
"nodeName": "市场部",
|
||||||
|
"permissionFlag": "role:1",
|
||||||
|
"nodeRatio": "0.000",
|
||||||
|
"anyNodeSkip": null,
|
||||||
|
"listenerType": "",
|
||||||
|
"listenerPath": "",
|
||||||
|
"formCustom": "N",
|
||||||
|
"formPath": null,
|
||||||
|
"ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination,file,transfer,trust,copy\"}]",
|
||||||
|
"coordinate": "800,140|800,140",
|
||||||
|
"version": "1",
|
||||||
|
"skipList": [
|
||||||
|
{
|
||||||
|
"skipType": "PASS",
|
||||||
|
"skipCondition": null,
|
||||||
|
"skipName": null,
|
||||||
|
"nowNodeCode": "4b7743cd-940c-431b-926f-e7b614fbf1fe",
|
||||||
|
"nextNodeCode": "b66b6563-f9fe-41cc-a782-f7837bb6f3d2",
|
||||||
|
"coordinate": "850,140;920,140;920,195"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nodeType": "4",
|
||||||
|
"nodeCode": "b66b6563-f9fe-41cc-a782-f7837bb6f3d2",
|
||||||
|
"permissionFlag": null,
|
||||||
|
"nodeRatio": "0.000",
|
||||||
|
"anyNodeSkip": null,
|
||||||
|
"listenerType": null,
|
||||||
|
"listenerPath": null,
|
||||||
|
"formCustom": "N",
|
||||||
|
"formPath": null,
|
||||||
|
"ext": "[]",
|
||||||
|
"coordinate": "920,220",
|
||||||
|
"version": "1",
|
||||||
|
"skipList": [
|
||||||
|
{
|
||||||
|
"skipType": "PASS",
|
||||||
|
"skipCondition": null,
|
||||||
|
"skipName": null,
|
||||||
|
"nowNodeCode": "b66b6563-f9fe-41cc-a782-f7837bb6f3d2",
|
||||||
|
"nextNodeCode": "23e7429e-2b47-4431-b93e-40db7c431ce6",
|
||||||
|
"coordinate": "945,220;975,220;975,220;960,220;960,220;990,220"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nodeType": "1",
|
||||||
|
"nodeCode": "23e7429e-2b47-4431-b93e-40db7c431ce6",
|
||||||
|
"nodeName": "CEO",
|
||||||
|
"permissionFlag": "1",
|
||||||
|
"nodeRatio": "0.000",
|
||||||
|
"anyNodeSkip": null,
|
||||||
|
"listenerType": "",
|
||||||
|
"listenerPath": "",
|
||||||
|
"formCustom": "N",
|
||||||
|
"formPath": null,
|
||||||
|
"ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination,file,transfer,trust,copy\"}]",
|
||||||
|
"coordinate": "1040,220|1040,220",
|
||||||
|
"version": "1",
|
||||||
|
"skipList": [
|
||||||
|
{
|
||||||
|
"skipType": "PASS",
|
||||||
|
"skipCondition": null,
|
||||||
|
"skipName": null,
|
||||||
|
"nowNodeCode": "23e7429e-2b47-4431-b93e-40db7c431ce6",
|
||||||
|
"nextNodeCode": "f5ace37f-5a5e-4e64-a6f6-913ab9a71cd1",
|
||||||
|
"coordinate": "1090,220;1140,220"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nodeType": "2",
|
||||||
|
"nodeCode": "f5ace37f-5a5e-4e64-a6f6-913ab9a71cd1",
|
||||||
|
"nodeName": "结束",
|
||||||
|
"permissionFlag": null,
|
||||||
|
"nodeRatio": "0.000",
|
||||||
|
"anyNodeSkip": null,
|
||||||
|
"listenerType": null,
|
||||||
|
"listenerPath": null,
|
||||||
|
"formCustom": "N",
|
||||||
|
"formPath": null,
|
||||||
|
"ext": "[]",
|
||||||
|
"coordinate": "1160,220|1160,220",
|
||||||
|
"version": "1",
|
||||||
|
"skipList": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nodeType": "1",
|
||||||
|
"nodeCode": "762cb975-37d8-4276-b6db-79a4c3606394",
|
||||||
|
"nodeName": "综合部",
|
||||||
|
"permissionFlag": "role:3@@role:4",
|
||||||
|
"nodeRatio": "0.000",
|
||||||
|
"anyNodeSkip": null,
|
||||||
|
"listenerType": "",
|
||||||
|
"listenerPath": "",
|
||||||
|
"formCustom": "N",
|
||||||
|
"formPath": null,
|
||||||
|
"ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination,file,transfer,trust,copy\"}]",
|
||||||
|
"coordinate": "800,300|800,300",
|
||||||
|
"version": "1",
|
||||||
|
"skipList": [
|
||||||
|
{
|
||||||
|
"skipType": "PASS",
|
||||||
|
"skipCondition": null,
|
||||||
|
"skipName": null,
|
||||||
|
"nowNodeCode": "762cb975-37d8-4276-b6db-79a4c3606394",
|
||||||
|
"nextNodeCode": "b66b6563-f9fe-41cc-a782-f7837bb6f3d2",
|
||||||
|
"nextNodeType": "4",
|
||||||
|
"coordinate": "850,300;920,300;920,245"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"flowCode": "leave3",
|
||||||
|
"flowName": "请假申请-并行网关",
|
||||||
|
"modelValue": "CLASSICS",
|
||||||
|
"category": "103",
|
||||||
|
"version": "1",
|
||||||
|
"formCustom": "N",
|
||||||
|
"formPath": "/workflow/leaveEdit/index",
|
||||||
|
"listenerType": null,
|
||||||
|
"listenerPath": null
|
||||||
|
}
|
||||||
154
docs/script/leave/leave4.json
Normal file
@@ -0,0 +1,154 @@
|
|||||||
|
{
|
||||||
|
"nodeList": [
|
||||||
|
{
|
||||||
|
"nodeType": "0",
|
||||||
|
"nodeCode": "9ce8bf00-f25b-4fc6-91b8-827082fc4876",
|
||||||
|
"nodeName": "开始",
|
||||||
|
"permissionFlag": null,
|
||||||
|
"nodeRatio": "0.000",
|
||||||
|
"anyNodeSkip": null,
|
||||||
|
"listenerType": null,
|
||||||
|
"listenerPath": null,
|
||||||
|
"formCustom": "N",
|
||||||
|
"formPath": null,
|
||||||
|
"ext": "[]",
|
||||||
|
"coordinate": "320,240|320,240",
|
||||||
|
"version": "1",
|
||||||
|
"skipList": [
|
||||||
|
{
|
||||||
|
"skipType": "PASS",
|
||||||
|
"skipCondition": null,
|
||||||
|
"skipName": null,
|
||||||
|
"nowNodeCode": "9ce8bf00-f25b-4fc6-91b8-827082fc4876",
|
||||||
|
"nextNodeCode": "e90b98ef-35b4-410c-a663-bae8b7624b9f",
|
||||||
|
"coordinate": "340,240;410,240"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nodeType": "1",
|
||||||
|
"nodeCode": "e90b98ef-35b4-410c-a663-bae8b7624b9f",
|
||||||
|
"nodeName": "申请人",
|
||||||
|
"permissionFlag": "",
|
||||||
|
"nodeRatio": "0.000",
|
||||||
|
"anyNodeSkip": null,
|
||||||
|
"listenerType": "",
|
||||||
|
"listenerPath": "",
|
||||||
|
"formCustom": "N",
|
||||||
|
"formPath": null,
|
||||||
|
"ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination,file\"}]",
|
||||||
|
"coordinate": "460,240|460,240",
|
||||||
|
"version": "1",
|
||||||
|
"skipList": [
|
||||||
|
{
|
||||||
|
"skipType": "PASS",
|
||||||
|
"skipCondition": null,
|
||||||
|
"skipName": null,
|
||||||
|
"nowNodeCode": "e90b98ef-35b4-410c-a663-bae8b7624b9f",
|
||||||
|
"nextNodeCode": "768b5b1a-6726-4d67-8853-4cc70d5b1045",
|
||||||
|
"coordinate": "510,240;590,240"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nodeType": "1",
|
||||||
|
"nodeCode": "768b5b1a-6726-4d67-8853-4cc70d5b1045",
|
||||||
|
"nodeName": "百分之60通过",
|
||||||
|
"permissionFlag": "${userList}",
|
||||||
|
"nodeRatio": "60.000",
|
||||||
|
"anyNodeSkip": null,
|
||||||
|
"listenerType": "",
|
||||||
|
"listenerPath": "",
|
||||||
|
"formCustom": "N",
|
||||||
|
"formPath": null,
|
||||||
|
"ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination,file,addSign,subSign\"}]",
|
||||||
|
"coordinate": "640,240|640,240",
|
||||||
|
"version": "1",
|
||||||
|
"skipList": [
|
||||||
|
{
|
||||||
|
"skipType": "PASS",
|
||||||
|
"skipCondition": null,
|
||||||
|
"skipName": null,
|
||||||
|
"nowNodeCode": "768b5b1a-6726-4d67-8853-4cc70d5b1045",
|
||||||
|
"nextNodeCode": "2f9f2e21-9bcf-42a3-a07c-13037aad22d1",
|
||||||
|
"coordinate": "690,240;770,240"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nodeType": "1",
|
||||||
|
"nodeCode": "2f9f2e21-9bcf-42a3-a07c-13037aad22d1",
|
||||||
|
"nodeName": "全部审批通过",
|
||||||
|
"permissionFlag": "role:1@@role:3",
|
||||||
|
"nodeRatio": "100.000",
|
||||||
|
"anyNodeSkip": null,
|
||||||
|
"listenerType": "",
|
||||||
|
"listenerPath": "",
|
||||||
|
"formCustom": "N",
|
||||||
|
"formPath": null,
|
||||||
|
"ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination,file,addSign,subSign\"}]",
|
||||||
|
"coordinate": "820,240|820,240",
|
||||||
|
"version": "1",
|
||||||
|
"skipList": [
|
||||||
|
{
|
||||||
|
"skipType": "PASS",
|
||||||
|
"skipCondition": null,
|
||||||
|
"skipName": null,
|
||||||
|
"nowNodeCode": "2f9f2e21-9bcf-42a3-a07c-13037aad22d1",
|
||||||
|
"nextNodeCode": "27461e01-3d9f-4530-8fe3-bd5ec7f9571f",
|
||||||
|
"coordinate": "870,240;950,240"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nodeType": "1",
|
||||||
|
"nodeCode": "27461e01-3d9f-4530-8fe3-bd5ec7f9571f",
|
||||||
|
"nodeName": "CEO",
|
||||||
|
"permissionFlag": "1",
|
||||||
|
"nodeRatio": "0.000",
|
||||||
|
"anyNodeSkip": null,
|
||||||
|
"listenerType": "",
|
||||||
|
"listenerPath": "",
|
||||||
|
"formCustom": "N",
|
||||||
|
"formPath": null,
|
||||||
|
"ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination,file,transfer,trust,copy\"}]",
|
||||||
|
"coordinate": "1000,240|1000,240",
|
||||||
|
"version": "1",
|
||||||
|
"skipList": [
|
||||||
|
{
|
||||||
|
"skipType": "PASS",
|
||||||
|
"skipCondition": null,
|
||||||
|
"skipName": null,
|
||||||
|
"nowNodeCode": "27461e01-3d9f-4530-8fe3-bd5ec7f9571f",
|
||||||
|
"nextNodeCode": "b62b88c3-8d8d-4969-911e-2aaea219e7fc",
|
||||||
|
"coordinate": "1050,240;1080,240;1080,240;1070,240;1070,240;1100,240"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nodeType": "2",
|
||||||
|
"nodeCode": "b62b88c3-8d8d-4969-911e-2aaea219e7fc",
|
||||||
|
"nodeName": "结束",
|
||||||
|
"permissionFlag": null,
|
||||||
|
"nodeRatio": "0.000",
|
||||||
|
"anyNodeSkip": null,
|
||||||
|
"listenerType": null,
|
||||||
|
"listenerPath": null,
|
||||||
|
"formCustom": "N",
|
||||||
|
"formPath": null,
|
||||||
|
"ext": "[]",
|
||||||
|
"coordinate": "1120,240|1120,240",
|
||||||
|
"version": "1",
|
||||||
|
"skipList": []
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"flowCode": "leave4",
|
||||||
|
"flowName": "请假申请-会签",
|
||||||
|
"modelValue": "CLASSICS",
|
||||||
|
"category": "103",
|
||||||
|
"version": "1",
|
||||||
|
"formCustom": "N",
|
||||||
|
"formPath": "/workflow/leaveEdit/index",
|
||||||
|
"listenerType": null,
|
||||||
|
"listenerPath": null
|
||||||
|
}
|
||||||
211
docs/script/leave/leave5.json
Normal file
@@ -0,0 +1,211 @@
|
|||||||
|
{
|
||||||
|
"nodeList": [
|
||||||
|
{
|
||||||
|
"nodeType": "0",
|
||||||
|
"nodeCode": "ebebaf26-9cb6-497e-8119-4c9fed4c597c",
|
||||||
|
"nodeName": "开始",
|
||||||
|
"permissionFlag": null,
|
||||||
|
"nodeRatio": "0.000",
|
||||||
|
"anyNodeSkip": null,
|
||||||
|
"listenerType": null,
|
||||||
|
"listenerPath": null,
|
||||||
|
"formCustom": "N",
|
||||||
|
"formPath": null,
|
||||||
|
"ext": "[]",
|
||||||
|
"coordinate": "300,220|300,220",
|
||||||
|
"version": "1",
|
||||||
|
"skipList": [
|
||||||
|
{
|
||||||
|
"skipType": "PASS",
|
||||||
|
"skipCondition": null,
|
||||||
|
"skipName": null,
|
||||||
|
"nowNodeCode": "ebebaf26-9cb6-497e-8119-4c9fed4c597c",
|
||||||
|
"nextNodeCode": "e1b04e96-dc81-4858-a309-2fe945d2f374",
|
||||||
|
"coordinate": "320,220;350,220;350,220;340,220;340,220;370,220"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nodeType": "1",
|
||||||
|
"nodeCode": "e1b04e96-dc81-4858-a309-2fe945d2f374",
|
||||||
|
"nodeName": "申请人",
|
||||||
|
"permissionFlag": "",
|
||||||
|
"nodeRatio": "0.000",
|
||||||
|
"anyNodeSkip": null,
|
||||||
|
"listenerType": "",
|
||||||
|
"listenerPath": "",
|
||||||
|
"formCustom": "N",
|
||||||
|
"formPath": null,
|
||||||
|
"ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination,file\"}]",
|
||||||
|
"coordinate": "420,220|420,220",
|
||||||
|
"version": "1",
|
||||||
|
"skipList": [
|
||||||
|
{
|
||||||
|
"skipType": "PASS",
|
||||||
|
"skipCondition": null,
|
||||||
|
"skipName": null,
|
||||||
|
"nowNodeCode": "e1b04e96-dc81-4858-a309-2fe945d2f374",
|
||||||
|
"nextNodeCode": "3e743f4f-51ca-41d4-8e94-21f5dd9b59c9",
|
||||||
|
"coordinate": "470,220;535,220"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nodeType": "4",
|
||||||
|
"nodeCode": "3e743f4f-51ca-41d4-8e94-21f5dd9b59c9",
|
||||||
|
"permissionFlag": null,
|
||||||
|
"nodeRatio": "0.000",
|
||||||
|
"anyNodeSkip": null,
|
||||||
|
"listenerType": null,
|
||||||
|
"listenerPath": null,
|
||||||
|
"formCustom": "N",
|
||||||
|
"formPath": null,
|
||||||
|
"ext": "[]",
|
||||||
|
"coordinate": "560,220",
|
||||||
|
"version": "1",
|
||||||
|
"skipList": [
|
||||||
|
{
|
||||||
|
"skipType": "PASS",
|
||||||
|
"skipCondition": null,
|
||||||
|
"skipName": null,
|
||||||
|
"nowNodeCode": "3e743f4f-51ca-41d4-8e94-21f5dd9b59c9",
|
||||||
|
"nextNodeCode": "c80f273e-1f17-4bd8-9ad1-04a4a94ea862",
|
||||||
|
"coordinate": "560,245;560,320;650,320"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"skipType": "PASS",
|
||||||
|
"skipCondition": null,
|
||||||
|
"skipName": null,
|
||||||
|
"nowNodeCode": "3e743f4f-51ca-41d4-8e94-21f5dd9b59c9",
|
||||||
|
"nextNodeCode": "1e3e8d3b-18ae-4d6c-a814-ce0d724adfa4",
|
||||||
|
"coordinate": "560,195;560,120;650,120"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nodeType": "1",
|
||||||
|
"nodeCode": "c80f273e-1f17-4bd8-9ad1-04a4a94ea862",
|
||||||
|
"nodeName": "会签",
|
||||||
|
"permissionFlag": "role:1@@role:3",
|
||||||
|
"nodeRatio": "100.000",
|
||||||
|
"anyNodeSkip": null,
|
||||||
|
"listenerType": "",
|
||||||
|
"listenerPath": "",
|
||||||
|
"formCustom": "N",
|
||||||
|
"formPath": null,
|
||||||
|
"ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination,file,addSign,subSign\"}]",
|
||||||
|
"coordinate": "700,320|700,320",
|
||||||
|
"version": "1",
|
||||||
|
"skipList": [
|
||||||
|
{
|
||||||
|
"skipType": "PASS",
|
||||||
|
"skipCondition": null,
|
||||||
|
"skipName": null,
|
||||||
|
"nowNodeCode": "c80f273e-1f17-4bd8-9ad1-04a4a94ea862",
|
||||||
|
"nextNodeCode": "1a20169e-3d82-4926-a151-e2daad28de1b",
|
||||||
|
"coordinate": "750,320;860,320;860,245"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nodeType": "4",
|
||||||
|
"nodeCode": "1a20169e-3d82-4926-a151-e2daad28de1b",
|
||||||
|
"permissionFlag": null,
|
||||||
|
"nodeRatio": "0.000",
|
||||||
|
"anyNodeSkip": null,
|
||||||
|
"listenerType": null,
|
||||||
|
"listenerPath": null,
|
||||||
|
"formCustom": "N",
|
||||||
|
"formPath": null,
|
||||||
|
"ext": "[]",
|
||||||
|
"coordinate": "860,220",
|
||||||
|
"version": "1",
|
||||||
|
"skipList": [
|
||||||
|
{
|
||||||
|
"skipType": "PASS",
|
||||||
|
"skipCondition": null,
|
||||||
|
"skipName": null,
|
||||||
|
"nowNodeCode": "1a20169e-3d82-4926-a151-e2daad28de1b",
|
||||||
|
"nextNodeCode": "7a8f0473-e409-442e-a843-5c2b813d00e9",
|
||||||
|
"coordinate": "885,220;950,220"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nodeType": "1",
|
||||||
|
"nodeCode": "7a8f0473-e409-442e-a843-5c2b813d00e9",
|
||||||
|
"nodeName": "CEO",
|
||||||
|
"permissionFlag": "1",
|
||||||
|
"nodeRatio": "0.000",
|
||||||
|
"anyNodeSkip": null,
|
||||||
|
"listenerType": "",
|
||||||
|
"listenerPath": "",
|
||||||
|
"formCustom": "N",
|
||||||
|
"formPath": null,
|
||||||
|
"ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination,file,transfer,trust,copy\"}]",
|
||||||
|
"coordinate": "1000,220|1000,220",
|
||||||
|
"version": "1",
|
||||||
|
"skipList": [
|
||||||
|
{
|
||||||
|
"skipType": "PASS",
|
||||||
|
"skipCondition": null,
|
||||||
|
"skipName": null,
|
||||||
|
"nowNodeCode": "7a8f0473-e409-442e-a843-5c2b813d00e9",
|
||||||
|
"nextNodeCode": "03c4d2bc-58b5-4408-a2e4-65afb046f169",
|
||||||
|
"coordinate": "1050,220;1120,220"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nodeType": "2",
|
||||||
|
"nodeCode": "03c4d2bc-58b5-4408-a2e4-65afb046f169",
|
||||||
|
"nodeName": "结束",
|
||||||
|
"permissionFlag": null,
|
||||||
|
"nodeRatio": "0.000",
|
||||||
|
"anyNodeSkip": null,
|
||||||
|
"listenerType": null,
|
||||||
|
"listenerPath": null,
|
||||||
|
"formCustom": "N",
|
||||||
|
"formPath": null,
|
||||||
|
"ext": "[]",
|
||||||
|
"coordinate": "1140,220|1140,220",
|
||||||
|
"version": "1",
|
||||||
|
"skipList": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nodeType": "1",
|
||||||
|
"nodeCode": "1e3e8d3b-18ae-4d6c-a814-ce0d724adfa4",
|
||||||
|
"nodeName": "百分之60票签",
|
||||||
|
"permissionFlag": "${userList}",
|
||||||
|
"nodeRatio": "60.000",
|
||||||
|
"anyNodeSkip": null,
|
||||||
|
"listenerType": "",
|
||||||
|
"listenerPath": "",
|
||||||
|
"formCustom": "N",
|
||||||
|
"formPath": null,
|
||||||
|
"ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination,file,addSign,subSign\"}]",
|
||||||
|
"coordinate": "700,120|700,120",
|
||||||
|
"version": "1",
|
||||||
|
"skipList": [
|
||||||
|
{
|
||||||
|
"skipType": "PASS",
|
||||||
|
"skipCondition": null,
|
||||||
|
"skipName": null,
|
||||||
|
"nowNodeCode": "1e3e8d3b-18ae-4d6c-a814-ce0d724adfa4",
|
||||||
|
"nextNodeCode": "1a20169e-3d82-4926-a151-e2daad28de1b",
|
||||||
|
"nextNodeType": "4",
|
||||||
|
"coordinate": "750,120;860,120;860,195"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"flowCode": "leave5",
|
||||||
|
"flowName": "请假申请-并行会签网关",
|
||||||
|
"modelValue": "CLASSICS",
|
||||||
|
"category": "103",
|
||||||
|
"version": "1",
|
||||||
|
"formCustom": "N",
|
||||||
|
"formPath": "/workflow/leaveEdit/index",
|
||||||
|
"listenerType": null,
|
||||||
|
"listenerPath": null
|
||||||
|
}
|
||||||
368
docs/script/leave/leave6.json
Normal file
@@ -0,0 +1,368 @@
|
|||||||
|
{
|
||||||
|
"nodeList": [
|
||||||
|
{
|
||||||
|
"nodeType": "0",
|
||||||
|
"nodeCode": "122b89a5-7c6f-40a3-aa09-7a263f902054",
|
||||||
|
"nodeName": "开始",
|
||||||
|
"permissionFlag": null,
|
||||||
|
"nodeRatio": "0.000",
|
||||||
|
"anyNodeSkip": null,
|
||||||
|
"listenerType": null,
|
||||||
|
"listenerPath": null,
|
||||||
|
"formCustom": "N",
|
||||||
|
"formPath": null,
|
||||||
|
"ext": "[]",
|
||||||
|
"coordinate": "240,300|240,300",
|
||||||
|
"version": "1",
|
||||||
|
"skipList": [
|
||||||
|
{
|
||||||
|
"skipType": "PASS",
|
||||||
|
"skipCondition": null,
|
||||||
|
"skipName": null,
|
||||||
|
"nowNodeCode": "122b89a5-7c6f-40a3-aa09-7a263f902054",
|
||||||
|
"nextNodeCode": "c25a0e86-fdd1-4f03-8e22-14db70389dbd",
|
||||||
|
"coordinate": "260,300;350,300"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nodeType": "1",
|
||||||
|
"nodeCode": "c25a0e86-fdd1-4f03-8e22-14db70389dbd",
|
||||||
|
"nodeName": "申请人",
|
||||||
|
"permissionFlag": "",
|
||||||
|
"nodeRatio": "0.000",
|
||||||
|
"anyNodeSkip": null,
|
||||||
|
"listenerType": "",
|
||||||
|
"listenerPath": "",
|
||||||
|
"formCustom": "N",
|
||||||
|
"formPath": null,
|
||||||
|
"ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination,file\"}]",
|
||||||
|
"coordinate": "400,300|400,300",
|
||||||
|
"version": "1",
|
||||||
|
"skipList": [
|
||||||
|
{
|
||||||
|
"skipType": "PASS",
|
||||||
|
"skipCondition": null,
|
||||||
|
"skipName": null,
|
||||||
|
"nowNodeCode": "c25a0e86-fdd1-4f03-8e22-14db70389dbd",
|
||||||
|
"nextNodeCode": "07ecda1d-7a0a-47b5-8a91-6186c9473742",
|
||||||
|
"coordinate": "450,300;510,300"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nodeType": "1",
|
||||||
|
"nodeCode": "2bfa3919-78cf-4bc1-b59b-df463a4546f9",
|
||||||
|
"nodeName": "副经理",
|
||||||
|
"permissionFlag": "role:1@@role:3@@role:4",
|
||||||
|
"nodeRatio": "0.000",
|
||||||
|
"anyNodeSkip": null,
|
||||||
|
"listenerType": "",
|
||||||
|
"listenerPath": "",
|
||||||
|
"formCustom": "N",
|
||||||
|
"formPath": null,
|
||||||
|
"ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination\"}]",
|
||||||
|
"coordinate": "860,200|860,200",
|
||||||
|
"version": "1",
|
||||||
|
"skipList": [
|
||||||
|
{
|
||||||
|
"skipType": "PASS",
|
||||||
|
"skipCondition": null,
|
||||||
|
"skipName": null,
|
||||||
|
"nowNodeCode": "2bfa3919-78cf-4bc1-b59b-df463a4546f9",
|
||||||
|
"nextNodeCode": "394e1cc8-b8b2-4189-9f81-44448e88ac32",
|
||||||
|
"coordinate": "910,200;1000,200;1000,275"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nodeType": "1",
|
||||||
|
"nodeCode": "ec17f60e-94e0-4d96-a3ce-3417e9d32d60",
|
||||||
|
"nodeName": "组长",
|
||||||
|
"permissionFlag": "1",
|
||||||
|
"nodeRatio": "0.000",
|
||||||
|
"anyNodeSkip": null,
|
||||||
|
"listenerType": "",
|
||||||
|
"listenerPath": "",
|
||||||
|
"formCustom": "N",
|
||||||
|
"formPath": null,
|
||||||
|
"ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination\"}]",
|
||||||
|
"coordinate": "860,400|860,400",
|
||||||
|
"version": "1",
|
||||||
|
"skipList": [
|
||||||
|
{
|
||||||
|
"skipType": "PASS",
|
||||||
|
"skipCondition": null,
|
||||||
|
"skipName": null,
|
||||||
|
"nowNodeCode": "ec17f60e-94e0-4d96-a3ce-3417e9d32d60",
|
||||||
|
"nextNodeCode": "394e1cc8-b8b2-4189-9f81-44448e88ac32",
|
||||||
|
"coordinate": "910,400;1000,400;1000,325"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nodeType": "1",
|
||||||
|
"nodeCode": "07ecda1d-7a0a-47b5-8a91-6186c9473742",
|
||||||
|
"nodeName": "副组长",
|
||||||
|
"permissionFlag": "1",
|
||||||
|
"nodeRatio": "0.000",
|
||||||
|
"anyNodeSkip": null,
|
||||||
|
"listenerType": "",
|
||||||
|
"listenerPath": "",
|
||||||
|
"formCustom": "N",
|
||||||
|
"formPath": null,
|
||||||
|
"ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination,transfer,copy,pop\"}]",
|
||||||
|
"coordinate": "560,300|560,300",
|
||||||
|
"version": "1",
|
||||||
|
"skipList": [
|
||||||
|
{
|
||||||
|
"skipType": "PASS",
|
||||||
|
"skipCondition": null,
|
||||||
|
"skipName": null,
|
||||||
|
"nowNodeCode": "07ecda1d-7a0a-47b5-8a91-6186c9473742",
|
||||||
|
"nextNodeCode": "48117e2c-6328-406b-b102-c4a9d115bb13",
|
||||||
|
"coordinate": "610,300;675,300"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nodeType": "3",
|
||||||
|
"nodeCode": "48117e2c-6328-406b-b102-c4a9d115bb13",
|
||||||
|
"permissionFlag": null,
|
||||||
|
"nodeRatio": "0.000",
|
||||||
|
"anyNodeSkip": null,
|
||||||
|
"listenerType": null,
|
||||||
|
"listenerPath": null,
|
||||||
|
"formCustom": "N",
|
||||||
|
"formPath": null,
|
||||||
|
"ext": "[]",
|
||||||
|
"coordinate": "700,300",
|
||||||
|
"version": "1",
|
||||||
|
"skipList": [
|
||||||
|
{
|
||||||
|
"skipType": "PASS",
|
||||||
|
"skipCondition": "default@@${leaveDays > 2}",
|
||||||
|
"skipName": "大于两天",
|
||||||
|
"nowNodeCode": "48117e2c-6328-406b-b102-c4a9d115bb13",
|
||||||
|
"nextNodeCode": "2bfa3919-78cf-4bc1-b59b-df463a4546f9",
|
||||||
|
"nextNodeType": "1",
|
||||||
|
"coordinate": "700,275;700,200;810,200|700,237"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"skipType": "PASS",
|
||||||
|
"skipCondition": "spel@@#{@testLeaveServiceImpl.eval(#leaveDays)}",
|
||||||
|
"skipName": null,
|
||||||
|
"nowNodeCode": "48117e2c-6328-406b-b102-c4a9d115bb13",
|
||||||
|
"nextNodeCode": "ec17f60e-94e0-4d96-a3ce-3417e9d32d60",
|
||||||
|
"nextNodeType": "1",
|
||||||
|
"coordinate": "700,325;700,400;810,400"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nodeType": "3",
|
||||||
|
"nodeCode": "394e1cc8-b8b2-4189-9f81-44448e88ac32",
|
||||||
|
"permissionFlag": null,
|
||||||
|
"nodeRatio": "0.000",
|
||||||
|
"anyNodeSkip": null,
|
||||||
|
"listenerType": null,
|
||||||
|
"listenerPath": null,
|
||||||
|
"formCustom": "N",
|
||||||
|
"formPath": null,
|
||||||
|
"ext": "[]",
|
||||||
|
"coordinate": "1000,300",
|
||||||
|
"version": "1",
|
||||||
|
"skipList": [
|
||||||
|
{
|
||||||
|
"skipType": "PASS",
|
||||||
|
"skipCondition": null,
|
||||||
|
"skipName": null,
|
||||||
|
"nowNodeCode": "394e1cc8-b8b2-4189-9f81-44448e88ac32",
|
||||||
|
"nextNodeCode": "9c93a195-cff2-4e17-ab0a-a4f264191496",
|
||||||
|
"coordinate": "1025,300;1130,300"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nodeType": "1",
|
||||||
|
"nodeCode": "9c93a195-cff2-4e17-ab0a-a4f264191496",
|
||||||
|
"nodeName": "经理会签",
|
||||||
|
"permissionFlag": "1@@3",
|
||||||
|
"nodeRatio": "100.000",
|
||||||
|
"anyNodeSkip": null,
|
||||||
|
"listenerType": "",
|
||||||
|
"listenerPath": "",
|
||||||
|
"formCustom": "N",
|
||||||
|
"formPath": null,
|
||||||
|
"ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination,pop,addSign,subSign\"}]",
|
||||||
|
"coordinate": "1180,300|1180,300",
|
||||||
|
"version": "1",
|
||||||
|
"skipList": [
|
||||||
|
{
|
||||||
|
"skipType": "PASS",
|
||||||
|
"skipCondition": null,
|
||||||
|
"skipName": null,
|
||||||
|
"nowNodeCode": "9c93a195-cff2-4e17-ab0a-a4f264191496",
|
||||||
|
"nextNodeCode": "a1a42056-afd1-4e90-88bc-36cbf5a66992",
|
||||||
|
"coordinate": "1230,300;1315,300"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nodeType": "4",
|
||||||
|
"nodeCode": "a1a42056-afd1-4e90-88bc-36cbf5a66992",
|
||||||
|
"permissionFlag": null,
|
||||||
|
"nodeRatio": "0.000",
|
||||||
|
"anyNodeSkip": null,
|
||||||
|
"listenerType": null,
|
||||||
|
"listenerPath": null,
|
||||||
|
"formCustom": "N",
|
||||||
|
"formPath": null,
|
||||||
|
"ext": "[]",
|
||||||
|
"coordinate": "1340,300",
|
||||||
|
"version": "1",
|
||||||
|
"skipList": [
|
||||||
|
{
|
||||||
|
"skipType": "PASS",
|
||||||
|
"skipCondition": null,
|
||||||
|
"skipName": null,
|
||||||
|
"nowNodeCode": "a1a42056-afd1-4e90-88bc-36cbf5a66992",
|
||||||
|
"nextNodeCode": "fcfdd9f6-f526-4c1a-b71d-88afa31aebc5",
|
||||||
|
"coordinate": "1340,325;1340,400;1430,400"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"skipType": "PASS",
|
||||||
|
"skipCondition": null,
|
||||||
|
"skipName": null,
|
||||||
|
"nowNodeCode": "a1a42056-afd1-4e90-88bc-36cbf5a66992",
|
||||||
|
"nextNodeCode": "350dfa0c-a77c-4efa-8527-10efa02d8be4",
|
||||||
|
"coordinate": "1340,275;1340,200;1430,200"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nodeType": "1",
|
||||||
|
"nodeCode": "350dfa0c-a77c-4efa-8527-10efa02d8be4",
|
||||||
|
"nodeName": "总经理",
|
||||||
|
"permissionFlag": "3@@1",
|
||||||
|
"nodeRatio": "0.000",
|
||||||
|
"anyNodeSkip": null,
|
||||||
|
"listenerType": "",
|
||||||
|
"listenerPath": "",
|
||||||
|
"formCustom": "N",
|
||||||
|
"formPath": null,
|
||||||
|
"ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination\"}]",
|
||||||
|
"coordinate": "1480,200|1480,200",
|
||||||
|
"version": "1",
|
||||||
|
"skipList": [
|
||||||
|
{
|
||||||
|
"skipType": "PASS",
|
||||||
|
"skipCondition": null,
|
||||||
|
"skipName": null,
|
||||||
|
"nowNodeCode": "350dfa0c-a77c-4efa-8527-10efa02d8be4",
|
||||||
|
"nextNodeCode": "c36a46ef-04f9-463f-bad7-4b395c818519",
|
||||||
|
"coordinate": "1530,200;1640,200;1640,275"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nodeType": "1",
|
||||||
|
"nodeCode": "fcfdd9f6-f526-4c1a-b71d-88afa31aebc5",
|
||||||
|
"nodeName": "副总经理",
|
||||||
|
"permissionFlag": "1@@3",
|
||||||
|
"nodeRatio": "0.000",
|
||||||
|
"anyNodeSkip": null,
|
||||||
|
"listenerType": "",
|
||||||
|
"listenerPath": "",
|
||||||
|
"formCustom": "N",
|
||||||
|
"formPath": null,
|
||||||
|
"ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination\"}]",
|
||||||
|
"coordinate": "1480,400|1480,400",
|
||||||
|
"version": "1",
|
||||||
|
"skipList": [
|
||||||
|
{
|
||||||
|
"skipType": "PASS",
|
||||||
|
"skipCondition": null,
|
||||||
|
"skipName": null,
|
||||||
|
"nowNodeCode": "fcfdd9f6-f526-4c1a-b71d-88afa31aebc5",
|
||||||
|
"nextNodeCode": "c36a46ef-04f9-463f-bad7-4b395c818519",
|
||||||
|
"coordinate": "1530,400;1640,400;1640,325"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nodeType": "4",
|
||||||
|
"nodeCode": "c36a46ef-04f9-463f-bad7-4b395c818519",
|
||||||
|
"permissionFlag": null,
|
||||||
|
"nodeRatio": "0.000",
|
||||||
|
"anyNodeSkip": null,
|
||||||
|
"listenerType": null,
|
||||||
|
"listenerPath": null,
|
||||||
|
"formCustom": "N",
|
||||||
|
"formPath": null,
|
||||||
|
"ext": "[]",
|
||||||
|
"coordinate": "1640,300",
|
||||||
|
"version": "1",
|
||||||
|
"skipList": [
|
||||||
|
{
|
||||||
|
"skipType": "PASS",
|
||||||
|
"skipCondition": null,
|
||||||
|
"skipName": null,
|
||||||
|
"nowNodeCode": "c36a46ef-04f9-463f-bad7-4b395c818519",
|
||||||
|
"nextNodeCode": "3fcea762-b53a-4ae1-8365-7bec90444828",
|
||||||
|
"coordinate": "1665,300;1770,300"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nodeType": "1",
|
||||||
|
"nodeCode": "3fcea762-b53a-4ae1-8365-7bec90444828",
|
||||||
|
"nodeName": "董事",
|
||||||
|
"permissionFlag": "1",
|
||||||
|
"nodeRatio": "0.000",
|
||||||
|
"anyNodeSkip": null,
|
||||||
|
"listenerType": "",
|
||||||
|
"listenerPath": "",
|
||||||
|
"formCustom": "N",
|
||||||
|
"formPath": null,
|
||||||
|
"ext": "[{\"code\":\"ButtonPermissionEnum\",\"value\":\"back,termination\"}]",
|
||||||
|
"coordinate": "1820,300|1820,300",
|
||||||
|
"version": "1",
|
||||||
|
"skipList": [
|
||||||
|
{
|
||||||
|
"skipType": "PASS",
|
||||||
|
"skipCondition": null,
|
||||||
|
"skipName": null,
|
||||||
|
"nowNodeCode": "3fcea762-b53a-4ae1-8365-7bec90444828",
|
||||||
|
"nextNodeCode": "9cfbfd3e-6c04-41d6-9fc2-6787a7d2cd31",
|
||||||
|
"coordinate": "1870,300;1960,300"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nodeType": "2",
|
||||||
|
"nodeCode": "9cfbfd3e-6c04-41d6-9fc2-6787a7d2cd31",
|
||||||
|
"nodeName": "结束",
|
||||||
|
"permissionFlag": null,
|
||||||
|
"nodeRatio": "0.000",
|
||||||
|
"anyNodeSkip": null,
|
||||||
|
"listenerType": null,
|
||||||
|
"listenerPath": null,
|
||||||
|
"formCustom": "N",
|
||||||
|
"formPath": null,
|
||||||
|
"ext": "[]",
|
||||||
|
"coordinate": "1980,300|1980,300",
|
||||||
|
"version": "1",
|
||||||
|
"skipList": []
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"flowCode": "leave6",
|
||||||
|
"flowName": "请假申请-排他并行会签",
|
||||||
|
"modelValue": "CLASSICS",
|
||||||
|
"category": "103",
|
||||||
|
"version": "1",
|
||||||
|
"formCustom": "N",
|
||||||
|
"formPath": "/workflow/leaveEdit/index",
|
||||||
|
"listenerType": null,
|
||||||
|
"listenerPath": null
|
||||||
|
}
|
||||||
3646
docs/script/sql/ruoyi-ai.sql
Normal file
545
docs/script/sql/snail_job_mysql.sql
Normal file
58
docs/script/sql/update/2026-07-20-knowledge-fragment-fid.sql
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
-- RAG metadata migration (MySQL 8). Safe to execute repeatedly.
|
||||||
|
-- 注意:MySQL 8 不支持 ALTER TABLE ... ADD COLUMN IF NOT EXISTS(仅 MariaDB 支持),
|
||||||
|
-- 因此列的增量添加统一用 information_schema 守卫 + PREPARE 实现幂等。
|
||||||
|
SET @add_file_hash_col = IF(EXISTS(
|
||||||
|
SELECT 1 FROM information_schema.columns WHERE table_schema = DATABASE()
|
||||||
|
AND table_name = 'knowledge_attach' AND column_name = 'file_hash'),
|
||||||
|
'SELECT 1',
|
||||||
|
'ALTER TABLE `knowledge_attach` ADD COLUMN `file_hash` varchar(64) NULL DEFAULT NULL COMMENT ''文件SHA-256摘要'' AFTER `doc_id`');
|
||||||
|
PREPARE stmt FROM @add_file_hash_col; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||||
|
|
||||||
|
ALTER TABLE `knowledge_attach`
|
||||||
|
MODIFY COLUMN `doc_id` varchar(32) NULL DEFAULT NULL COMMENT '文档ID';
|
||||||
|
|
||||||
|
SET @add_file_hash = IF(EXISTS(
|
||||||
|
SELECT 1 FROM information_schema.statistics WHERE table_schema = DATABASE()
|
||||||
|
AND table_name = 'knowledge_attach' AND index_name = 'uk_knowledge_file_hash'),
|
||||||
|
'SELECT 1', 'ALTER TABLE `knowledge_attach` ADD UNIQUE INDEX `uk_knowledge_file_hash` (`knowledge_id`, `file_hash`)');
|
||||||
|
PREPARE stmt FROM @add_file_hash; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||||
|
|
||||||
|
SET @add_fid_col = IF(EXISTS(
|
||||||
|
SELECT 1 FROM information_schema.columns WHERE table_schema = DATABASE()
|
||||||
|
AND table_name = 'knowledge_fragment' AND column_name = 'fid'),
|
||||||
|
'SELECT 1',
|
||||||
|
'ALTER TABLE `knowledge_fragment` ADD COLUMN `fid` varchar(32) NULL DEFAULT NULL COMMENT ''向量库片段ID'' AFTER `id`');
|
||||||
|
PREPARE stmt FROM @add_fid_col; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||||
|
|
||||||
|
ALTER TABLE `knowledge_fragment`
|
||||||
|
MODIFY COLUMN `doc_id` varchar(32) NULL DEFAULT NULL COMMENT '文档ID';
|
||||||
|
|
||||||
|
UPDATE `knowledge_fragment`
|
||||||
|
SET `fid` = LOWER(MD5(CONCAT('knowledge_fragment:', `id`)))
|
||||||
|
WHERE `fid` IS NULL OR `fid` = '';
|
||||||
|
|
||||||
|
SET @drop_idx_fid = IF(EXISTS(
|
||||||
|
SELECT 1 FROM information_schema.statistics WHERE table_schema = DATABASE()
|
||||||
|
AND table_name = 'knowledge_fragment' AND index_name = 'idx_fid'),
|
||||||
|
'ALTER TABLE `knowledge_fragment` DROP INDEX `idx_fid`', 'SELECT 1');
|
||||||
|
PREPARE stmt FROM @drop_idx_fid; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||||
|
|
||||||
|
SET @add_uk_fid = IF(EXISTS(
|
||||||
|
SELECT 1 FROM information_schema.statistics WHERE table_schema = DATABASE()
|
||||||
|
AND table_name = 'knowledge_fragment' AND index_name = 'uk_fid'),
|
||||||
|
'SELECT 1', 'ALTER TABLE `knowledge_fragment` ADD UNIQUE INDEX `uk_fid` (`fid`)');
|
||||||
|
PREPARE stmt FROM @add_uk_fid; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||||
|
|
||||||
|
ALTER TABLE `knowledge_fragment` MODIFY COLUMN `fid` varchar(32) NOT NULL COMMENT '向量库片段ID';
|
||||||
|
|
||||||
|
SET @add_tenant_user = IF(EXISTS(
|
||||||
|
SELECT 1 FROM information_schema.statistics WHERE table_schema = DATABASE()
|
||||||
|
AND table_name = 'knowledge_info' AND index_name = 'idx_tenant_user'),
|
||||||
|
'SELECT 1', 'ALTER TABLE `knowledge_info` ADD INDEX `idx_tenant_user` (`tenant_id`, `user_id`)');
|
||||||
|
PREPARE stmt FROM @add_tenant_user; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||||
|
|
||||||
|
SET @add_tenant_share = IF(EXISTS(
|
||||||
|
SELECT 1 FROM information_schema.statistics WHERE table_schema = DATABASE()
|
||||||
|
AND table_name = 'knowledge_info' AND index_name = 'idx_tenant_share'),
|
||||||
|
'SELECT 1', 'ALTER TABLE `knowledge_info` ADD INDEX `idx_tenant_share` (`tenant_id`, `share`)');
|
||||||
|
PREPARE stmt FROM @add_tenant_share; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
-- 加宽 chat_provider.provider_icon 字段 (对应 issue IHPUDA)
|
||||||
|
-- 背景:文件系统使用 minio 私有桶时,厂商图标存的是带签名的临时访问 URL,
|
||||||
|
-- 长度常超过 255,导致「Data too long for column 'provider_icon'」。
|
||||||
|
-- MODIFY COLUMN 可重复执行。
|
||||||
|
|
||||||
|
ALTER TABLE `chat_provider`
|
||||||
|
MODIFY COLUMN `provider_icon` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '厂商图标';
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
-- 补充工作流节点消息模板配置 (对应 issue IJX5VV)
|
||||||
|
-- 背景:NodeMessageTemplateEnum 依赖以下 7 个 sys_config 键,缺失时
|
||||||
|
-- WorkflowMessageUtil.getNodeMessageTemplate 会抛出「请先配置该节点的响应模板」。
|
||||||
|
-- 这批配置在历史提交 20d531c0 中存在,SQL 脚本合并重命名时遗失,此处恢复。
|
||||||
|
-- 幂等:按 config_key + tenant_id 判重,可重复执行。
|
||||||
|
|
||||||
|
INSERT INTO `sys_config` (`config_id`, `tenant_id`, `config_name`, `config_key`, `config_value`, `config_type`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`)
|
||||||
|
SELECT 2027192921483309058, '000000', 'HTTP请求节点响应模板', 'node.httpRequest.template', '✅ HTTP请求节点:结束响应 - ', 'Y', 103, 1, '2026-02-27 09:23:51', 1, '2026-02-27 09:31:41', NULL
|
||||||
|
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM `sys_config` WHERE `config_key` = 'node.httpRequest.template' AND `tenant_id` = '000000');
|
||||||
|
|
||||||
|
INSERT INTO `sys_config` (`config_id`, `tenant_id`, `config_name`, `config_key`, `config_value`, `config_type`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`)
|
||||||
|
SELECT 2027193296990957569, '000000', '文生图节点响应模板', 'node.image.template', '🎨 文生图节点:结束响应 - 图片URL: ', 'Y', 103, 1, '2026-02-27 09:25:20', 1, '2026-02-27 09:31:52', NULL
|
||||||
|
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM `sys_config` WHERE `config_key` = 'node.image.template' AND `tenant_id` = '000000');
|
||||||
|
|
||||||
|
INSERT INTO `sys_config` (`config_id`, `tenant_id`, `config_name`, `config_key`, `config_value`, `config_type`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`)
|
||||||
|
SELECT 2027193820393959425, '000000', '发送邮箱节点响应模板', 'node.mailsend.template', '📧 发送邮箱节点:结束响应 - ', 'Y', 103, 1, '2026-02-27 09:27:25', 1, '2026-02-27 09:32:05', NULL
|
||||||
|
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM `sys_config` WHERE `config_key` = 'node.mailsend.template' AND `tenant_id` = '000000');
|
||||||
|
|
||||||
|
INSERT INTO `sys_config` (`config_id`, `tenant_id`, `config_name`, `config_key`, `config_value`, `config_type`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`)
|
||||||
|
SELECT 2027194134438277122, '000000', '结束节点响应模板', 'node.end.template', '🔚 流程已执行完毕,如果您有其他需求,请随时重新发起请求。', 'Y', 103, 1, '2026-02-27 09:28:40', 1, '2026-02-27 09:32:53', NULL
|
||||||
|
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM `sys_config` WHERE `config_key` = 'node.end.template' AND `tenant_id` = '000000');
|
||||||
|
|
||||||
|
INSERT INTO `sys_config` (`config_id`, `tenant_id`, `config_name`, `config_key`, `config_value`, `config_type`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`)
|
||||||
|
SELECT 2027208880369647617, '000000', '条件分支节点响应模板', 'node.switch.template', '🔀 条件分支节点:触发 -> 跳转到节点 ', 'Y', 103, 1, '2026-02-27 10:27:15', 1, '2026-02-27 10:35:54', NULL
|
||||||
|
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM `sys_config` WHERE `config_key` = 'node.switch.template' AND `tenant_id` = '000000');
|
||||||
|
|
||||||
|
INSERT INTO `sys_config` (`config_id`, `tenant_id`, `config_name`, `config_key`, `config_value`, `config_type`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`)
|
||||||
|
SELECT 2027213914603995137, '000000', '大模型回答节点响应模板', 'node.llmAnswer.template', '🤖 LLM 节点 生成回答:', 'Y', 103, 1, '2026-02-27 10:47:16', 1, '2026-02-27 10:52:40', NULL
|
||||||
|
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM `sys_config` WHERE `config_key` = 'node.llmAnswer.template' AND `tenant_id` = '000000');
|
||||||
|
|
||||||
|
INSERT INTO `sys_config` (`config_id`, `tenant_id`, `config_name`, `config_key`, `config_value`, `config_type`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`)
|
||||||
|
SELECT 2027217577397391361, '000000', '工作流异常响应模板', 'node.exception.template', '🛑 工作流发生异常:', 'N', 103, 1, '2026-02-27 11:01:49', 1, '2026-02-27 11:02:01', NULL
|
||||||
|
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM `sys_config` WHERE `config_key` = 'node.exception.template' AND `tenant_id` = '000000');
|
||||||
@@ -0,0 +1,119 @@
|
|||||||
|
-- 注册链路修复:补齐缺失的菜单权限标识 + 新建注册默认角色
|
||||||
|
-- 关联问题:
|
||||||
|
-- #3 注册用户无默认角色 -> 无权限访问 AI 对话界面
|
||||||
|
-- #4 sys_menu 缺 system:session:* / system:attach:* / system:fragment:*,
|
||||||
|
-- 且 知识管理 父菜单 perms 为 knowledge:info:list,与控制器
|
||||||
|
-- KnowledgeInfoController 用的 system:info:list 对不上,:list 无法授权。
|
||||||
|
-- 本脚本幂等,可重复执行(INSERT IGNORE + UPDATE 天然幂等)。
|
||||||
|
-- 新增 menu_id / role_id / config_id 统一使用 2099010100000000xxx 段,
|
||||||
|
-- 与现有 snowflake id(2xxxxxxxxxxxxxxxxx)不冲突。
|
||||||
|
|
||||||
|
-- ============================================================
|
||||||
|
-- 1. 修正 知识管理 父菜单权限标识:knowledge:info:list -> system:info:list
|
||||||
|
-- ============================================================
|
||||||
|
UPDATE `sys_menu`
|
||||||
|
SET `perms` = 'system:info:list'
|
||||||
|
WHERE `menu_id` = 2006681261898813441 AND `perms` = 'knowledge:info:list';
|
||||||
|
|
||||||
|
-- ============================================================
|
||||||
|
-- 2. 新增 会话管理 菜单组(system:session:*)
|
||||||
|
-- 父菜单=对话管理(2000209300188356609)。
|
||||||
|
-- 管理端暂无 chat/session 页面,故 C 菜单设为隐藏(visible=1),
|
||||||
|
-- 权限标识仍可在角色管理中授权给用户端使用。
|
||||||
|
-- ============================================================
|
||||||
|
INSERT IGNORE INTO `sys_menu` VALUES
|
||||||
|
(2099010100000000001, '会话管理', 2000209300188356609, 6, 'session', NULL, NULL, 1, 0, 'C', '1', '0', 'system:session:list', '#', 103, 1, '2026-07-24 00:00:00', NULL, NULL, '会话管理菜单'),
|
||||||
|
(2099010100000000002, '会话管理查询', 2099010100000000001, 1, '#', '', NULL, 1, 0, 'F', '0', '0', 'system:session:query', '#', 103, 1, '2026-07-24 00:00:00', NULL, NULL, ''),
|
||||||
|
(2099010100000000003, '会话管理新增', 2099010100000000001, 2, '#', '', NULL, 1, 0, 'F', '0', '0', 'system:session:add', '#', 103, 1, '2026-07-24 00:00:00', NULL, NULL, ''),
|
||||||
|
(2099010100000000004, '会话管理修改', 2099010100000000001, 3, '#', '', NULL, 1, 0, 'F', '0', '0', 'system:session:edit', '#', 103, 1, '2026-07-24 00:00:00', NULL, NULL, ''),
|
||||||
|
(2099010100000000005, '会话管理删除', 2099010100000000001, 4, '#', '', NULL, 1, 0, 'F', '0', '0', 'system:session:remove', '#', 103, 1, '2026-07-24 00:00:00', NULL, NULL, ''),
|
||||||
|
(2099010100000000006, '会话管理导出', 2099010100000000001, 5, '#', '', NULL, 1, 0, 'F', '0', '0', 'system:session:export', '#', 103, 1, '2026-07-24 00:00:00', NULL, NULL, '');
|
||||||
|
|
||||||
|
-- ============================================================
|
||||||
|
-- 3. 新增 知识附件 菜单组(system:attach:*)
|
||||||
|
-- 父菜单=对话管理(2000209300188356609),组件对应管理端 knowledge/attach/index。
|
||||||
|
-- ============================================================
|
||||||
|
INSERT IGNORE INTO `sys_menu` VALUES
|
||||||
|
(2099010100000000010, '知识附件', 2000209300188356609, 7, 'attach', 'knowledge/attach/index', NULL, 1, 0, 'C', '0', '0', 'system:attach:list', 'ant-design:paper-clip-outlined', 103, 1, '2026-07-24 00:00:00', NULL, NULL, '知识附件菜单'),
|
||||||
|
(2099010100000000011, '知识附件查询', 2099010100000000010, 1, '#', '', NULL, 1, 0, 'F', '0', '0', 'system:attach:query', '#', 103, 1, '2026-07-24 00:00:00', NULL, NULL, ''),
|
||||||
|
(2099010100000000012, '知识附件新增', 2099010100000000010, 2, '#', '', NULL, 1, 0, 'F', '0', '0', 'system:attach:add', '#', 103, 1, '2026-07-24 00:00:00', NULL, NULL, ''),
|
||||||
|
(2099010100000000013, '知识附件修改', 2099010100000000010, 3, '#', '', NULL, 1, 0, 'F', '0', '0', 'system:attach:edit', '#', 103, 1, '2026-07-24 00:00:00', NULL, NULL, ''),
|
||||||
|
(2099010100000000014, '知识附件删除', 2099010100000000010, 4, '#', '', NULL, 1, 0, 'F', '0', '0', 'system:attach:remove', '#', 103, 1, '2026-07-24 00:00:00', NULL, NULL, ''),
|
||||||
|
(2099010100000000015, '知识附件导出', 2099010100000000010, 5, '#', '', NULL, 1, 0, 'F', '0', '0', 'system:attach:export', '#', 103, 1, '2026-07-24 00:00:00', NULL, NULL, '');
|
||||||
|
|
||||||
|
-- ============================================================
|
||||||
|
-- 4. 新增 知识片段 菜单组(system:fragment:*)
|
||||||
|
-- 父菜单=对话管理(2000209300188356609),组件对应管理端 knowledge/fragment/index。
|
||||||
|
-- ============================================================
|
||||||
|
INSERT IGNORE INTO `sys_menu` VALUES
|
||||||
|
(2099010100000000020, '知识片段', 2000209300188356609, 8, 'fragment', 'knowledge/fragment/index', NULL, 1, 0, 'C', '0', '0', 'system:fragment:list', 'ant-design:file-text-outlined', 103, 1, '2026-07-24 00:00:00', NULL, NULL, '知识片段菜单'),
|
||||||
|
(2099010100000000021, '知识片段查询', 2099010100000000020, 1, '#', '', NULL, 1, 0, 'F', '0', '0', 'system:fragment:query', '#', 103, 1, '2026-07-24 00:00:00', NULL, NULL, ''),
|
||||||
|
(2099010100000000022, '知识片段新增', 2099010100000000020, 2, '#', '', NULL, 1, 0, 'F', '0', '0', 'system:fragment:add', '#', 103, 1, '2026-07-24 00:00:00', NULL, NULL, ''),
|
||||||
|
(2099010100000000023, '知识片段修改', 2099010100000000020, 3, '#', '', NULL, 1, 0, 'F', '0', '0', 'system:fragment:edit', '#', 103, 1, '2026-07-24 00:00:00', NULL, NULL, ''),
|
||||||
|
(2099010100000000024, '知识片段删除', 2099010100000000020, 4, '#', '', NULL, 1, 0, 'F', '0', '0', 'system:fragment:remove', '#', 103, 1, '2026-07-24 00:00:00', NULL, NULL, ''),
|
||||||
|
(2099010100000000025, '知识片段导出', 2099010100000000020, 5, '#', '', NULL, 1, 0, 'F', '0', '0', 'system:fragment:export', '#', 103, 1, '2026-07-24 00:00:00', NULL, NULL, '');
|
||||||
|
|
||||||
|
-- ============================================================
|
||||||
|
-- 5. 新建 普通用户 角色(租户 000000,data_scope=5 仅本人)
|
||||||
|
-- ============================================================
|
||||||
|
INSERT IGNORE INTO `sys_role` VALUES
|
||||||
|
(2099010100000000030, '000000', '普通用户', 'user', 2, '5', 1, 1, '0', '0', 103, 1, '2026-07-24 00:00:00', NULL, NULL, '注册用户默认角色');
|
||||||
|
|
||||||
|
-- ============================================================
|
||||||
|
-- 6. 角色-菜单关联:普通用户 拥有用户端 AI 对话所需权限
|
||||||
|
-- 会话管理(001-006) + 聊天消息(2000210914680823809 及 810-814)
|
||||||
|
-- + 知识管理(2006681261898813441 及 442-446)
|
||||||
|
-- + 知识附件(010-015) + 知识片段(020-025)
|
||||||
|
-- ============================================================
|
||||||
|
INSERT IGNORE INTO `sys_role_menu` (`role_id`, `menu_id`) VALUES
|
||||||
|
-- 会话管理
|
||||||
|
(2099010100000000030, 2099010100000000001),
|
||||||
|
(2099010100000000030, 2099010100000000002),
|
||||||
|
(2099010100000000030, 2099010100000000003),
|
||||||
|
(2099010100000000030, 2099010100000000004),
|
||||||
|
(2099010100000000030, 2099010100000000005),
|
||||||
|
(2099010100000000030, 2099010100000000006),
|
||||||
|
-- 聊天消息
|
||||||
|
(2099010100000000030, 2000210914680823809),
|
||||||
|
(2099010100000000030, 2000210914680823810),
|
||||||
|
(2099010100000000030, 2000210914680823811),
|
||||||
|
(2099010100000000030, 2000210914680823812),
|
||||||
|
(2099010100000000030, 2000210914680823813),
|
||||||
|
(2099010100000000030, 2000210914680823814),
|
||||||
|
-- 知识管理
|
||||||
|
(2099010100000000030, 2006681261898813441),
|
||||||
|
(2099010100000000030, 2006681261898813442),
|
||||||
|
(2099010100000000030, 2006681261898813443),
|
||||||
|
(2099010100000000030, 2006681261898813444),
|
||||||
|
(2099010100000000030, 2006681261898813445),
|
||||||
|
(2099010100000000030, 2006681261898813446),
|
||||||
|
-- 知识附件
|
||||||
|
(2099010100000000030, 2099010100000000010),
|
||||||
|
(2099010100000000030, 2099010100000000011),
|
||||||
|
(2099010100000000030, 2099010100000000012),
|
||||||
|
(2099010100000000030, 2099010100000000013),
|
||||||
|
(2099010100000000030, 2099010100000000014),
|
||||||
|
(2099010100000000030, 2099010100000000015),
|
||||||
|
-- 知识片段
|
||||||
|
(2099010100000000030, 2099010100000000020),
|
||||||
|
(2099010100000000030, 2099010100000000021),
|
||||||
|
(2099010100000000030, 2099010100000000022),
|
||||||
|
(2099010100000000030, 2099010100000000023),
|
||||||
|
(2099010100000000030, 2099010100000000024),
|
||||||
|
(2099010100000000030, 2099010100000000025);
|
||||||
|
|
||||||
|
-- ============================================================
|
||||||
|
-- 7. 注册默认角色配置项 sys.register.defaultRoleId
|
||||||
|
-- 后端 SysRegisterService 注册成功后读取此配置为新用户绑定角色;
|
||||||
|
-- 值为空字符串时不绑定(保留旧行为)。
|
||||||
|
-- ============================================================
|
||||||
|
INSERT IGNORE INTO `sys_config` VALUES
|
||||||
|
(2099010100000000031, '000000', '注册-默认角色ID', 'sys.register.defaultRoleId', '2099010100000000030', 'Y', 103, 1, '2026-07-24 00:00:00', NULL, NULL, '新注册用户绑定的默认角色ID,留空则不绑定');
|
||||||
|
|
||||||
|
-- ============================================================
|
||||||
|
-- 8. 前置条件(运营项,默认不执行):开启用户注册
|
||||||
|
-- sys.account.registerUser 默认 false,后端 AuthController.register
|
||||||
|
-- 会据此返回「当前系统没有开启注册功能」。若要开放注册,取消注释执行。
|
||||||
|
-- ============================================================
|
||||||
|
-- UPDATE `sys_config` SET `config_value` = 'true'
|
||||||
|
-- WHERE `config_key` = 'sys.account.registerUser' AND `tenant_id` = '000000';
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
-- 一次性补全工作流节点消息模板配置 (NodeMessageTemplateEnum 全部 8 个键)
|
||||||
|
-- 背景:节点执行时 WorkflowMessageUtil.getNodeMessageTemplate 从 sys_config 读取展示模板,
|
||||||
|
-- 历史库中这批配置缺失, 导致运行工作流抛「请先配置该节点的响应模板」。
|
||||||
|
-- 其中前 7 个见 2026-07-21-sys-config-node-template.sql,
|
||||||
|
-- Google Search 为此前从未入库的节点模板。
|
||||||
|
-- 说明:代码已增加内置默认模板兜底, 本脚本为可选, 执行后模板可在 系统管理-配置管理 中自定义。
|
||||||
|
-- 幂等:按 config_key + tenant_id 判重, 可重复执行。
|
||||||
|
|
||||||
|
INSERT INTO `sys_config` (`config_id`, `tenant_id`, `config_name`, `config_key`, `config_value`, `config_type`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`)
|
||||||
|
SELECT 2027192921483309058, '000000', 'HTTP请求节点响应模板', 'node.httpRequest.template', '✅ HTTP请求节点:结束响应 - ', 'Y', 103, 1, '2026-02-27 09:23:51', 1, '2026-02-27 09:31:41', NULL
|
||||||
|
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM `sys_config` WHERE `config_key` = 'node.httpRequest.template' AND `tenant_id` = '000000');
|
||||||
|
|
||||||
|
INSERT INTO `sys_config` (`config_id`, `tenant_id`, `config_name`, `config_key`, `config_value`, `config_type`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`)
|
||||||
|
SELECT 2027193296990957569, '000000', '文生图节点响应模板', 'node.image.template', '🎨 文生图节点:结束响应 - 图片URL: ', 'Y', 103, 1, '2026-02-27 09:25:20', 1, '2026-02-27 09:31:52', NULL
|
||||||
|
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM `sys_config` WHERE `config_key` = 'node.image.template' AND `tenant_id` = '000000');
|
||||||
|
|
||||||
|
INSERT INTO `sys_config` (`config_id`, `tenant_id`, `config_name`, `config_key`, `config_value`, `config_type`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`)
|
||||||
|
SELECT 2027193820393959425, '000000', '发送邮箱节点响应模板', 'node.mailsend.template', '📧 发送邮箱节点:结束响应 - ', 'Y', 103, 1, '2026-02-27 09:27:25', 1, '2026-02-27 09:32:05', NULL
|
||||||
|
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM `sys_config` WHERE `config_key` = 'node.mailsend.template' AND `tenant_id` = '000000');
|
||||||
|
|
||||||
|
INSERT INTO `sys_config` (`config_id`, `tenant_id`, `config_name`, `config_key`, `config_value`, `config_type`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`)
|
||||||
|
SELECT 2027194134438277122, '000000', '结束节点响应模板', 'node.end.template', '🔚 流程已执行完毕,如果您有其他需求,请随时重新发起请求。', 'Y', 103, 1, '2026-02-27 09:28:40', 1, '2026-02-27 09:32:53', NULL
|
||||||
|
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM `sys_config` WHERE `config_key` = 'node.end.template' AND `tenant_id` = '000000');
|
||||||
|
|
||||||
|
INSERT INTO `sys_config` (`config_id`, `tenant_id`, `config_name`, `config_key`, `config_value`, `config_type`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`)
|
||||||
|
SELECT 2027208880369647617, '000000', '条件分支节点响应模板', 'node.switch.template', '🔀 条件分支节点:触发 -> 跳转到节点 ', 'Y', 103, 1, '2026-02-27 10:27:15', 1, '2026-02-27 10:35:54', NULL
|
||||||
|
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM `sys_config` WHERE `config_key` = 'node.switch.template' AND `tenant_id` = '000000');
|
||||||
|
|
||||||
|
INSERT INTO `sys_config` (`config_id`, `tenant_id`, `config_name`, `config_key`, `config_value`, `config_type`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`)
|
||||||
|
SELECT 2027213914603995137, '000000', '大模型回答节点响应模板', 'node.llmAnswer.template', '🤖 LLM 节点 生成回答:', 'Y', 103, 1, '2026-02-27 10:47:16', 1, '2026-02-27 10:52:40', NULL
|
||||||
|
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM `sys_config` WHERE `config_key` = 'node.llmAnswer.template' AND `tenant_id` = '000000');
|
||||||
|
|
||||||
|
INSERT INTO `sys_config` (`config_id`, `tenant_id`, `config_name`, `config_key`, `config_value`, `config_type`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`)
|
||||||
|
SELECT 2027217577397391361, '000000', '工作流异常响应模板', 'node.exception.template', '🛑 工作流发生异常:', 'N', 103, 1, '2026-02-27 11:01:49', 1, '2026-02-27 11:02:01', NULL
|
||||||
|
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM `sys_config` WHERE `config_key` = 'node.exception.template' AND `tenant_id` = '000000');
|
||||||
|
|
||||||
|
INSERT INTO `sys_config` (`config_id`, `tenant_id`, `config_name`, `config_key`, `config_value`, `config_type`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`)
|
||||||
|
SELECT 2084157200000000003, '000000', '网络搜索节点响应模板', 'node.googleSearch.template', '🔍 网络搜索节点处理完成:', 'Y', 103, 1, '2026-07-29 19:40:00', 1, '2026-07-29 19:40:00', NULL
|
||||||
|
FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM `sys_config` WHERE `config_key` = 'node.googleSearch.template' AND `tenant_id` = '000000');
|
||||||
66
docs/script/sql/update/2026-07-29-zhipu-web-search-node.sql
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
-- 智谱 Web Search 工作流扩展节点
|
||||||
|
-- 内部组件名继续使用 Google,以兼容现有前端组件和已保存流程。
|
||||||
|
|
||||||
|
UPDATE `t_workflow_component`
|
||||||
|
SET `title` = '网络搜索',
|
||||||
|
`remark` = '调用智谱 Web Search 检索互联网信息',
|
||||||
|
`display_order` = 40,
|
||||||
|
`is_enable` = 1,
|
||||||
|
`is_deleted` = 0,
|
||||||
|
`update_time` = NOW()
|
||||||
|
WHERE `name` = 'Google'
|
||||||
|
AND `tenant_id` = '000000';
|
||||||
|
|
||||||
|
INSERT INTO `t_workflow_component`
|
||||||
|
(`uuid`, `name`, `title`, `remark`, `display_order`, `is_enable`,
|
||||||
|
`create_time`, `update_time`, `is_deleted`, `tenant_id`)
|
||||||
|
SELECT
|
||||||
|
'a7f8c2d44e5b4c83a9d6f103c2b47e18',
|
||||||
|
'Google',
|
||||||
|
'网络搜索',
|
||||||
|
'调用智谱 Web Search 检索互联网信息',
|
||||||
|
40,
|
||||||
|
1,
|
||||||
|
NOW(),
|
||||||
|
NOW(),
|
||||||
|
0,
|
||||||
|
'000000'
|
||||||
|
FROM DUAL
|
||||||
|
WHERE NOT EXISTS (
|
||||||
|
SELECT 1
|
||||||
|
FROM `t_workflow_component`
|
||||||
|
WHERE `name` = 'Google'
|
||||||
|
AND `tenant_id` = '000000'
|
||||||
|
);
|
||||||
|
|
||||||
|
UPDATE `sys_config`
|
||||||
|
SET `config_name` = '网络搜索节点响应模板',
|
||||||
|
`config_value` = '🔍 网络搜索节点处理完成:',
|
||||||
|
`update_time` = NOW()
|
||||||
|
WHERE `config_key` = 'node.googleSearch.template'
|
||||||
|
AND `tenant_id` = '000000';
|
||||||
|
|
||||||
|
INSERT INTO `sys_config`
|
||||||
|
(`config_id`, `tenant_id`, `config_name`, `config_key`, `config_value`,
|
||||||
|
`config_type`, `create_dept`, `create_by`, `create_time`, `update_by`,
|
||||||
|
`update_time`, `remark`)
|
||||||
|
SELECT
|
||||||
|
2084157200000000003,
|
||||||
|
'000000',
|
||||||
|
'网络搜索节点响应模板',
|
||||||
|
'node.googleSearch.template',
|
||||||
|
'🔍 网络搜索节点处理完成:',
|
||||||
|
'Y',
|
||||||
|
103,
|
||||||
|
1,
|
||||||
|
NOW(),
|
||||||
|
1,
|
||||||
|
NOW(),
|
||||||
|
'智谱 Web Search 工作流扩展节点'
|
||||||
|
FROM DUAL
|
||||||
|
WHERE NOT EXISTS (
|
||||||
|
SELECT 1
|
||||||
|
FROM `sys_config`
|
||||||
|
WHERE `config_key` = 'node.googleSearch.template'
|
||||||
|
AND `tenant_id` = '000000'
|
||||||
|
);
|
||||||