HuangHai 4 weeks ago
commit a6b20e8b73

@ -0,0 +1,160 @@
# 数据库读写分离功能说明
## 概述
本项目已集成数据库读写分离功能,通过修改 `Db.java` 类实现了自动的读写分离路由。该功能具有以下特点:
- **自动检测**:根据 `application.yaml` 配置自动检测是否存在从库配置
- **智能路由**:读操作自动路由到从库,写操作强制使用主库
- **负载均衡**:多个从库时随机选择一个进行读取
- **故障转移**:从库连接失败时自动回退到主库
- **零侵入**:现有代码无需修改,透明支持读写分离
## 配置方式
### 1. 主库配置(必须)
`application_dev.yaml``application_pro.yaml` 中配置主库:
```yaml
mysql:
driverClassName: com.mysql.cj.jdbc.Driver
user: root
password: 123456
jdbcUrl: jdbc:mysql://localhost:3306/dswork?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8&allowMultiQueries=true
```
### 2. 从库配置(可选)
如果需要启用读写分离,添加从库配置:
```yaml
mysql:
driverClassName: com.mysql.cj.jdbc.Driver
user: root
password: 123456
jdbcUrl: jdbc:mysql://localhost:3306/dswork?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8&allowMultiQueries=true
# 从库1
slave1:
driverClassName: com.mysql.cj.jdbc.Driver
user: root
password: 123456
jdbcUrl: jdbc:mysql://slave1:3306/dswork?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8&allowMultiQueries=true
# 从库2
slave2:
driverClassName: com.mysql.cj.jdbc.Driver
user: root
password: 123456
jdbcUrl: jdbc:mysql://slave2:3306/dswork?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8&allowMultiQueries=true
```
## 使用方式
### 1. 自动读写分离(推荐)
现有代码无需修改,系统会自动根据 SQL 类型进行路由:
```java
// 读操作 - 自动路由到从库
List<Record> users = Db.find("select * from user where status = ?", 1);
Record user = Db.findFirst("select * from user where id = ?", 123);
List<Record> result = Db.query("select count(*) from user");
// 写操作 - 强制使用主库
Db.update("insert into user(name, email) values(?, ?)", "张三", "zhangsan@example.com");
Db.update("update user set status = ? where id = ?", 1, 123);
Db.delete("delete from user where id = ?", 123);
// 事务操作 - 强制使用主库
Db.tx(() -> {
Db.update("insert into user(name) values(?)", "李四");
Db.update("update user set status = 1 where name = ?", "李四");
return true;
});
```
### 2. 强制指定数据库
如果需要强制使用特定数据库,可以使用以下方法:
```java
// 强制使用主库查询(用于需要强一致性的场景)
List<Record> users = Db.queryFromMaster("select * from user where id = ?", 123);
Record user = Db.findFirstFromMaster("select * from user where id = ?", 123);
// 强制使用指定从库查询
List<Record> users = Db.queryFromSlave(0, "select * from user"); // 使用第1个从库
```
### 3. 查看读写分离状态
```java
// 获取读写分离状态信息
String status = Db.getReadWriteSeparationStatus();
System.out.println(status);
```
## 自动路由规则
### 读操作(路由到从库)
以下 SQL 语句会自动路由到从库:
- `SELECT` 查询语句
- `SHOW` 语句
- `DESC` / `DESCRIBE` 语句
- `EXPLAIN` 语句
对应的方法包括:
- `Db.find()`、`Db.findFirst()`、`Db.findById()` 等
- `Db.query()`、`Db.queryFirst()`、`Db.queryXxx()` 等
- `Db.paginate()` 分页查询
- `Db.findByCache()` 缓存查询
### 写操作(强制使用主库)
以下操作强制使用主库:
- `INSERT`、`UPDATE`、`DELETE` 语句
- 所有事务操作
- `Db.save()`、`Db.update()`、`Db.delete()` 等
- `Db.tx()` 事务方法
## 性能优化建议
1. **合理配置从库数量**:根据读写比例配置适当数量的从库
2. **使用连接池**:确保主从库都配置了合适的连接池参数
3. **监控从库延迟**:定期检查主从同步延迟,避免读取到过期数据
4. **强一致性场景**:对于需要强一致性的查询,使用 `queryFromMaster()` 方法
## 注意事项
1. **主从同步延迟**:从库可能存在数据同步延迟,对于实时性要求高的查询建议使用主库
2. **事务一致性**:所有事务操作都在主库执行,确保数据一致性
3. **配置格式**:从库配置必须以 `slave` 开头,后跟数字(如 `slave1`、`slave2`
4. **故障处理**:从库连接失败时会自动回退到主库,不会影响业务正常运行
## 启动日志
系统启动时会输出读写分离状态信息:
```
[Db] 读写分离已启用,发现 2 个从库配置
```
```
[Db] 未发现从库配置,使用单库模式
```
## 故障排查
如果读写分离功能异常,请检查:
1. 配置文件中从库配置格式是否正确
2. 从库连接信息是否正确
3. 从库服务是否正常运行
4. 网络连接是否正常
系统会在控制台输出相关错误信息,便于排查问题。

@ -0,0 +1,193 @@
### 一、安装 $ES$
**1、下载安装包**
进入官网下载$linux$安装包 [下载地址](https://www.elastic.co/cn/downloads/elasticsearch)
![img](https://i-blog.csdnimg.cn/direct/04ae4c7f65fe475fb19e913eaf80ba04.png)
**2、安装$JDK$$21$**
```sh
sudo yum install java-21-openjdk-devel
echo 'export JAVA_HOME=/usr/lib/jvm/java-21-openjdk
export PATH=$JAVA_HOME/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
```
**3、上传文件到$linux$服务器**
```sh
# 如果没有 rz 命令 先安装
yum -y install lrzsz
# rz 打开弹窗 选择下载好的文件 确认 在哪个目录下执行,就会上传到该目录下
rz -be
```
**4、新建用户并设置密码**
```sh
# 创建用户
useradd elauser
# 设置密码 符合密码规范 大写 + 小写 + 数字 + 特殊字符 + 大于八位
passwd elauser
#输入密码:
DsideaL@123
tar -zxvf elasticsearch-9.0.2-linux-x86_64.tar.gz
sudo chown -R elauser:elauser /usr/local/elasticsearch-9.0.2
# 进入解压文件并编辑配置文件
cd elasticsearch-9.0.2/config
vi elasticsearch.yml
# 修改数据目录和日志目录
mkdir -p /usr/local/elasticsearch-9.0.2/data
mkdir -p /usr/local/elasticsearch-9.0.2/logs
```
![](https://dsideal.obs.cn-north-1.myhuaweicloud.com/HuangHai/BlogImages/{year}/{month}/{md5}.{extName}/20250623130022571.png)
设置允许所有IP进行访问在添加下面参数让$elasticsearch-head$插件可以访问$es$
![](https://dsideal.obs.cn-north-1.myhuaweicloud.com/HuangHai/BlogImages/{year}/{month}/{md5}.{extName}/20250623130217136.png)
```yaml
network.host: 0.0.0.0
http.cors.enabled: true
http.cors.allow-origin: "*"
```
**5、修改系统配置**
```sh
# m.max_map_count 值太低
# 临时解决方案需要root权限
sudo sysctl -w vm.max_map_count=262144
# 永久解决方案需要root权限
echo "vm.max_map_count=262144" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
# 验证是否有效
sysctl vm.max_map_count
```
**6、启动**
```sh
# 启动
su - elauser
cd /usr/local/elasticsearch-9.0.2/bin
# ./elasticsearch-keystore create
# 启动 -d = damon 守护进程
./elasticsearch -d
# 访问地址
https://10.10.14.206:9200
# 日志文件
/usr/local/elasticsearch-9.0.2/logs/elasticsearch.log
```
弹出输入账号密码,这里需要重置下密码,再登录 进入安装目录的bin目录下
执行下面命令 就会在控制台打印出新密码 账号就是 elastic
```
./elasticsearch-reset-password -u elastic
```
![](https://dsideal.obs.cn-north-1.myhuaweicloud.com/HuangHai/BlogImages/{year}/{month}/{md5}.{extName}/20250623132315148.png)
登录成功,完活。
```sh
elastic
jv9h8uwRrRxmDi1dq6u8
```
![](https://dsideal.obs.cn-north-1.myhuaweicloud.com/HuangHai/BlogImages/{year}/{month}/{md5}.{extName}/20250623132417828.png)
> **注意**:如果访问不到,请检查是否开启了$VPN$
### 二、安装$ik$中文分词插件
```bash
# 安装分词插件
./bin/elasticsearch-plugin install https://get.infini.cloud/elasticsearch/analysis-ik/9.0.2
# 检查插件列表
[elauser@maxkb elasticsearch-9.0.2]$ ./bin/elasticsearch-plugin list
analysis-ik
```
![](https://dsideal.obs.cn-north-1.myhuaweicloud.com/HuangHai/BlogImages/{year}/{month}/{md5}.{extName}/20250623133924355.png)
## 三、安装 $Kibana$
**1、下载 $kibana$**
```sh
# 下载地址
https://www.elastic.co/downloads/past-releases/kibana-9-0-2
# 下载
cd /usr/local
wget https://artifacts.elastic.co/downloads/kibana/kibana-9.0.2-linux-x86_64.tar.gz
tar -xvf kibana-9.0.2-linux-x86_64.tar.gz
# 获取token
curl -k -X POST -u elastic "https://localhost:9200/_security/service/elastic/kibana/credential/token"
```
![](https://dsideal.obs.cn-north-1.myhuaweicloud.com/HuangHai/BlogImages/{year}/{month}/{md5}.{extName}/20250623142510684.png)
```sh
# 返回的token
AAEAAWVsYXN0aWMva2liYW5hL3Rva2VuX2k4bHBtNWNCX2YxTVY1dzdTRjNIOkF5MC1FRDNQU
# 编辑配置文件
cd /usr/local/kibana-9.0.2
vi config/kibana.yml
```
**内容**
```yaml
server.port: 5601
server.host: "0.0.0.0"
server.name: "mykibana"
elasticsearch.hosts: ["https://localhost:9200"]
elasticsearch.serviceAccountToken: "AAEAAWVsYXN0aWMva2liYW5hL3Rva2VuX2k4bHBtNWNCX2YxTVY1dzdTRjNIOkF5MC1FRDNQUWFPZmY2QmIxeTV4QWc"
elasticsearch.ssl.verificationMode: none
i18n.locale: "zh-CN"
xpack.security.encryptionKey: Hz*9yFFaPejHvCkhT*ddNx%WsBgxVSCQ # 自己随意生成的32位加密key
xpack.security.session.idleTimeout: "30m"
```
**3、启动$kibana$**
```sh
nohup ./bin/kibana --allow-root &
# 如果一直5601被 TIME_WAIT,可以结束它
echo "net.ipv4.tcp_tw_reuse = 1" >> /etc/sysctl.conf
sysctl -p
```
![](https://dsideal.obs.cn-north-1.myhuaweicloud.com/HuangHai/BlogImages/{year}/{month}/{md5}.{extName}/20250623143049742.png)
```
elastic
jv9h8uwRrRxmDi1dq6u8
```
![](https://dsideal.obs.cn-north-1.myhuaweicloud.com/HuangHai/BlogImages/{year}/{month}/{md5}.{extName}/20250623143126278.png)

@ -0,0 +1,397 @@
参考文档:
```sh
# Elasticsearch FSCrawler 文档爬虫学习,请先看这一篇!
https://blog.csdn.net/laoyang360/article/details/138143195
```
### 一、$FSCrawler$ 功能介绍
![](https://dsideal.obs.cn-north-1.myhuaweicloud.com/HuangHai/BlogImages/{year}/{month}/{md5}.{extName}/20250623144044965.png)
FSCrawler 提供了一种高效的方法来自动化文件的索引过程,支持多种文件格式,并具备以下核心功能:
多种文件支持能够处理包括但不限于PDF、Microsoft Office文档、OpenOffice文档等多种格式。
文本提取:从上述文件中提取文本,利用 OCR 技术处理图像和扫描的文档。
元数据提取:自动提取文件的元数据,如作者、标题、关键词等。
更新和同步:监视文件夹变化,自动更新索引以反映新增、修改或删除的文件。
安全:支持使用用户名和密码对 Elasticsearch 进行安全连接。
扩展性:可以配置为处理大规模的数据集。
### 二、$FSCrawler$ 下载步骤指南
> **注**:需要开启$VPN$
```sh
https://github.com/dadoonet/fscrawler
# 下载
wget https://s01.oss.sonatype.org/content/repositories/snapshots/fr/pilato/elasticsearch/crawler/fscrawler-distribution/2.10-SNAPSHOT/fscrawler-distribution-2.10-20250305.083042-479.zip
```
![](https://dsideal.obs.cn-north-1.myhuaweicloud.com/HuangHai/BlogImages/{year}/{month}/{md5}.{extName}/20250623143834374.png)
![](https://dsideal.obs.cn-north-1.myhuaweicloud.com/HuangHai/BlogImages/{year}/{month}/{md5}.{extName}/20250623143841189.png)
![](https://dsideal.obs.cn-north-1.myhuaweicloud.com/HuangHai/BlogImages/{year}/{month}/{md5}.{extName}/20250623143847053.png)
这里其实有个小细节,默认最新版本的安装包在页面的最后面,需要不断地下拉到底才能找到。
![](https://dsideal.obs.cn-north-1.myhuaweicloud.com/HuangHai/BlogImages/{year}/{month}/{md5}.{extName}/20250623144005774.png)
### 三、$FSCrawler$ 安装指南
安装很简单,只需要解压下载的文件即可。
将安装包下载或者远程拷贝到 Linux 服务器。
**3.1 步骤1解压 FSCrawler**
![](https://dsideal.obs.cn-north-1.myhuaweicloud.com/HuangHai/BlogImages/{year}/{month}/{md5}.{extName}/20250623144317757.png)
```sh
yum install unzip -y
unzip fscrawler-distribution-2.10-20250305.083042-479.zip
cd fscrawler-distribution-2.10-SNAPSHOT/
```
![](https://dsideal.obs.cn-north-1.myhuaweicloud.com/HuangHai/BlogImages/{year}/{month}/{md5}.{extName}/20250623144504068.png)
**3.2 步骤2启动 FSCrawler**
为了方便咱们在部署路径本地修改和维护配置文件,我们要指定一个本地路径,同时需要写上一个 job 名称。
具体命令行参考如下:
```sh
mkdir test
bin/fscrawler --config_dir ./test fs_job_20240421
```
执行截图参考如下:
![](https://dsideal.obs.cn-north-1.myhuaweicloud.com/HuangHai/BlogImages/{year}/{month}/{md5}.{extName}/20250623144555300.png)
此处有交互,要选择:"y"
![](https://dsideal.obs.cn-north-1.myhuaweicloud.com/HuangHai/BlogImages/{year}/{month}/{md5}.{extName}/20250623144651788.png)
**3.3 步骤3修改配置文件**
经过步骤 2 后test 路径下会创建了名为“fs_job_20240421”的 job 任务,目录结构如下图所示。
```sh
yum install tree -y
tree test
```
![](https://dsideal.obs.cn-north-1.myhuaweicloud.com/HuangHai/BlogImages/{year}/{month}/{md5}.{extName}/20250623144755124.png)
我们先解读一下_settings.yaml 各个字段的含义,然后再说明针对 8.X 版本如何修改。
配置内容主要包括 Elasticsearch 连接信息、文件夹路径、扫描间隔等,如下表格所示。
| 字段名 | 含义 | 使用范例 |
| ------------------------------ | -------------------------------------------------------- | ------------------------------ |
| name | FSCrawler 任务的名称,用于区分不同的索引任务 | name: "fs_job_20240421" |
| fs.url | 需要被索引的文件或目录的路径 | url: "/tmp/es" |
| fs.update_rate | 文件系统检查更新的频率如15分钟检查一次 | update_rate: "15m" |
| fs.excludes | 定义哪些文件应该被排除在外的文件名模式列表(支持通配符) | excludes: ["*/~*"] |
| fs.json_support | 布尔值决定是否解析文件中的JSON内容 | json_support: false |
| fs.filename_as_id | 布尔值是否使用文件名作为Elasticsearch文档ID | filename_as_id: false |
| fs.add_filesize | 布尔值,决定是否将文件大小信息添加到索引中 | add_filesize: true" |
| fs.remove_deleted | 布尔值,决定是否从索引中删除已经在文件系统中删除的文件 | remove_deleted: true" |
| fs.add_as_inner_object | 布尔值,是否将文件信息作为内部对象添加 | add_as_inner_object: false" |
| fs.store_source | 布尔值,是否存储原始文件的内容 | store_source: false" |
| fs.index_content | 布尔值,决定是否索引文件内容 | index_content: true" |
| fs.attributes_support | 布尔值,是否索引文件的属性(如权限等信息) | attributes_support: false" |
| fs.raw_metadata | 布尔值,是否索引文件的原始元数据 | raw_metadata: false" |
| fs.xml_support | 布尔值是否解析和索引XML文件 | xml_support: false" |
| fs.index_folders | 布尔值,是否索引目录结构 | index_folders: true" |
| fs.lang_detect | 布尔值,是否进行语言检测并索引 | lang_detect: false" |
| fs.continue_on_error | 布尔值,是否在遇到错误时继续执行 | continue_on_error: false" |
| fs.ocr.language | OCR处理的语言 | language: "eng" |
| fs.ocr.enabled | 布尔值是否启用OCR功能 | enabled: true" |
| fs.ocr.pdf_strategy | OCR处理PDF文件的策略 | pdf_strategy: "ocr_and_text" |
| fs.follow_symlinks | 布尔值,是否跟随符号链接 | follow_symlinks: false" |
| elasticsearch.nodes.url | Elasticsearch节点的完整URL | url: "https://127.0.0.1:9200" |
| elasticsearch.bulk_size | 在单个批量请求中向Elasticsearch发送的最大文档数量 | bulk_size: 100" |
| elasticsearch.flush_interval | 批量操作的刷新间隔确保数据定期被写入Elasticsearch | flush_interval: "5s" |
| elasticsearch.byte_size | 指定批量请求的最大字节大小 | byte_size: "10mb" |
| elasticsearch.ssl_verification | 布尔值 | |
修改后的正确的可执行的配置如下:
```yaml
name: "fs_job_2024"
fs:
url: "/mingyi_install/zhiwang_fs"
update_rate: "1m"
excludes:
- "*/~*"
json_support: false
filename_as_id: false
add_filesize: true
remove_deleted: true
add_as_inner_object: false
store_source: false
index_content: true
attributes_support: false
raw_metadata: false
xml_support: false
index_folders: true
lang_detect: false
continue_on_error: false
ocr:
language: "eng"
enabled: true
pdf_strategy: "ocr_and_text"
follow_symlinks: false
elasticsearch:
nodes:
- url: "https://127.0.0.1:9200"
bulk_size: 100
flush_interval: "5s"
byte_size: "10mb"
ssl_verification: false
username: elastic
password: changeme
```
极简解读一下:
```
fs 相关的都是文件源头相关配置比如url 代表的是文件存储的路径。
而 elasticsearch 相关的都是:“目的端”,代表 Elasticsearch 集群相关配置。
在 elasticsearch 部分如果不设置 index 相关则同步到Elasticsearch 默认索引名为name下的 "fs_job_2024"名称。
```
更多细节配置参考:
```sh
https://fscrawler.readthedocs.io/en/latest/admin/fs/index.html#example-job-file-specification
```
> 9.X 版本安全需要设置用户名和密码,需要 https 通信。
**3.4 步骤 4: 运行 FSCrawler**
在配置文件设置完毕后,使用命令行启动 FSCrawler命令如下
```sh
bin/fscrawler --config_dir ./test fs_job_20240421
```
再次执行,就能将本地文件写入 Elasticsearch。
![](https://dsideal.obs.cn-north-1.myhuaweicloud.com/HuangHai/BlogImages/{year}/{month}/{md5}.{extName}/20250623145420075.png)
在 kibana Dev-tool 中,我们能看到两个索引。
![](https://dsideal.obs.cn-north-1.myhuaweicloud.com/HuangHai/BlogImages/{year}/{month}/{md5}.{extName}/20250623145440035.png)
其一索引名fs_job_2024 就是 _settings.yaml 配置文件中的最开头的 name。
其存储数据如下基本上文件想的信息比如文件内容、文件基础数据meta、文件创建/修改时间、扩展名、路径等全部都包含了。
![](https://dsideal.obs.cn-north-1.myhuaweicloud.com/HuangHai/BlogImages/{year}/{month}/{md5}.{extName}/20250623145450747.png)
其二索引名fs_job_2024_folder 是基于咱们定义的 name 自动生成和创建的。
存储的是配置的文件路径相关的基础信息。
![7903be0e80ac4b5bcd103bc875bc9c1e.png](https://i-blog.csdnimg.cn/blog_migrate/162ba0377255c72230137899cab4834f.png)
**3.5 步骤 5: 按业务需求修改 Mapping重新导入数据。**
Mapping 映射是默认生成的。
我们朴素的认知:倒排索引的不可变导致我们重新修改 Mapping 后必须重新导入数据。
默认的Mapping可能达不到业务的预期所以咱们必须得修改。
究竟如何改呢?——这个问题我反复验证几个不同方案超过三个小时,最后总结出如下核心步骤。
第一步:先同步讲数据写入 Elasticsearch
同步骤 3.4 所示。
```sh
bin/fscrawler --config_dir ./test fs_job_20240421
```
这个时候,如官方文档所述:
https://fscrawler.readthedocs.io/en/latest/admin/fs/elasticsearch.html#mappings
在 Elasticsearch 集群中会多了如下的索引模版和组件模版。
| 模版类型 | 模版名称 |
| -------- | ------------------------------------ |
| 索引模版 | fscrawler_docs_fs_job_2024 |
| 索引模版 | fscrawler_folders_fs_job_2024_folder |
| 索引模版 | fscrawler_folders_fs_job_folder |
| 索引模版 | fscrawler_docs_fs_job |
| 组件模版 | fscrawler_settings_total_fields |
| 组件模版 | fscrawler_mapping_file |
| 组件模版 | fscrawler_mapping_attributes |
| 组件模版 | fscrawler_mapping_path |
| 组件模版 | fscrawler_alias |
| 组件模版 | fscrawler_mapping_meta |
| 组件模版 | fscrawler_settings_shards |
| 组件模版 | fscrawler_mapping_content |
| 组件模版 | fscrawler_mapping_attachment |
如下指令我和可以看出,一个索引模版由多个组件模版组成。这是 Elasticsearch 模版的最新格式。
![](https://dsideal.obs.cn-north-1.myhuaweicloud.com/HuangHai/BlogImages/{year}/{month}/{md5}.{extName}/20250623145658987.png)
如上表格内容都是 fscrawler 在导入环节自动生成的。
第二步:禁用 FSCrawler 的自动模板推送
在我们之前的 FSCrawler 配置文件 _settings.yaml 中,设置 push_templates 为 false。
该设置阻止 FSCrawler 自动创建和更新 Elasticsearch 的索引模板。
配置示例如下:
```yaml
name: "fs_job_2024"
elasticsearch:
push_templates: false
```
##### 第三步:按需修改组件模版的部分参数
在禁用自动模板推送后,我们需要手动更新或创建所需的 component template以包含中文分词器。
例如,如果我们想对内容字段使用中文分词器,我们可以更新 fscrawler_mapping_content 模板如下:
```yaml
PUT _component_template/fscrawler_mapping_content
{
"template": {
"mappings": {
"properties": {
"content": {
"type": "text",
"analyzer": "ik_max_word"
}
}
}
}
}
######省略其他定制需求########
```
##### 第四步: 删除现有的索引
如果在 Elasticsearch 中已经存在由 FSCrawler 创建的索引,我们需要删除这些索引,因为索引的 mapping 一旦创建后不能直接修改(只能增加字段)。删除索引的命令如下:
```yaml
DELETE fs_job_2024_folder
DELETE fs_job_2024
```
请注意,这将删除所有相关数据,因此请确保我们已经备份了任何重要数据。
**第五步: 重启 FSCrawler**
在更新了 component template 并删除了旧索引后,重新启动 FSCrawler。
现在FSCrawler 将使用我们更新的 template 来创建新的索引,而这次新的索引将包含我们设置的中文分词器。
```
bin/fscrawler --config_dir ./test fs_job_20240421
```
##### 第六步:验证 Mapping
验证新创建的索引是否使用了正确的 mapping 设置。我们可以使用以下命令来查看索引的 mapping
```
GET fs_job_2024/_mapping
```
确保返回的信息中包含了我们配置的中文分词器。
![6b5a42f168ac2819cfc1d58795026f0b.png](https://i-blog.csdnimg.cn/blog_migrate/dffc17fdb1c5d810509b9f05b46d2606.png)
通过以上步骤,我们可以确保 FSCrawler 不会覆盖我们自定义的 Mapping同时能够使用中文分词器来索引文档内容。
这样配置后FSCrawler 在爬取文档到 Elasticsearch 的过程中,就会使用咱们刚才指定的中文分词器进行文本分析。
### 四、FSCrawler 常见使用错误与解决方案
在使用 FSCrawler 进行文件索引时,我们可能会遇到各种问题。本小节将列出一些常见的错误以及相应的解决方案,帮助我们更有效地使用 FSCrawler。
**4.1 问题一:索引大文件和小文件时出现错误**
问题描述当索引包含大小差异很大的文件时可能会遇到“HTTP Entity Too Large”错误 。
解决方案:此错误通常由 Elasticsearch 的 HTTP 请求体大小限制引起。我们可以通过增加服务器的接收限制来解决这个问题:
1.在 Elasticsearch 的配置文件 elasticsearch.yml 中,设置 http.max_content_length 的值更高(例如 200mb缺省100mb
2.重启 Elasticsearch 服务以使配置生效。
3.重新启动 FSCrawler 并再次尝试索引操作。
```
http.max_content_length: 200mb
```
参见:
https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-network.html
**4.2 问题二:索引文件夹未在最新版本中创建**
问题描述:在使用最新版本的 FSCrawler 时,文件夹索引没有被创建 。
解决方案:这可能是由于 FSCrawler 的配置问题或是 Elasticsearch 版本兼容性问题。尝试以下方法:
1.检查 ~/.fscrawler/{job_name}/_settings.json 文件中的 fs.index_folders 设置,确保其值为 true。
2.确认我们的 Elasticsearch 版本与 FSCrawler 的版本兼容。在一些情况下FSCrawler 的新版本可能需要更新的 Elasticsearch 版本。
记得在进行任何配置修改或软件升级后,都应该重启相关服务,以确保所有的更改能够正确应用。
**4.3 问题三:反复闪退问题**
![](https://dsideal.obs.cn-north-1.myhuaweicloud.com/HuangHai/BlogImages/{year}/{month}/{md5}.{extName}/20250623150018611.png)
每次都要求重新创建文件即便已经反复确认创建成功了。这个我花了3个小时左右验证是版本问题需要咱们选择 2.10 最新日期的版本!
**4.4 问题四python Flask 连接报错——security_exception**
```
elasticsearch.exceptions.AuthenticationException: AuthenticationException(401, 'security_exception', 'missing authentication credentials for REST request [/fs_job/_search]')
```
Python 版本问题python 要3.10 以上!否则会报如上错误。
### 五、注意事项及小结
安全配置:在连接到 Elasticsearch 时,如果我们的集群配置了安全认证,确保我们的配置文件中填写了正确的用户名和密码。
OCR 设置如果需要从图像或PDF文档中提取文本请确保我们的系统上安装了 Tesseract OCR并正确配置在 FSCrawler 设置中。
性能优化:对于大数据量的文件处理,考虑适当增加 JVM 的内存分配,以及使用 SSD 硬盘来提升处理速度。
错误处理FSCrawler 会在控制台输出运行日志,如果遇到问题,日志是解决问题的第一手资料。

@ -0,0 +1,7 @@
https://blog.csdn.net/weixin_68792404/article/details/147554090
# 基于 Qwen2.5-14B + Elasticsearch RAG 的大数据知识库智能问答系统
https://jishuzhan.net/article/1898217914180947969
# Elasticsearch FSCrawler 文档爬虫学习,请先看这一篇!
https://blog.csdn.net/laoyang360/article/details/138143195

@ -0,0 +1,872 @@
/**
* Copyright (c) 2011-2025, James Zhan (jfinal@126.com).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.jfinal.plugin.activerecord;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.sql.Connection;
import java.sql.SQLException;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Future;
import java.util.function.Function;
import com.jfinal.kit.SyncWriteMap;
/**
* Db. Powerful database query and update tool box.
*/
@SuppressWarnings("rawtypes")
public class Db {
private static DbPro MAIN = null;
private static final Map<String, DbPro> cache = new SyncWriteMap<>(32, 0.25F);
/**
* for DbKit.addConfig(configName)
*/
static void init(String configName) {
MAIN = DbKit.getConfig(configName).dbProFactory.getDbPro(configName); // new DbPro(configName);
cache.put(configName, MAIN);
}
/**
* for DbKit.removeConfig(configName)
*/
static void removeDbProWithConfig(String configName) {
if (MAIN != null && MAIN.config.getName().equals(configName)) {
MAIN = null;
}
cache.remove(configName);
}
public static DbPro use(String configName) {
DbPro result = cache.get(configName);
if (result == null) {
Config config = DbKit.getConfig(configName);
if (config == null) {
throw new IllegalArgumentException("Config not found by configName: " + configName);
}
result = config.dbProFactory.getDbPro(configName); // new DbPro(configName);
cache.put(configName, result);
}
return result;
}
public static DbPro use() {
return MAIN;
}
static <T> List<T> query(Config config, Connection conn, String sql, Object... paras) throws SQLException {
return MAIN.query(config, conn, sql, paras);
}
/**
* sql paras JDBC Record
*/
public static <T> List<T> query(String sql, Object... paras) {
return MAIN.query(sql, paras);
}
/**
* @see #query(String, Object...)
* @param sql an SQL statement
*/
public static <T> List<T> query(String sql) {
return MAIN.query(sql);
}
/**
* Execute sql query and return the first result. I recommend add "limit 1" in your sql.
* @param sql an SQL statement that may contain one or more '?' IN parameter placeholders
* @param paras the parameters of sql
* @return Object[] if your sql has select more than one column,
* and it return Object if your sql has select only one column.
*/
public static <T> T queryFirst(String sql, Object... paras) {
return MAIN.queryFirst(sql, paras);
}
/**
* @see #queryFirst(String, Object...)
* @param sql an SQL statement
*/
public static <T> T queryFirst(String sql) {
return MAIN.queryFirst(sql);
}
// 26 queryXxx method below -----------------------------------------------
/**
* Execute sql query just return one column.
* @param <T> the type of the column that in your sql's select statement
* @param sql an SQL statement that may contain one or more '?' IN parameter placeholders
* @param paras the parameters of sql
* @return <T> T
*/
public static <T> T queryColumn(String sql, Object... paras) {
return MAIN.queryColumn(sql, paras);
}
public static <T> T queryColumn(String sql) {
return MAIN.queryColumn(sql);
}
public static String queryStr(String sql, Object... paras) {
return MAIN.queryStr(sql, paras);
}
public static String queryStr(String sql) {
return MAIN.queryStr(sql);
}
public static Integer queryInt(String sql, Object... paras) {
return MAIN.queryInt(sql, paras);
}
public static Integer queryInt(String sql) {
return MAIN.queryInt(sql);
}
public static Long queryLong(String sql, Object... paras) {
return MAIN.queryLong(sql, paras);
}
public static Long queryLong(String sql) {
return MAIN.queryLong(sql);
}
public static Double queryDouble(String sql, Object... paras) {
return MAIN.queryDouble(sql, paras);
}
public static Double queryDouble(String sql) {
return MAIN.queryDouble(sql);
}
public static Float queryFloat(String sql, Object... paras) {
return MAIN.queryFloat(sql, paras);
}
public static Float queryFloat(String sql) {
return MAIN.queryFloat(sql);
}
public static BigDecimal queryBigDecimal(String sql, Object... paras) {
return MAIN.queryBigDecimal(sql, paras);
}
public static BigDecimal queryBigDecimal(String sql) {
return MAIN.queryBigDecimal(sql);
}
public static BigInteger queryBigInteger(String sql, Object... paras) {
return MAIN.queryBigInteger(sql, paras);
}
public static BigInteger queryBigInteger(String sql) {
return MAIN.queryBigInteger(sql);
}
public static byte[] queryBytes(String sql, Object... paras) {
return MAIN.queryBytes(sql, paras);
}
public static byte[] queryBytes(String sql) {
return MAIN.queryBytes(sql);
}
public static java.util.Date queryDate(String sql, Object... paras) {
return MAIN.queryDate(sql, paras);
}
public static java.util.Date queryDate(String sql) {
return MAIN.queryDate(sql);
}
public static LocalDateTime queryLocalDateTime(String sql, Object... paras) {
return MAIN.queryLocalDateTime(sql, paras);
}
public static LocalDateTime queryLocalDateTime(String sql) {
return MAIN.queryLocalDateTime(sql);
}
public static java.sql.Time queryTime(String sql, Object... paras) {
return MAIN.queryTime(sql, paras);
}
public static java.sql.Time queryTime(String sql) {
return MAIN.queryTime(sql);
}
public static java.sql.Timestamp queryTimestamp(String sql, Object... paras) {
return MAIN.queryTimestamp(sql, paras);
}
public static java.sql.Timestamp queryTimestamp(String sql) {
return MAIN.queryTimestamp(sql);
}
public static Boolean queryBoolean(String sql, Object... paras) {
return MAIN.queryBoolean(sql, paras);
}
public static Boolean queryBoolean(String sql) {
return MAIN.queryBoolean(sql);
}
public static Short queryShort(String sql, Object... paras) {
return MAIN.queryShort(sql, paras);
}
public static Short queryShort(String sql) {
return MAIN.queryShort(sql);
}
public static Byte queryByte(String sql, Object... paras) {
return MAIN.queryByte(sql, paras);
}
public static Byte queryByte(String sql) {
return MAIN.queryByte(sql);
}
public static Number queryNumber(String sql, Object... paras) {
return MAIN.queryNumber(sql, paras);
}
public static Number queryNumber(String sql) {
return MAIN.queryNumber(sql);
}
// 26 queryXxx method under -----------------------------------------------
/**
* Execute sql update
*/
static int update(Config config, Connection conn, String sql, Object... paras) throws SQLException {
return MAIN.update(config, conn, sql, paras);
}
/**
* Execute update, insert or delete sql statement.
* @param sql an SQL statement that may contain one or more '?' IN parameter placeholders
* @param paras the parameters of sql
* @return either the row count for <code>INSERT</code>, <code>UPDATE</code>,
* or <code>DELETE</code> statements, or 0 for SQL statements
* that return nothing
*/
public static int update(String sql, Object... paras) {
return MAIN.update(sql, paras);
}
/**
* @see #update(String, Object...)
* @param sql an SQL statement
*/
public static int update(String sql) {
return MAIN.update(sql);
}
static List<Record> find(Config config, Connection conn, String sql, Object... paras) throws SQLException {
return MAIN.find(config, conn, sql, paras);
}
/**
* sql paras Record
*/
public static List<Record> find(String sql, Object... paras) {
return MAIN.find(sql, paras);
}
/**
* @see #find(String, Object...)
* @param sql the sql statement
*/
public static List<Record> find(String sql) {
return MAIN.find(sql);
}
public static List<Record> findAll(String tableName) {
return MAIN.findAll(tableName);
}
/**
* Find first record. I recommend add "limit 1" in your sql.
* @param sql an SQL statement that may contain one or more '?' IN parameter placeholders
* @param paras the parameters of sql
* @return the Record object
*/
public static Record findFirst(String sql, Object... paras) {
return MAIN.findFirst(sql, paras);
}
/**
* @see #findFirst(String, Object...)
* @param sql an SQL statement
*/
public static Record findFirst(String sql) {
return MAIN.findFirst(sql);
}
/**
* Find record by id with default primary key.
* <pre>
* Example:
* Record user = Db.findById("user", 15);
* </pre>
* @param tableName the table name of the table
* @param idValue the id value of the record
*/
public static Record findById(String tableName, Object idValue) {
return MAIN.findById(tableName, idValue);
}
public static Record findById(String tableName, String primaryKey, Object idValue) {
return MAIN.findById(tableName, primaryKey, idValue);
}
/**
* Find record by ids.
* <pre>
* Example:
* Record user = Db.findByIds("user", "user_id", 123);
* Record userRole = Db.findByIds("user_role", "user_id, role_id", 123, 456);
* </pre>
* @param tableName the table name of the table
* @param primaryKey the primary key of the table, composite primary key is separated by comma character: ","
* @param idValues the id value of the record, it can be composite id values
*/
public static Record findByIds(String tableName, String primaryKey, Object... idValues) {
return MAIN.findByIds(tableName, primaryKey, idValues);
}
/**
* Delete record by id with default primary key.
* <pre>
* Example:
* Db.deleteById("user", 15);
* </pre>
* @param tableName the table name of the table
* @param idValue the id value of the record
* @return true if delete succeed otherwise false
*/
public static boolean deleteById(String tableName, Object idValue) {
return MAIN.deleteById(tableName, idValue);
}
public static boolean deleteById(String tableName, String primaryKey, Object idValue) {
return MAIN.deleteById(tableName, primaryKey, idValue);
}
/**
* Delete record by ids.
* <pre>
* Example:
* Db.deleteByIds("user", "user_id", 15);
* Db.deleteByIds("user_role", "user_id, role_id", 123, 456);
* </pre>
* @param tableName the table name of the table
* @param primaryKey the primary key of the table, composite primary key is separated by comma character: ","
* @param idValues the id value of the record, it can be composite id values
* @return true if delete succeed otherwise false
*/
public static boolean deleteByIds(String tableName, String primaryKey, Object... idValues) {
return MAIN.deleteByIds(tableName, primaryKey, idValues);
}
/**
* Delete record.
* <pre>
* Example:
* boolean succeed = Db.delete("user", "id", user);
* </pre>
* @param tableName the table name of the table
* @param primaryKey the primary key of the table, composite primary key is separated by comma character: ","
* @param record the record
* @return true if delete succeed otherwise false
*/
public static boolean delete(String tableName, String primaryKey, Record record) {
return MAIN.delete(tableName, primaryKey, record);
}
/**
* <pre>
* Example:
* boolean succeed = Db.delete("user", user);
* </pre>
* @see #delete(String, String, Record)
*/
public static boolean delete(String tableName, Record record) {
return MAIN.delete(tableName, record);
}
/**
* Execute delete sql statement.
* @param sql an SQL statement that may contain one or more '?' IN parameter placeholders
* @param paras the parameters of sql
* @return the row count for <code>DELETE</code> statements, or 0 for SQL statements
* that return nothing
*/
public static int delete(String sql, Object... paras) {
return MAIN.delete(sql, paras);
}
/**
* @see #delete(String, Object...)
* @param sql an SQL statement
*/
public static int delete(String sql) {
return MAIN.delete(sql);
}
static Page<Record> paginate(Config config, Connection conn, int pageNumber, int pageSize, String select, String sqlExceptSelect, Object... paras) throws SQLException {
return MAIN.paginate(config, conn, pageNumber, pageSize, select, sqlExceptSelect, paras);
}
/**
* Paginate.
* @param pageNumber the page number
* @param pageSize the page size
* @param select the select part of the sql statement
* @param sqlExceptSelect the sql statement excluded select part
* @param paras the parameters of sql
* @return the Page object
*/
public static Page<Record> paginate(int pageNumber, int pageSize, String select, String sqlExceptSelect, Object... paras) {
return MAIN.paginate(pageNumber, pageSize, select, sqlExceptSelect, paras);
}
public static Page<Record> paginate(int pageNumber, int pageSize, boolean isGroupBySql, String select, String sqlExceptSelect, Object... paras) {
return MAIN.paginate(pageNumber, pageSize, isGroupBySql, select, sqlExceptSelect, paras);
}
/**
*
*/
public static Page<Record> paginate(int pageNumber, int pageSize, String select, String sqlExceptSelect) {
return MAIN.paginate(pageNumber, pageSize, select, sqlExceptSelect);
}
public static Page<Record> paginateByFullSql(int pageNumber, int pageSize, String totalRowSql, String findSql, Object... paras) {
return MAIN.paginateByFullSql(pageNumber, pageSize, totalRowSql, findSql, paras);
}
public static Page<Record> paginateByFullSql(int pageNumber, int pageSize, boolean isGroupBySql, String totalRowSql, String findSql, Object... paras) {
return MAIN.paginateByFullSql(pageNumber, pageSize, isGroupBySql, totalRowSql, findSql, paras);
}
static boolean save(Config config, Connection conn, String tableName, String primaryKey, Record record) throws SQLException {
return MAIN.save(config, conn, tableName, primaryKey, record);
}
/**
* Save record.
* <pre>
* Example:
* Record userRole = new Record().set("user_id", 123).set("role_id", 456);
* Db.save("user_role", "user_id, role_id", userRole);
* </pre>
* @param tableName the table name of the table
* @param primaryKey the primary key of the table, composite primary key is separated by comma character: ","
* @param record the record will be saved
* @return true if save succeed otherwise false
*/
public static boolean save(String tableName, String primaryKey, Record record) {
return MAIN.save(tableName, primaryKey, record);
}
/**
* @see #save(String, String, Record)
*/
public static boolean save(String tableName, Record record) {
return MAIN.save(tableName, record);
}
static boolean update(Config config, Connection conn, String tableName, String primaryKey, Record record) throws SQLException {
return MAIN.update(config, conn, tableName, primaryKey, record);
}
/**
* Update Record.
* <pre>
* Example:
* Db.update("user_role", "user_id, role_id", record);
* </pre>
* @param tableName the table name of the Record save to
* @param primaryKey the primary key of the table, composite primary key is separated by comma character: ","
* @param record the Record object
* @return true if update succeed otherwise false
*/
public static boolean update(String tableName, String primaryKey, Record record) {
return MAIN.update(tableName, primaryKey, record);
}
/**
* Update record with default primary key.
* <pre>
* Example:
* Db.update("user", record);
* </pre>
* @see #update(String, String, Record)
*/
public static boolean update(String tableName, Record record) {
return MAIN.update(tableName, record);
}
/**
* @see #execute(Config, ICallback)
*/
public static Object execute(ICallback callback) {
return MAIN.execute(callback);
}
/**
* Execute callback. It is useful when all the API can not satisfy your requirement.
* @param config the Config object
* @param callback the ICallback interface
*/
static Object execute(Config config, ICallback callback) {
return MAIN.execute(config, callback);
}
/**
* Execute transaction.
* @param config the Config object
* @param transactionLevel the transaction level
* @param atom the atom operation
* @return true if transaction executing succeed otherwise false
*/
static boolean tx(Config config, int transactionLevel, IAtom atom) {
return MAIN.tx(config, transactionLevel, atom);
}
/**
* Execute transaction with default transaction level.
* @see #tx(int, IAtom)
*/
public static boolean tx(IAtom atom) {
return MAIN.tx(atom);
}
public static boolean tx(int transactionLevel, IAtom atom) {
return MAIN.tx(transactionLevel, atom);
}
/**
*
*
* https://jfinal.com/feedback/4008
*
*
*
*
* 使 txInNewThread(...)
* Connection 线 txInNewThread(...)
* 线
*/
public static Future<Boolean> txInNewThread(IAtom atom) {
return MAIN.txInNewThread(atom);
}
public static Future<Boolean> txInNewThread(int transactionLevel, IAtom atom) {
return MAIN.txInNewThread(transactionLevel, atom);
}
/**
* Find Record by cache.
* @see #find(String, Object...)
* @param cacheName the cache name
* @param key the key used to get date from cache
* @return the list of Record
*/
public static List<Record> findByCache(String cacheName, Object key, String sql, Object... paras) {
return MAIN.findByCache(cacheName, key, sql, paras);
}
/**
* @see #findByCache(String, Object, String, Object...)
*/
public static List<Record> findByCache(String cacheName, Object key, String sql) {
return MAIN.findByCache(cacheName, key, sql);
}
/**
* Find first record by cache. I recommend add "limit 1" in your sql.
* @see #findFirst(String, Object...)
* @param cacheName the cache name
* @param key the key used to get date from cache
* @param sql an SQL statement that may contain one or more '?' IN parameter placeholders
* @param paras the parameters of sql
* @return the Record object
*/
public static Record findFirstByCache(String cacheName, Object key, String sql, Object... paras) {
return MAIN.findFirstByCache(cacheName, key, sql, paras);
}
/**
* @see #findFirstByCache(String, Object, String, Object...)
*/
public static Record findFirstByCache(String cacheName, Object key, String sql) {
return MAIN.findFirstByCache(cacheName, key, sql);
}
/**
* Paginate by cache.
* @see #paginate(int, int, String, String, Object...)
* @return Page
*/
public static Page<Record> paginateByCache(String cacheName, Object key, int pageNumber, int pageSize, String select, String sqlExceptSelect, Object... paras) {
return MAIN.paginateByCache(cacheName, key, pageNumber, pageSize, select, sqlExceptSelect, paras);
}
public static Page<Record> paginateByCache(String cacheName, Object key, int pageNumber, int pageSize, boolean isGroupBySql, String select, String sqlExceptSelect, Object... paras) {
return MAIN.paginateByCache(cacheName, key, pageNumber, pageSize, isGroupBySql, select, sqlExceptSelect, paras);
}
/**
* @see #paginateByCache(String, Object, int, int, String, String, Object...)
*/
public static Page<Record> paginateByCache(String cacheName, Object key, int pageNumber, int pageSize, String select, String sqlExceptSelect) {
return MAIN.paginateByCache(cacheName, key, pageNumber, pageSize, select, sqlExceptSelect);
}
/**
* @see DbPro#batch(String, Object[][], int)
*/
public static int[] batch(String sql, Object[][] paras, int batchSize) {
return MAIN.batch(sql, paras, batchSize);
}
/**
* @see DbPro#batch(String, String, List, int)
*/
public static int[] batch(String sql, String columns, List modelOrRecordList, int batchSize) {
return MAIN.batch(sql, columns, modelOrRecordList, batchSize);
}
/**
* @see DbPro#batch(List, int)
*/
public static int[] batch(List<String> sqlList, int batchSize) {
return MAIN.batch(sqlList, batchSize);
}
/**
* @see DbPro#batchSave(List, int)
*/
public static int[] batchSave(List<? extends Model> modelList, int batchSize) {
return MAIN.batchSave(modelList, batchSize);
}
/**
* @see DbPro#batchSave(String, List, int)
*/
public static int[] batchSave(String tableName, List<? extends Record> recordList, int batchSize) {
return MAIN.batchSave(tableName, recordList, batchSize);
}
/**
* @see DbPro#batchUpdate(List, int)
*/
public static int[] batchUpdate(List<? extends Model> modelList, int batchSize) {
return MAIN.batchUpdate(modelList, batchSize);
}
/**
* @see DbPro#batchUpdate(String, String, List, int)
*/
public static int[] batchUpdate(String tableName, String primaryKey, List<? extends Record> recordList, int batchSize) {
return MAIN.batchUpdate(tableName, primaryKey, recordList, batchSize);
}
/**
* @see DbPro#batchUpdate(String, List, int)
*/
public static int[] batchUpdate(String tableName, List<? extends Record> recordList, int batchSize) {
return MAIN.batchUpdate(tableName, recordList, batchSize);
}
public static String getSql(String key) {
return MAIN.getSql(key);
}
// 支持传入变量用于 sql 生成。为了避免用户将参数拼接在 sql 中引起 sql 注入风险,只在 SqlKit 中开放该功能
// public static String getSql(String key, Map data) {
// return MAIN.getSql(key, data);
// }
public static SqlPara getSqlPara(String key, Record record) {
return MAIN.getSqlPara(key, record);
}
public static SqlPara getSqlPara(String key, Model model) {
return MAIN.getSqlPara(key, model);
}
public static SqlPara getSqlPara(String key, Map data) {
return MAIN.getSqlPara(key, data);
}
public static SqlPara getSqlPara(String key, Object... paras) {
return MAIN.getSqlPara(key, paras);
}
public static SqlPara getSqlParaByString(String content, Map data) {
return MAIN.getSqlParaByString(content, data);
}
public static SqlPara getSqlParaByString(String content, Object... paras) {
return MAIN.getSqlParaByString(content, paras);
}
public static List<Record> find(SqlPara sqlPara) {
return MAIN.find(sqlPara);
}
public static Record findFirst(SqlPara sqlPara) {
return MAIN.findFirst(sqlPara);
}
public static int update(SqlPara sqlPara) {
return MAIN.update(sqlPara);
}
public static Page<Record> paginate(int pageNumber, int pageSize, SqlPara sqlPara) {
return MAIN.paginate(pageNumber, pageSize, sqlPara);
}
public static Page<Record> paginate(int pageNumber, int pageSize, boolean isGroupBySql, SqlPara sqlPara) {
return MAIN.paginate(pageNumber, pageSize, isGroupBySql, sqlPara);
}
// ---------
/**
* Record
* <pre>
*
* Db.each(record -> {
* // 处理 record 的代码在此
*
* // 返回 true 继续循环处理下一条数据,返回 false 立即终止循环
* return true;
* }, sql, paras);
* </pre>
*/
public static void each(Function<Record, Boolean> func, String sql, Object... paras) {
MAIN.each(func, sql, paras);
}
// ---------
/**
* 使 sql Db.getSqlPara(...)
*
* <pre>
*
* Db.template("blog.find", Kv.of("id", 123).find();
* </pre>
*/
public static DbTemplate template(String key, Map data) {
return MAIN.template(key, data);
}
/**
* 使 sql Db.getSqlPara(...)
*
* <pre>
*
* Db.template("blog.find", 123).find();
* </pre>
*/
public static DbTemplate template(String key, Object... paras) {
return MAIN.template(key, paras);
}
// ---------
/**
* 使 sql sql 使
* sql
*
* <pre>
*
* String sql = "select * from blog where id = #para(id)";
* Db.templateByString(sql, Kv.of("id", 123).find();
* </pre>
*/
public static DbTemplate templateByString(String content, Map data) {
return MAIN.templateByString(content, data);
}
/**
* 使 sql sql 使
* sql
*
* <pre>
*
* String sql = "select * from blog where id = #para(0)";
* Db.templateByString(sql, 123).find();
* </pre>
*/
public static DbTemplate templateByString(String content, Object... paras) {
return MAIN.templateByString(content, paras);
}
// ---------
/**
*
*
* <pre>
*
* 1 transaction rollback
* Db.transaction( tx -> {
* tx.rollback(); // 手动回滚事务
* });
*
* 2 TransactionRollbackDecision
* public class Ret implements TransactionRollbackDecision {
* int code;
* public boolean shouldRollback() {
* return code != 200;
* }
* // ... 其它代码省略
* }
*
* Db.transaction( tx -> {
* return new Ret().code(500);
* });
*
* </pre>
*/
public static <R> R transaction(TransactionAtom<R> atom) {
return MAIN.transaction(atom);
}
/**
*
*
* transaction(TransactionAtom<R> atom)
*/
public static <R> R transaction(int transactionLevel, TransactionAtom<R> atom) {
return MAIN.transaction(transactionLevel, atom);
}
}

@ -12,64 +12,22 @@
<version>1.0</version>
<dependencies>
<!-- JFinal框架 -->
<dependency>
<groupId>com.jfinal</groupId>
<artifactId>jfinal</artifactId>
<version>${jfinal.version}</version>
</dependency>
<dependency>
<groupId>com.jfinal</groupId>
<artifactId>jfinal-undertow</artifactId>
<version>${jfinal-undertow.version}</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.jfinal</groupId>
<artifactId>cos</artifactId>
<version>${jfinal-cos.version}</version>
</dependency>
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>4.4.0</version>
<version>${java-jwt.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.rocketmq/rocketmq-client -->
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-client</artifactId>
<version>5.3.0</version>
<version>${rocketmq-client.version}</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpmime</artifactId>
<version>4.5.14</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.15.0</version>
</dependency>
<!-- 数据库相关 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid.version}</version>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>${mysql.version}</version>
<version>${httpmime.version}</version>
</dependency>
<!-- 对象存储 -->
@ -86,84 +44,6 @@
<version>${japidocs.version}</version>
</dependency>
<!-- 日志相关 -->
<!-- SLF4J API -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<!-- 日志相关 -->
<!-- SLF4J API -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<!-- Logback实现 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${logback.version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>${logback.version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-access</artifactId>
<version>${logback.version}</version>
</dependency>
<!-- JSON处理 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
<!-- 工具类库 -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>${hutool.version}</version>
</dependency>
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>${jsoup.version}</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>${commons-io.version}</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-email</artifactId>
<version>${commons-email.version}</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>${commons-lang3.version}</version>
</dependency>
<dependency>
<groupId>org.dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>${dom4j.version}</version>
</dependency>
<!-- Redis客户端 -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>${jedis.version}</version>
</dependency>
<!-- Excel处理 -->
<dependency>
<groupId>cn.idev.excel</groupId>
@ -178,31 +58,15 @@
<version>${snakeyaml.version}</version>
</dependency>
<!-- JWT认证 -->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>${jsonwebtoken.version}</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>${jsonwebtoken.version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<version>0.11.5</version>
<scope>runtime</scope>
</dependency>
<!-- Lombok -->
<!-- 临时添加lombok依赖解决编译问题 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.dsideal</groupId>
<artifactId>dsUtils</artifactId>

@ -1,12 +1,11 @@
package com.dsideal.Res;
package com.dsideal.Ai;
import com.dsideal.Config.PropKit;
import com.dsideal.Res.Index.IndexController;
import com.dsideal.Res.Interceptor.*;
import com.dsideal.Res.Plugin.RocketMQPlugin;
import com.dsideal.Res.Plugin.YamlProp;
import com.dsideal.Res.Util.FileUtil;
import com.dsideal.Res.Util.LogBackLogFactory;
import com.dsideal.Ai.Index.IndexController;
import com.dsideal.Ai.Interceptor.*;
import com.dsideal.Ai.Plugin.RocketMQPlugin;
import com.dsideal.Ai.Util.FileUtil;
import com.dsideal.Ai.Util.LogBackLogFactory;
import com.jfinal.config.*;
import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
import com.jfinal.plugin.activerecord.dialect.MysqlDialect;

@ -1,4 +1,4 @@
package com.dsideal.Res.Index;
package com.dsideal.Ai.Index;
import com.jfinal.core.Controller;

@ -1,7 +1,7 @@
package com.dsideal.Res.Interceptor;
package com.dsideal.Ai.Interceptor;
import com.dsideal.Res.Util.CommonUtil;
import com.dsideal.Res.Util.RetKit;
import com.dsideal.Ai.Util.CommonUtil;
import com.dsideal.Ai.Util.RetKit;
import com.jfinal.aop.Interceptor;
import com.jfinal.aop.Invocation;
import com.jfinal.core.Controller;

@ -1,4 +1,4 @@
package com.dsideal.Res.Interceptor;
package com.dsideal.Ai.Interceptor;
import java.lang.annotation.*;

@ -1,6 +1,6 @@
package com.dsideal.Res.Interceptor;
package com.dsideal.Ai.Interceptor;
import com.dsideal.Res.Util.RetKit;
import com.dsideal.Ai.Util.RetKit;
import com.jfinal.aop.Interceptor;
import com.jfinal.aop.Invocation;
import com.jfinal.core.Controller;

@ -1,4 +1,4 @@
package com.dsideal.Res.Interceptor;
package com.dsideal.Ai.Interceptor;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;

@ -1,6 +1,6 @@
package com.dsideal.Res.Interceptor;
package com.dsideal.Ai.Interceptor;
import com.dsideal.Res.Util.RetKit;
import com.dsideal.Ai.Util.RetKit;
import com.jfinal.aop.Interceptor;
import com.jfinal.aop.Invocation;
import com.jfinal.core.Controller;

@ -1,4 +1,4 @@
package com.dsideal.Res.Interceptor;
package com.dsideal.Ai.Interceptor;
import java.lang.annotation.*;

@ -1,7 +1,7 @@
package com.dsideal.Res.Interceptor;
package com.dsideal.Ai.Interceptor;
import com.dsideal.Res.Util.CommonUtil;
import com.dsideal.Res.Util.RetKit;
import com.dsideal.Ai.Util.CommonUtil;
import com.dsideal.Ai.Util.RetKit;
import com.jfinal.aop.Interceptor;
import com.jfinal.aop.Invocation;
import com.jfinal.core.Controller;

@ -1,4 +1,4 @@
package com.dsideal.Res.Interceptor;
package com.dsideal.Ai.Interceptor;
import java.lang.annotation.*;

@ -1,6 +1,6 @@
package com.dsideal.Res.Interceptor;
package com.dsideal.Ai.Interceptor;
import com.dsideal.Res.Util.RetKit;
import com.dsideal.Ai.Util.RetKit;
import com.jfinal.aop.Interceptor;
import com.jfinal.aop.Invocation;
import com.jfinal.core.Controller;

@ -1,4 +1,4 @@
package com.dsideal.Res.Interceptor;
package com.dsideal.Ai.Interceptor;
import java.lang.annotation.*;

@ -1,6 +1,6 @@
package com.dsideal.Res.Interceptor;
package com.dsideal.Ai.Interceptor;
import com.dsideal.Res.Util.RetKit;
import com.dsideal.Ai.Util.RetKit;
import com.jfinal.aop.Interceptor;
import com.jfinal.aop.Invocation;
import com.jfinal.core.Controller;

@ -1,4 +1,4 @@
package com.dsideal.Res.Interceptor;
package com.dsideal.Ai.Interceptor;
import java.lang.annotation.*;

@ -1,9 +1,9 @@
package com.dsideal.Res;
package com.dsideal.Ai;
import cn.hutool.core.io.FileUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.dsideal.Res.Plugin.PostmanDocPlugin;
import com.dsideal.Ai.Plugin.PostmanDocPlugin;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.jfinal.aop.Before;

@ -1,4 +1,4 @@
package com.dsideal.Res.Plugin;
package com.dsideal.Ai.Plugin;
import freemarker.template.Template;
import freemarker.template.TemplateException;

@ -1,6 +1,6 @@
package com.dsideal.Res.Plugin;
package com.dsideal.Ai.Plugin;
import com.dsideal.Res.Util.RocketMqKit;
import com.dsideal.Ai.Util.RocketMqKit;
import com.jfinal.plugin.IPlugin;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@ -1,4 +1,4 @@
package com.dsideal.gw.Plugin;
package com.dsideal.Ai.Plugin;
import com.jfinal.kit.Prop;
import org.yaml.snakeyaml.Yaml;

@ -1,11 +1,10 @@
package com.dsideal.Res.Test;
package com.dsideal.Ai.Test;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSONArray;
import com.jfinal.kit.PathKit;
import org.apache.commons.codec.digest.DigestUtils;

@ -1,4 +1,4 @@
package com.dsideal.Res.Test;
package com.dsideal.Ai.Test;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddressList;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

@ -1,8 +1,8 @@
package com.dsideal.Res.Util.AiPpt;
package com.dsideal.Ai.Util.AiPpt;
import com.alibaba.fastjson.JSONObject;
import com.dsideal.Res.Util.AiPpt.Kit.ApiKit;
import com.dsideal.Res.Util.AiPpt.Kit.HttpUtils;
import com.dsideal.Ai.Util.AiPpt.Kit.ApiKit;
import com.dsideal.Ai.Util.AiPpt.Kit.HttpUtils;
import javax.swing.filechooser.FileSystemView;
import java.io.File;

@ -1,8 +1,8 @@
package com.dsideal.Res.Util.AiPpt;
package com.dsideal.Ai.Util.AiPpt;
import com.alibaba.fastjson.JSONObject;
import com.dsideal.Res.Util.AiPpt.Kit.ApiKit;
import com.dsideal.Res.Util.AiPpt.Kit.HttpUtils;
import com.dsideal.Ai.Util.AiPpt.Kit.ApiKit;
import com.dsideal.Ai.Util.AiPpt.Kit.HttpUtils;
import javax.swing.filechooser.FileSystemView;
import java.io.File;

@ -1,8 +1,8 @@
package com.dsideal.Res.Util.AiPpt;
package com.dsideal.Ai.Util.AiPpt;
import com.alibaba.fastjson.JSONObject;
import com.dsideal.Res.Util.AiPpt.Kit.ApiKit;
import com.dsideal.Res.Util.AiPpt.Kit.HttpUtils;
import com.dsideal.Ai.Util.AiPpt.Kit.ApiKit;
import com.dsideal.Ai.Util.AiPpt.Kit.HttpUtils;
import javax.swing.filechooser.FileSystemView;
import java.io.File;

@ -1,8 +1,8 @@
package com.dsideal.Res.Util.AiPpt;
package com.dsideal.Ai.Util.AiPpt;
import com.alibaba.fastjson.JSONObject;
import com.dsideal.Res.Util.AiPpt.Kit.ApiKit;
import com.dsideal.Res.Util.AiPpt.Kit.HttpUtils;
import com.dsideal.Ai.Util.AiPpt.Kit.ApiKit;
import com.dsideal.Ai.Util.AiPpt.Kit.HttpUtils;
import javax.swing.filechooser.FileSystemView;
import java.io.File;

@ -1,4 +1,4 @@
package com.dsideal.Res.Util.AiPpt.Kit;
package com.dsideal.Ai.Util.AiPpt.Kit;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

@ -1,4 +1,4 @@
package com.dsideal.Res.Util.AiPpt.Kit;
package com.dsideal.Ai.Util.AiPpt.Kit;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;

@ -1,4 +1,4 @@
package com.dsideal.Res.Util;
package com.dsideal.Ai.Util;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@ -1,4 +1,4 @@
package com.dsideal.Res.Util;
package com.dsideal.Ai.Util;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;

@ -1,9 +1,9 @@
package com.dsideal.Res.Util.DashScope;
package com.dsideal.Ai.Util.DashScope;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.dsideal.Res.Util.DashScope.Kit.DashScopeCommon;
import com.dsideal.Ai.Util.DashScope.Kit.DashScopeCommon;
import lombok.SneakyThrows;
import okhttp3.*;
import org.slf4j.Logger;

@ -1,8 +1,8 @@
package com.dsideal.Res.Util.DashScope;
package com.dsideal.Ai.Util.DashScope;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.dsideal.Res.Util.DashScope.Kit.DashScopeCommon;
import com.dsideal.Ai.Util.DashScope.Kit.DashScopeCommon;
import lombok.SneakyThrows;
import okhttp3.*;
import org.slf4j.Logger;

@ -1,4 +1,4 @@
package com.dsideal.Res.Util.DashScope.Kit;
package com.dsideal.Ai.Util.DashScope.Kit;
public class DashScopeCommon {
protected static final String API_KEY= "sk-01d13a39e09844038322108ecdbd1bbc";

@ -1,4 +1,4 @@
package com.dsideal.Res.Util.DashScope.Kit;
package com.dsideal.Ai.Util.DashScope.Kit;
/**
*

@ -1,9 +1,9 @@
package com.dsideal.Res.Util.DashScope;
package com.dsideal.Ai.Util.DashScope;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.dsideal.Res.Util.DashScope.Kit.DashScopeCommon;
import com.dsideal.Res.Util.DashScope.Kit.VideoStyleEnum;
import com.dsideal.Ai.Util.DashScope.Kit.DashScopeCommon;
import com.dsideal.Ai.Util.DashScope.Kit.VideoStyleEnum;
import lombok.SneakyThrows;
import okhttp3.*;
import org.slf4j.Logger;

@ -1,4 +1,4 @@
package com.dsideal.Res.Util;
package com.dsideal.Ai.Util;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

@ -1,4 +1,4 @@
package com.dsideal.Res.Util;
package com.dsideal.Ai.Util;
import java.io.File;
import java.io.FileInputStream;

@ -1,4 +1,4 @@
package com.dsideal.Res.Util;
package com.dsideal.Ai.Util;
import com.alibaba.fastjson.JSONObject;
import java.io.*;

@ -1,4 +1,4 @@
package com.dsideal.Res.Util;
package com.dsideal.Ai.Util;
import com.dsideal.Config.GatewayConfig;
import okhttp3.*;

@ -1,4 +1,4 @@
package com.dsideal.Res.Util.HuoShanFangZhou.Kit;
package com.dsideal.Ai.Util.HuoShanFangZhou.Kit;
public class HuoShanCommon {
//火山方舟大模型

@ -1,8 +1,8 @@
package com.dsideal.Res.Util.HuoShanFangZhou;
package com.dsideal.Ai.Util.HuoShanFangZhou;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.dsideal.Res.Util.HuoShanFangZhou.Kit.HuoShanCommon;
import com.dsideal.Ai.Util.HuoShanFangZhou.Kit.HuoShanCommon;
import okhttp3.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@ -1,4 +1,4 @@
package com.dsideal.Res.Util;
package com.dsideal.Ai.Util;
import com.alibaba.fastjson.JSONObject;

@ -1,4 +1,4 @@
package com.dsideal.Res.Util;
package com.dsideal.Ai.Util;
import java.util.Calendar;
import java.util.Collection;

@ -1,4 +1,4 @@
package com.dsideal.Res.Util;
package com.dsideal.Ai.Util;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
@ -40,7 +40,7 @@ public class IpUtil
for (int i = 0; i < 4; ++i) {
ipNums.add(Long.valueOf(Long.parseLong(ipArray[i].trim())));
}
long ZhongIPNumTotal = ((Long) ipNums.get(0)).longValue() * 256L * 256L * 256L
long ZhongIPNumTotal = ((Long) ipNums.getFirst()).longValue() * 256L * 256L * 256L
+ ((Long) ipNums.get(1)).longValue() * 256L * 256L + ((Long) ipNums.get(2)).longValue() * 256L
+ ((Long) ipNums.get(3)).longValue();

@ -1,10 +1,10 @@
package com.dsideal.Res.Util.JiMeng;
package com.dsideal.Ai.Util.JiMeng;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.dsideal.Res.Util.JiMeng.Kit.JmCommon;
import com.dsideal.Res.Util.JiMeng.Kit.JmErrorCode;
import com.dsideal.Ai.Util.JiMeng.Kit.JmCommon;
import com.dsideal.Ai.Util.JiMeng.Kit.JmErrorCode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@ -1,9 +1,9 @@
package com.dsideal.Res.Util.JiMeng;
package com.dsideal.Ai.Util.JiMeng;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.dsideal.Res.Util.JiMeng.Kit.JmCommon;
import com.dsideal.Res.Util.JiMeng.Kit.JmErrorCode;
import com.dsideal.Ai.Util.JiMeng.Kit.JmCommon;
import com.dsideal.Ai.Util.JiMeng.Kit.JmErrorCode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -61,8 +61,14 @@ public class JmTxt2Img extends JmCommon {
//String prompt = "过曝强对比夜晚雪地里巨大的黄色浴缸小狗泡澡带墨镜在喝红酒胶片摄影毛刺质感复古滤镜夜晚过度曝光古早70年代摄影复古老照片闪光灯拍摄闪光灯效果过曝过度曝光闪光灯过曝极简高饱和复古色70s vintage photography, vintage, retro style";
//String prompt="南瓜羹->画面展现一碗百合南瓜羹的一半,米黄色的糯米粉勾芡,块块橙色南瓜在橙色粥中,南瓜丝丝沙沙质感,紫白色百合点缀";
//String prompt="一张海报,画面上方有手写涂鸦风格的文字写着:新年快乐";
String prompt="工笔画风格,三维古风,东方禅意,航拍高角度视角,捕捉了海底极小人物的奔跑追逐;构图大面积留白和丰富的光影,背景以水墨晕染展现水中阳光的多彩折射,现实与虚拟相结合的思考,水墨风格,蓝绿色调,逆光和辉光效果增强冷暖对比,高角度拍摄景深感,整体画面高清,画质通透,发光呈现幽静空灵感";
//String prompt="工笔画风格,三维古风,东方禅意,航拍高角度视角,捕捉了海底极小人物的奔跑追逐;构图大面积留白和丰富的光影,背景以水墨晕染展现水中阳光的多彩折射,现实与虚拟相结合的思考,水墨风格,蓝绿色调,逆光和辉光效果增强冷暖对比,高角度拍摄景深感,整体画面高清,画质通透,发光呈现幽静空灵感";
String prompt="鸿门宴,室内场景图。非真人,是一幅画。远景镜头,让人一看就知道是在讲鸿门宴," +
"1、要亮" +
"2、不要有人出现" +
"3、有大厅、墙面桌子,不要有台阶,否则项庄没机会刺杀刘邦" +
"4、西周时期特点" +
"5、宏大雄伟,颜色鲜明,不要灰色调的,不要有雾霾之类的"+
"6、超高清画质";
// 获取项目根目录路径
String saveImagePath = basePath + "Text2Img.jpg";
log.info("保存图片路径:{}", saveImagePath);

@ -1,9 +1,9 @@
package com.dsideal.Res.Util.JiMeng;
package com.dsideal.Ai.Util.JiMeng;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.dsideal.Res.Util.JiMeng.Kit.JmCommon;
import com.dsideal.Res.Util.JiMeng.Kit.JmErrorCode;
import com.dsideal.Ai.Util.JiMeng.Kit.JmCommon;
import com.dsideal.Ai.Util.JiMeng.Kit.JmErrorCode;
import com.jfinal.kit.StrKit;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@ -1,4 +1,4 @@
package com.dsideal.Res.Util.JiMeng.Kit;
package com.dsideal.Ai.Util.JiMeng.Kit;
import cn.hutool.http.Method;
import com.alibaba.fastjson.JSON;

@ -1,4 +1,4 @@
package com.dsideal.Res.Util.JiMeng.Kit;
package com.dsideal.Ai.Util.JiMeng.Kit;
import lombok.Getter;

@ -1,7 +1,6 @@
package com.dsideal.Res.Util;
package com.dsideal.Ai.Util;
import com.dsideal.Config.PropKit;
import com.dsideal.Res.ResApplication;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
@ -52,12 +51,13 @@ public class JwtUtil {
}
Claims claims;
try {
claims = Jwts.parserBuilder()
.setSigningKey(key)
claims = Jwts.parser()
.verifyWith(key)
.build()
.parseClaimsJws(token)
.getBody();
.parseSignedClaims(token)
.getPayload();
} catch (Exception e) {
System.out.println(e.toString());
claims = null;
}
return claims;

@ -1,4 +1,4 @@
package com.dsideal.Res.Util.KeLing.Kit;
package com.dsideal.Ai.Util.KeLing.Kit;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;

@ -1,4 +1,4 @@
package com.dsideal.Res.Util.KeLing.Kit;
package com.dsideal.Ai.Util.KeLing.Kit;
import lombok.Getter;

@ -1,12 +1,12 @@
package com.dsideal.Res.Util.KeLing;
package com.dsideal.Ai.Util.KeLing;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.dsideal.Res.Util.KeLing.Kit.KlCommon;
import com.dsideal.Res.Util.KeLing.Kit.KlErrorCode;
import com.dsideal.Ai.Util.KeLing.Kit.KlCommon;
import com.dsideal.Ai.Util.KeLing.Kit.KlErrorCode;
import lombok.Getter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@ -1,12 +1,12 @@
package com.dsideal.Res.Util.KeLing;
package com.dsideal.Ai.Util.KeLing;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.dsideal.Res.Util.KeLing.Kit.KlCommon;
import com.dsideal.Res.Util.KeLing.Kit.KlErrorCode;
import com.dsideal.Ai.Util.KeLing.Kit.KlCommon;
import com.dsideal.Ai.Util.KeLing.Kit.KlErrorCode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@ -1,12 +1,12 @@
package com.dsideal.Res.Util.KeLing;
package com.dsideal.Ai.Util.KeLing;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.dsideal.Res.Util.KeLing.Kit.KlCommon;
import com.dsideal.Res.Util.KeLing.Kit.KlErrorCode;
import com.dsideal.Ai.Util.KeLing.Kit.KlCommon;
import com.dsideal.Ai.Util.KeLing.Kit.KlErrorCode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@ -1,12 +1,12 @@
package com.dsideal.Res.Util.KeLing;
package com.dsideal.Ai.Util.KeLing;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.dsideal.Res.Util.KeLing.Kit.KlCommon;
import com.dsideal.Res.Util.KeLing.Kit.KlErrorCode;
import com.dsideal.Ai.Util.KeLing.Kit.KlCommon;
import com.dsideal.Ai.Util.KeLing.Kit.KlErrorCode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@ -1,4 +1,4 @@
package com.dsideal.Res.Util.Liblib.Enum;
package com.dsideal.Ai.Util.Liblib.Enum;
import lombok.Getter;

@ -1,4 +1,4 @@
package com.dsideal.Res.Util.Liblib.Enum;
package com.dsideal.Ai.Util.Liblib.Enum;
import lombok.Getter;

@ -1,4 +1,4 @@
package com.dsideal.Res.Util.Liblib.Kit;
package com.dsideal.Ai.Util.Liblib.Kit;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;

@ -1,9 +1,9 @@
package com.dsideal.Res.Util.Liblib;
package com.dsideal.Ai.Util.Liblib;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.dsideal.Res.Util.Liblib.Kit.LibLibCommon;
import com.dsideal.Ai.Util.Liblib.Kit.LibLibCommon;
import okhttp3.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@ -1,9 +1,9 @@
package com.dsideal.Res.Util.Liblib;
package com.dsideal.Ai.Util.Liblib;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.dsideal.Res.Util.Liblib.Kit.LibLibCommon;
import com.dsideal.Ai.Util.Liblib.Kit.LibLibCommon;
import okhttp3.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@ -1,8 +1,8 @@
package com.dsideal.Res.Util.Liblib;
package com.dsideal.Ai.Util.Liblib;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.dsideal.Res.Util.Liblib.Kit.LibLibCommon;
import com.dsideal.Ai.Util.Liblib.Kit.LibLibCommon;
import okhttp3.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@ -1,9 +1,9 @@
package com.dsideal.Res.Util.Liblib;
package com.dsideal.Ai.Util.Liblib;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.dsideal.Res.Util.Liblib.Enum.UltraTemplate;
import com.dsideal.Res.Util.Liblib.Kit.LibLibCommon;
import com.dsideal.Ai.Util.Liblib.Enum.UltraTemplate;
import com.dsideal.Ai.Util.Liblib.Kit.LibLibCommon;
import okhttp3.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@ -1,8 +1,8 @@
package com.dsideal.Res.Util.Liblib;
package com.dsideal.Ai.Util.Liblib;
import com.alibaba.fastjson.JSONObject;
import com.dsideal.Res.Util.Liblib.Enum.UltraTemplate;
import com.dsideal.Res.Util.Liblib.Kit.LibLibCommon;
import com.dsideal.Ai.Util.Liblib.Enum.UltraTemplate;
import com.dsideal.Ai.Util.Liblib.Kit.LibLibCommon;
import okhttp3.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@ -1,4 +1,4 @@
package com.dsideal.Res.Util;
package com.dsideal.Ai.Util;
import com.jfinal.log.Log;
import org.slf4j.Logger;

@ -1,4 +1,4 @@
package com.dsideal.Res.Util;
package com.dsideal.Ai.Util;
import com.jfinal.log.ILogFactory;
import com.jfinal.log.Log;

@ -1,4 +1,4 @@
package com.dsideal.Res.Util.Midjourney.Kit;
package com.dsideal.Ai.Util.Midjourney.Kit;
import cn.hutool.core.io.FileUtil;
import cn.hutool.http.HttpUtil;

@ -1,6 +1,6 @@
package com.dsideal.Res.Util.Midjourney;
package com.dsideal.Ai.Util.Midjourney;
import com.dsideal.Res.Util.Midjourney.Kit.MjCommon;
import com.dsideal.Ai.Util.Midjourney.Kit.MjCommon;
import lombok.SneakyThrows;
import okhttp3.*;
import com.alibaba.fastjson.JSON;

@ -1,4 +1,4 @@
package com.dsideal.Res.Util;
package com.dsideal.Ai.Util;
import java.security.SecureRandom;
import java.util.ArrayList;

@ -1,4 +1,4 @@
package com.dsideal.Res.Util;
package com.dsideal.Ai.Util;
import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.Record;

@ -1,4 +1,4 @@
package com.dsideal.Res.Util;
package com.dsideal.Ai.Util;
import java.util.HashMap;
import java.util.Map;

@ -1,4 +1,4 @@
package com.dsideal.Res.Util;
package com.dsideal.Ai.Util;
import com.jfinal.plugin.redis.Redis;
import redis.clients.jedis.Pipeline;

@ -1,4 +1,4 @@
package com.dsideal.Res.Util;
package com.dsideal.Ai.Util;
import com.jfinal.kit.StrKit;
import com.jfinal.plugin.activerecord.Page;

@ -1,7 +1,6 @@
package com.dsideal.Res.Util;
package com.dsideal.Ai.Util;
import com.dsideal.Config.PropKit;
import com.dsideal.Res.AiApplication;
import org.apache.rocketmq.client.consumer.DefaultLitePullConsumer;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendCallback;

@ -1,4 +1,4 @@
package com.dsideal.Res.Util;
package com.dsideal.Ai.Util;
import cn.hutool.core.codec.Base64;

@ -1,4 +1,4 @@
package com.dsideal.Res.Util.Suno;
package com.dsideal.Ai.Util.Suno;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;

@ -1,4 +1,4 @@
package com.dsideal.Res.Util;
package com.dsideal.Ai.Util;
public class TelNumGenerator {

@ -1,47 +0,0 @@
package com.dsideal.Res.Plugin;
import com.jfinal.kit.Prop;
import org.yaml.snakeyaml.Yaml;
import java.io.InputStream;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Properties;
public class YamlProp extends Prop {
public YamlProp(String yamlFile) {
setYaml(yamlFile);
}
private void setYaml(String yamlFile) {
LinkedHashMap map = null;
Properties properties = new Properties();
InputStream in;
try {
Yaml yaml = new Yaml();
in = YamlProp.class.getClassLoader().getResourceAsStream(yamlFile);
map = yaml.loadAs(in, LinkedHashMap.class);
} catch (Exception e) {
e.printStackTrace();
}
setProperties(properties, map, "");
this.properties = properties;
}
private static void setProperties(Properties properties, Map map, String prefix) {
for (Object key : map.keySet()) {
Object value = map.get(key);
if (key == null) {
continue;
}
if (value instanceof Map) {
setProperties(properties, (Map) value, prefix + key + ".");
} else {
if (value == null) {
continue;
}
properties.setProperty(prefix + key, value.toString());
}
}
}
}

@ -1,47 +1,83 @@
com\dsideal\resource\Interceptor\CheckIdsInterceptor.class
com\dsideal\resource\Util\SSHUtil.class
com\dsideal\resource\Plugin\YamlProp.class
com\dsideal\resource\Util\RetKit.class
com\dsideal\resource\Interceptor\LengthInterface.class
com\dsideal\resource\Test\testDb.class
com\dsideal\resource\Util\IdCardGenerator.class
com\dsideal\resource\Interceptor\IsSysAdminInterceptor.class
com\dsideal\resource\Util\TelNumGenerator.class
com\dsideal\resource\Base\Model\BaseModel.class
com\dsideal\resource\JApiDocsGenerator.class
com\dsideal\resource\Util\LogBackLogFactory.class
com\dsideal\resource\Util\ExcelCommonUtil$1.class
com\dsideal\resource\Interceptor\JwtCheckInterface.class
com\dsideal\resource\Interceptor\IsGuidInterceptor.class
com\dsideal\resource\Base\Controller\BaseController.class
com\dsideal\resource\Plugin\PostmanDocPlugin.class
com\dsideal\resource\Util\FileSizeUtil.class
com\dsideal\resource\Util\ExcelCommonUtil.class
com\dsideal\resource\Interceptor\EmptyInterface.class
com\dsideal\resource\Interceptor\IsSysAdminInterface.class
com\dsideal\resource\Interceptor\JwtCheckInterceptor.class
com\dsideal\resource\Interceptor\LengthInterceptor.class
com\dsideal\resource\Interceptor\EmptyInterceptor.class
com\dsideal\resource\Interceptor\IsNumericInterface.class
com\dsideal\resource\Util\RedisKit.class
com\dsideal\resource\Interceptor\CheckIdsInterface.class
com\dsideal\resource\Util\IpUtil.class
com\dsideal\resource\Util\LogBackLog.class
com\dsideal\resource\Util\ExcelExportUtil.class
com\dsideal\resource\Util\PassWordUtil.class
com\dsideal\resource\Util\CookieUtil.class
com\dsideal\resource\Interceptor\IsGuidInterface.class
com\dsideal\resource\Util\MinioUtils.class
com\dsideal\resource\Util\RsaUtils.class
com\dsideal\resource\Util\SsoUtil.class
com\dsideal\resource\Util\JwtUtil.class
com\dsideal\resource\Index\IndexController.class
com\dsideal\resource\Util\CommonUtil.class
com\dsideal\resource\Util\PkUtil.class
com\dsideal\resource\Util\ClickHouseUtil.class
com\jfinal\plugin\activerecord\Db.class
com\dsideal\resource\Util\IDCardUtil.class
com\dsideal\resource\ResApplication.class
com\dsideal\resource\Interceptor\IsNumbericInterceptor.class
com\dsideal\resource\Util\FileUtil.class
com\dsideal\resource\Util\RandomGeneratorUtil.class
com\dsideal\Res\Util\AiPpt\AiPptDemo2.class
com\dsideal\Res\Util\RsaUtils.class
com\dsideal\Res\Util\FileSizeUtil.class
com\dsideal\Res\Interceptor\IsSysAdminInterceptor.class
com\dsideal\Res\Util\RetKit.class
com\dsideal\Res\Util\RocketMqKit$1.class
com\dsideal\Res\Util\IpUtil.class
com\dsideal\Res\Util\FileUtil.class
com\dsideal\Res\Util\Midjourney\Kit\MjCommon.class
com\dsideal\Res\Util\Liblib\Enum\SamplingMethod.class
com\dsideal\Res\Util\KeLing\Kit\KlCommon.class
com\dsideal\Res\Util\LogBackLog.class
com\dsideal\Res\Util\KeLing\Kit\KlErrorCode.class
com\dsideal\Res\Plugin\YamlProp.class
com\dsideal\Res\Interceptor\IsGuidInterface.class
com\dsideal\Res\Util\HttpClient.class
com\dsideal\Res\Util\KeLing\KlImg2Video.class
com\dsideal\Res\Util\Liblib\Enum\UltraTemplate.class
com\dsideal\Res\Util\AiPpt\Kit\HttpUtils$HttpResponse.class
com\dsideal\Res\Util\CookieUtil.class
com\dsideal\Res\Interceptor\IsNumbericInterceptor.class
com\dsideal\Res\Interceptor\IsSysAdminInterface.class
com\dsideal\Res\Interceptor\LengthInterface.class
com\dsideal\Res\Plugin\RocketMQPlugin.class
com\dsideal\Res\Util\JiMeng\JmTxt2Img.class
com\dsideal\Res\Util\JiMeng\JmImg2Video.class
com\dsideal\Res\Util\LogBackLogFactory.class
com\dsideal\Res\Util\Liblib\LibImg2Img.class
com\dsideal\Res\Util\Liblib\Kit\LibLibCommon.class
com\dsideal\Res\Util\DashScope\ImgSpeak.class
com\dsideal\Res\Test\CallDeepSeek.class
com\dsideal\Res\Util\KeLing\KlAccount.class
com\dsideal\Res\Test\MetadataTemplateGenerator.class
com\dsideal\Res\Util\AiPpt\Kit\HttpUtils.class
com\dsideal\Res\Util\Liblib\Kit\LibLibCommon$SignatureInfo.class
com\dsideal\Res\Test\CallDeepSeek$SSEListener.class
com\dsideal\Res\Util\RandomGeneratorUtil.class
com\dsideal\Res\Util\DashScope\VideoStyleTransform.class
com\dsideal\Res\Util\DashScope\ImgSong.class
com\dsideal\Res\Util\ExcelExportUtil.class
com\dsideal\Res\Util\AiPpt\Kit\HttpUtils$HttpRequest.class
com\dsideal\Res\Interceptor\CheckIdsInterceptor.class
com\dsideal\Res\Util\AiPpt\AiPptDemo4.class
com\dsideal\Res\Util\Liblib\LibTxt2Img.class
com\dsideal\Res\Util\JwtUtil.class
com\dsideal\Res\Util\PassWordUtil.class
com\dsideal\Res\Util\Suno\SunoMusicGenerator.class
com\dsideal\Res\Test\CallDeepSeek$1.class
com\dsideal\Res\Interceptor\CheckIdsInterface.class
com\dsideal\Res\Util\JiMeng\Kit\JmCommon.class
com\dsideal\Res\Util\Midjourney\Txt2Img.class
com\dsideal\Res\Util\AiPpt\AiPptDemo3.class
com\dsideal\Res\Util\RocketMqKit.class
com\dsideal\Res\Util\JiMeng\JmTxt2Video.class
com\dsideal\Res\Util\CommonUtil.class
com\dsideal\Res\Util\AiPpt\Kit\ApiKit.class
com\dsideal\Res\Interceptor\IsGuidInterceptor.class
com\dsideal\Res\Util\DashScope\Kit\VideoStyleEnum.class
com\dsideal\Res\Util\AiPpt\AiPptDemo1.class
com\dsideal\Res\Util\KeLing\KlAccount$ResourcePackInfo.class
com\dsideal\Res\Util\AiPpt\Kit\HttpUtils$1.class
com\dsideal\Res\Util\PkUtil.class
com\dsideal\Res\Util\KeLing\KlTxt2Img.class
com\dsideal\Res\Util\Liblib\UltraTxt2Img.class
com\dsideal\Res\AiApplication.class
com\dsideal\Res\Util\DashScope\Kit\DashScopeCommon.class
com\dsideal\Res\Util\JiMeng\Kit\JmErrorCode.class
com\dsideal\Res\Util\HuoShanFangZhou\Kit\HuoShanCommon.class
com\dsideal\Res\Util\IdCardGenerator.class
com\dsideal\Res\Util\Liblib\QueryModelVersion.class
com\dsideal\Res\Util\RedisKit.class
com\dsideal\Res\Util\KeLing\KlTxt2Video.class
com\dsideal\Res\JApiDocsGenerator.class
com\dsideal\Res\Index\IndexController.class
com\dsideal\Res\Interceptor\LengthInterceptor.class
com\dsideal\Res\Util\TelNumGenerator.class
com\dsideal\Res\Interceptor\EmptyInterceptor.class
com\dsideal\Res\Util\IDCardUtil.class
com\dsideal\Res\Interceptor\IsNumericInterface.class
com\dsideal\Res\Util\HuoShanFangZhou\Txt2Img.class
com\dsideal\Res\Plugin\PostmanDocPlugin.class
com\dsideal\Res\Util\Liblib\UltraImg2Img.class
com\dsideal\Res\Interceptor\EmptyInterface.class

@ -1,46 +1,75 @@
D:\dsWork\dsProject\dsRes\src\main\java\com\dsideal\resource\Util\TelNumGenerator.java
D:\dsWork\dsProject\dsRes\src\main\java\com\dsideal\resource\Interceptor\CheckIdsInterceptor.java
D:\dsWork\dsProject\dsRes\src\main\java\com\dsideal\resource\Interceptor\IsNumbericInterceptor.java
D:\dsWork\dsProject\dsRes\src\main\java\com\dsideal\resource\Util\ClickHouseUtil.java
D:\dsWork\dsProject\dsRes\src\main\java\com\dsideal\resource\Interceptor\CheckIdsInterface.java
D:\dsWork\dsProject\dsRes\src\main\java\com\dsideal\resource\Util\IDCardUtil.java
D:\dsWork\dsProject\dsRes\src\main\java\com\dsideal\resource\Util\RsaUtils.java
D:\dsWork\dsProject\dsRes\src\main\java\com\dsideal\resource\Util\FileSizeUtil.java
D:\dsWork\dsProject\dsRes\src\main\java\com\dsideal\resource\Test\testDb.java
D:\dsWork\dsProject\dsRes\src\main\java\com\dsideal\resource\Util\IpUtil.java
D:\dsWork\dsProject\dsRes\src\main\java\com\dsideal\resource\Util\CommonUtil.java
D:\dsWork\dsProject\dsRes\src\main\java\com\dsideal\resource\Interceptor\EmptyInterceptor.java
D:\dsWork\dsProject\dsRes\src\main\java\com\dsideal\resource\JApiDocsGenerator.java
D:\dsWork\dsProject\dsRes\src\main\java\com\dsideal\resource\Util\JwtUtil.java
D:\dsWork\dsProject\dsRes\src\main\java\com\dsideal\resource\Util\MinioUtils.java
D:\dsWork\dsProject\dsRes\src\main\java\com\jfinal\plugin\activerecord\Db.java
D:\dsWork\dsProject\dsRes\src\main\java\com\dsideal\resource\Util\IdCardGenerator.java
D:\dsWork\dsProject\dsRes\src\main\java\com\dsideal\resource\Util\PkUtil.java
D:\dsWork\dsProject\dsRes\src\main\java\com\dsideal\resource\Interceptor\JwtCheckInterceptor.java
D:\dsWork\dsProject\dsRes\src\main\java\com\dsideal\resource\Interceptor\LengthInterceptor.java
D:\dsWork\dsProject\dsRes\src\main\java\com\dsideal\resource\Interceptor\IsSysAdminInterface.java
D:\dsWork\dsProject\dsRes\src\main\java\com\dsideal\resource\Interceptor\IsGuidInterface.java
D:\dsWork\dsProject\dsRes\src\main\java\com\dsideal\resource\Util\SsoUtil.java
D:\dsWork\dsProject\dsRes\src\main\java\com\dsideal\resource\Interceptor\EmptyInterface.java
D:\dsWork\dsProject\dsRes\src\main\java\com\dsideal\resource\Base\Model\BaseModel.java
D:\dsWork\dsProject\dsRes\src\main\java\com\dsideal\resource\Util\LogBackLog.java
D:\dsWork\dsProject\dsRes\src\main\java\com\dsideal\resource\Interceptor\JwtCheckInterface.java
D:\dsWork\dsProject\dsRes\src\main\java\com\dsideal\resource\Util\CookieUtil.java
D:\dsWork\dsProject\dsRes\src\main\java\com\dsideal\resource\Base\Controller\BaseController.java
D:\dsWork\dsProject\dsRes\src\main\java\com\dsideal\resource\Plugin\PostmanDocPlugin.java
D:\dsWork\dsProject\dsRes\src\main\java\com\dsideal\resource\Util\ExcelExportUtil.java
D:\dsWork\dsProject\dsRes\src\main\java\com\dsideal\resource\Util\FileUtil.java
D:\dsWork\dsProject\dsRes\src\main\java\com\dsideal\resource\Util\RetKit.java
D:\dsWork\dsProject\dsRes\src\main\java\com\dsideal\resource\Util\PassWordUtil.java
D:\dsWork\dsProject\dsRes\src\main\java\com\dsideal\resource\Util\LogBackLogFactory.java
D:\dsWork\dsProject\dsRes\src\main\java\com\dsideal\resource\Interceptor\IsGuidInterceptor.java
D:\dsWork\dsProject\dsRes\src\main\java\com\dsideal\resource\Util\SSHUtil.java
D:\dsWork\dsProject\dsRes\src\main\java\com\dsideal\resource\ResApplication.java
D:\dsWork\dsProject\dsRes\src\main\java\com\dsideal\resource\Interceptor\LengthInterface.java
D:\dsWork\dsProject\dsRes\src\main\java\com\dsideal\resource\Plugin\YamlProp.java
D:\dsWork\dsProject\dsRes\src\main\java\com\dsideal\resource\Interceptor\IsSysAdminInterceptor.java
D:\dsWork\dsProject\dsRes\src\main\java\com\dsideal\resource\Util\RedisKit.java
D:\dsWork\dsProject\dsRes\src\main\java\com\dsideal\resource\Interceptor\IsNumericInterface.java
D:\dsWork\dsProject\dsRes\src\main\java\com\dsideal\resource\Index\IndexController.java
D:\dsWork\dsProject\dsRes\src\main\java\com\dsideal\resource\Util\ExcelCommonUtil.java
D:\dsWork\dsProject\dsRes\src\main\java\com\dsideal\resource\Util\RandomGeneratorUtil.java
D:\dsWork\dsProject\dsAi\src\main\java\com\dsideal\Res\Util\JiMeng\Kit\JmErrorCode.java
D:\dsWork\dsProject\dsAi\src\main\java\com\dsideal\Res\Util\Suno\SunoMusicGenerator.java
D:\dsWork\dsProject\dsAi\src\main\java\com\dsideal\Res\Util\RocketMqKit.java
D:\dsWork\dsProject\dsAi\src\main\java\com\dsideal\Res\Util\AiPpt\AiPptDemo4.java
D:\dsWork\dsProject\dsAi\src\main\java\com\dsideal\Res\Util\DashScope\VideoStyleTransform.java
D:\dsWork\dsProject\dsAi\src\main\java\com\dsideal\Res\Interceptor\IsSysAdminInterface.java
D:\dsWork\dsProject\dsAi\src\main\java\com\dsideal\Res\Util\LogBackLog.java
D:\dsWork\dsProject\dsAi\src\main\java\com\dsideal\Res\Util\PassWordUtil.java
D:\dsWork\dsProject\dsAi\src\main\java\com\dsideal\Res\Util\RsaUtils.java
D:\dsWork\dsProject\dsAi\src\main\java\com\dsideal\Res\Interceptor\EmptyInterceptor.java
D:\dsWork\dsProject\dsAi\src\main\java\com\dsideal\Res\Interceptor\IsNumbericInterceptor.java
D:\dsWork\dsProject\dsAi\src\main\java\com\dsideal\Res\Util\Liblib\Enum\SamplingMethod.java
D:\dsWork\dsProject\dsAi\src\main\java\com\dsideal\Res\Util\AiPpt\AiPptDemo3.java
D:\dsWork\dsProject\dsAi\src\main\java\com\dsideal\Res\Util\IpUtil.java
D:\dsWork\dsProject\dsAi\src\main\java\com\dsideal\Res\Util\Liblib\Kit\LibLibCommon.java
D:\dsWork\dsProject\dsAi\src\main\java\com\dsideal\Res\Interceptor\EmptyInterface.java
D:\dsWork\dsProject\dsAi\src\main\java\com\dsideal\Res\Util\JiMeng\JmImg2Video.java
D:\dsWork\dsProject\dsAi\src\main\java\com\dsideal\Res\Interceptor\CheckIdsInterceptor.java
D:\dsWork\dsProject\dsAi\src\main\java\com\dsideal\Res\Interceptor\IsGuidInterface.java
D:\dsWork\dsProject\dsAi\src\main\java\com\dsideal\Res\Util\Liblib\UltraImg2Img.java
D:\dsWork\dsProject\dsAi\src\main\java\com\dsideal\Res\Util\HuoShanFangZhou\Txt2Img.java
D:\dsWork\dsProject\dsAi\src\main\java\com\dsideal\Res\Plugin\RocketMQPlugin.java
D:\dsWork\dsProject\dsAi\src\main\java\com\dsideal\Res\Plugin\PostmanDocPlugin.java
D:\dsWork\dsProject\dsAi\src\main\java\com\dsideal\Res\AiApplication.java
D:\dsWork\dsProject\dsAi\src\main\java\com\dsideal\Res\Test\CallDeepSeek.java
D:\dsWork\dsProject\dsAi\src\main\java\com\dsideal\Res\Util\AiPpt\AiPptDemo2.java
D:\dsWork\dsProject\dsAi\src\main\java\com\dsideal\Res\Util\DashScope\Kit\DashScopeCommon.java
D:\dsWork\dsProject\dsAi\src\main\java\com\dsideal\Res\Util\KeLing\Kit\KlCommon.java
D:\dsWork\dsProject\dsAi\src\main\java\com\dsideal\Res\Util\KeLing\KlAccount.java
D:\dsWork\dsProject\dsAi\src\main\java\com\dsideal\Res\Interceptor\IsSysAdminInterceptor.java
D:\dsWork\dsProject\dsAi\src\main\java\com\dsideal\Res\Util\DashScope\Kit\VideoStyleEnum.java
D:\dsWork\dsProject\dsAi\src\main\java\com\dsideal\Res\Util\HttpClient.java
D:\dsWork\dsProject\dsAi\src\main\java\com\dsideal\Res\Util\IdCardGenerator.java
D:\dsWork\dsProject\dsAi\src\main\java\com\dsideal\Res\Util\CommonUtil.java
D:\dsWork\dsProject\dsAi\src\main\java\com\dsideal\Res\JApiDocsGenerator.java
D:\dsWork\dsProject\dsAi\src\main\java\com\dsideal\Res\Util\Midjourney\Kit\MjCommon.java
D:\dsWork\dsProject\dsAi\src\main\java\com\dsideal\Res\Util\KeLing\KlImg2Video.java
D:\dsWork\dsProject\dsAi\src\main\java\com\dsideal\Res\Interceptor\IsNumericInterface.java
D:\dsWork\dsProject\dsAi\src\main\java\com\dsideal\Res\Util\AiPpt\AiPptDemo1.java
D:\dsWork\dsProject\dsAi\src\main\java\com\dsideal\Res\Plugin\YamlProp.java
D:\dsWork\dsProject\dsAi\src\main\java\com\dsideal\Res\Util\JwtUtil.java
D:\dsWork\dsProject\dsAi\src\main\java\com\dsideal\Res\Interceptor\IsGuidInterceptor.java
D:\dsWork\dsProject\dsAi\src\main\java\com\dsideal\Res\Interceptor\LengthInterceptor.java
D:\dsWork\dsProject\dsAi\src\main\java\com\dsideal\Res\Util\ExcelExportUtil.java
D:\dsWork\dsProject\dsAi\src\main\java\com\dsideal\Res\Util\AiPpt\Kit\HttpUtils.java
D:\dsWork\dsProject\dsAi\src\main\java\com\dsideal\Res\Util\JiMeng\JmTxt2Img.java
D:\dsWork\dsProject\dsAi\src\main\java\com\dsideal\Res\Util\RedisKit.java
D:\dsWork\dsProject\dsAi\src\main\java\com\dsideal\Res\Util\CookieUtil.java
D:\dsWork\dsProject\dsAi\src\main\java\com\dsideal\Res\Util\PkUtil.java
D:\dsWork\dsProject\dsAi\src\main\java\com\dsideal\Res\Index\IndexController.java
D:\dsWork\dsProject\dsAi\src\main\java\com\dsideal\Res\Util\Liblib\QueryModelVersion.java
D:\dsWork\dsProject\dsAi\src\main\java\com\dsideal\Res\Test\MetadataTemplateGenerator.java
D:\dsWork\dsProject\dsAi\src\main\java\com\dsideal\Res\Util\LogBackLogFactory.java
D:\dsWork\dsProject\dsAi\src\main\java\com\dsideal\Res\Util\KeLing\KlTxt2Video.java
D:\dsWork\dsProject\dsAi\src\main\java\com\dsideal\Res\Util\Liblib\UltraTxt2Img.java
D:\dsWork\dsProject\dsAi\src\main\java\com\dsideal\Res\Util\JiMeng\Kit\JmCommon.java
D:\dsWork\dsProject\dsAi\src\main\java\com\dsideal\Res\Util\Liblib\LibImg2Img.java
D:\dsWork\dsProject\dsAi\src\main\java\com\dsideal\Res\Util\KeLing\KlTxt2Img.java
D:\dsWork\dsProject\dsAi\src\main\java\com\dsideal\Res\Util\Midjourney\Txt2Img.java
D:\dsWork\dsProject\dsAi\src\main\java\com\dsideal\Res\Util\KeLing\Kit\KlErrorCode.java
D:\dsWork\dsProject\dsAi\src\main\java\com\dsideal\Res\Util\AiPpt\Kit\ApiKit.java
D:\dsWork\dsProject\dsAi\src\main\java\com\dsideal\Res\Util\IDCardUtil.java
D:\dsWork\dsProject\dsAi\src\main\java\com\dsideal\Res\Util\Liblib\LibTxt2Img.java
D:\dsWork\dsProject\dsAi\src\main\java\com\dsideal\Res\Util\TelNumGenerator.java
D:\dsWork\dsProject\dsAi\src\main\java\com\dsideal\Res\Interceptor\CheckIdsInterface.java
D:\dsWork\dsProject\dsAi\src\main\java\com\dsideal\Res\Util\FileSizeUtil.java
D:\dsWork\dsProject\dsAi\src\main\java\com\dsideal\Res\Interceptor\LengthInterface.java
D:\dsWork\dsProject\dsAi\src\main\java\com\dsideal\Res\Util\DashScope\ImgSpeak.java
D:\dsWork\dsProject\dsAi\src\main\java\com\dsideal\Res\Util\Liblib\Enum\UltraTemplate.java
D:\dsWork\dsProject\dsAi\src\main\java\com\dsideal\Res\Util\RetKit.java
D:\dsWork\dsProject\dsAi\src\main\java\com\dsideal\Res\Util\DashScope\ImgSong.java
D:\dsWork\dsProject\dsAi\src\main\java\com\dsideal\Res\Util\HuoShanFangZhou\Kit\HuoShanCommon.java
D:\dsWork\dsProject\dsAi\src\main\java\com\dsideal\Res\Util\FileUtil.java
D:\dsWork\dsProject\dsAi\src\main\java\com\dsideal\Res\Util\RandomGeneratorUtil.java
D:\dsWork\dsProject\dsAi\src\main\java\com\dsideal\Res\Util\JiMeng\JmTxt2Video.java

@ -1,5 +1,5 @@
<!DOCTYPE html>
<html>
<html lang="zh">
<head>
<meta charset="utf-8">
@ -171,14 +171,9 @@
var loginPersonInfo = getPersonLoginInfo($);
$("#personName").html(" " + loginPersonInfo.person_name);
var globalInfo = getGlobalInfo($, Base64.encode("system_name,copy_right"));
$('title').text(globalInfo.data[0].global_value);
$("#page_title").html(globalInfo.data[0].global_value);
});
</script>
</body>

@ -1,18 +1,14 @@
<!DOCTYPE HTML>
<html>
<html lang="zh">
<head>
<meta charset="utf-8">
<meta name="renderer" content="webkit|ie-comp|ie-stand">
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<!-- <title>长春市教育装备与信息化项目智慧管理系统</title> -->
<title>长春市装备信息管理系统</title>
<meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no" />
<!-- 手机端禁止缩放 -->
<meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" name="viewport" />
<!-- <meta name="keywords" content="长春市教育装备与信息化项目智慧管理系统"> -->
<!--关键词,5个左右,单个8汉字以内-->
<!-- <meta name="description" content="长春市教育装备与信息化项目智慧管理系统"> -->
<!--网站描述-->
<!--自己的样式-->
<link href="./tbcss/public.css" rel="stylesheet" type="text/css" />
@ -20,8 +16,6 @@
<script src="./component/pear/jsencrypt.min.js"></script>
<script src="./admin/js/jquery-3.6.0.min.js"></script>
<script src="./component/pear/base64.js"></script>
<!--添加对公用函数库的引用-->
<!-- <script src="lib/common.js"></script>-->
</head>
<body>
@ -33,8 +27,6 @@
<div class="right-content clearfix">
<div class="content-name">
<p style="font-size: 20px;font-weight: bolder;margin-left: 70px;color: #6998F4;" id="system_name">长春市装备信息管理系统</p>
<!-- <p style="font-size: 20px;font-weight: bolder;margin-left: -5px;"><img src="./img/title_tk.png"></p> -->
</div>
<form action="" method="post">
<div class="user-name">
@ -58,7 +50,6 @@
alt="点击图片刷新校验码" style="cursor:pointer" onclick="javascript:refreshCaptcha()" />
</div>
</div>
<input id="loginBtn" class="input-button" type="button" value="登&nbsp;&nbsp;&nbsp;录"
style="background-color: #6998F4;">
</form>
@ -66,9 +57,7 @@
</div>
</div>
<div class="footer" id="footer">
</div>
<script>
$(function () {
$("#loginBtn").click(function () {
@ -148,9 +137,6 @@
$(".form-error").find("label").html(error);
$(".form-error").show();
}
getPageInfo();
//获取页面信息
function getPageInfo() {
@ -163,7 +149,6 @@
},
async: false,
success: function (result) {
$('title').html(result.data[0].global_value);
$("#system_name").html(result.data[0].global_value);
$("#footer").html(result.data[1].global_value);
@ -172,5 +157,4 @@
}
</script>
</body>
</html>

@ -12,161 +12,43 @@
<name>dsBase</name>
<dependencies>
<!-- JFinal框架 -->
<dependency>
<groupId>com.jfinal</groupId>
<artifactId>jfinal</artifactId>
<version>${jfinal.version}</version>
</dependency>
<dependency>
<groupId>com.jfinal</groupId>
<artifactId>jfinal-undertow</artifactId>
<version>${jfinal-undertow.version}</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.jfinal</groupId>
<artifactId>cos</artifactId>
<version>${jfinal-cos.version}</version>
</dependency>
<!-- 数据库相关 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid.version}</version>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>${mysql.version}</version>
</dependency>
<!-- 工具类库 -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>${hutool.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>${jsoup.version}</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>${commons-io.version}</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-email</artifactId>
<version>${commons-email.version}</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>${commons-lang3.version}</version>
</dependency>
<dependency>
<groupId>org.dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>${dom4j.version}</version>
</dependency>
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
<version>${snakeyaml.version}</version>
</dependency>
<!-- 静态资源处理 -->
<dependency>
<groupId>net.coobird</groupId>
<artifactId>thumbnailator</artifactId>
<version>${thumbnailator.version}</version>
</dependency>
<!-- 日志相关 -->
<!-- SLF4J API -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<!-- Logback实现 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${logback.version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>${logback.version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-access</artifactId>
<version>${logback.version}</version>
</dependency>
<!-- 其他依赖 -->
<dependency>
<groupId>io.github.yedaxia</groupId>
<artifactId>japidocs</artifactId>
<version>${japidocs.version}</version>
</dependency>
<!--jjwt-->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>${jsonwebtoken.version}</version>
</dependency>
<!-- 日志相关依赖已移至dsUtils模块统一管理 -->
<!-- 临时添加lombok依赖解决编译问题 -->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>${jsonwebtoken.version}</version>
<scope>runtime</scope>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<scope>provided</scope>
</dependency>
<!--定时任务-->
<dependency>
<groupId>it.sauronsoftware.cron4j</groupId>
<artifactId>cron4j</artifactId>
<version>${cron4j.version}</version>
</dependency>
<!--FastExcel-->
<dependency>
<groupId>cn.idev.excel</groupId>
<artifactId>fastexcel</artifactId>
<version>${fastexcel.version}</version>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>${jedis.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.dsideal</groupId>
<artifactId>dsUtils</artifactId>
<version>1.0</version>
<scope>compile</scope>
<exclusions>
<exclusion>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>

@ -95,7 +95,7 @@ public class BaseController extends Controller {
return;
}
// 构建根节点
Record record = list.get(0);
Record record = list.getFirst();
int pId = record.getInt("pId");
int id = record.getInt("id");
String name = record.getStr("name");
@ -171,7 +171,7 @@ public class BaseController extends Controller {
if (parentRercod == null || parentRercod.size() == 0) {
renderJson(CommonUtil.returnMessageJson(false, "传入的parent_id有误系统中找不到此记录"));
} else {
String parentCode = parentRercod.get(0).get("code");
String parentCode = parentRercod.getFirst().get("code");
boolean isExists = bm.checkOrgTypePrincipalshipCodeDuplicate(parentCode + code, false, "0");
if (isExists) {
renderJson(CommonUtil.returnMessageJson(false, "传入的code有误系统中已存在此记录"));
@ -200,7 +200,7 @@ public class BaseController extends Controller {
}
//检查是不是存在子节点
List<Record> rs = bm.getOrgTypePrincipalship(id, -1, null);
if (rs.size() > 0 && rs.get(0).getInt("is_leaf") > 0) {
if (rs.size() > 0 && rs.getFirst().getInt("is_leaf") > 0) {
renderJson(CommonUtil.returnMessageJson(false, "删除失败,此节点存在子节点,请先删除子节点!"));
return;
}
@ -243,7 +243,7 @@ public class BaseController extends Controller {
if (parentRercod == null || parentRercod.size() == 0) {
renderJson(CommonUtil.returnMessageJson(false, "传入的parent_id有误系统中找不到此记录"));
} else {
String parentCode = parentRercod.get(0).get("code");
String parentCode = parentRercod.getFirst().get("code");
boolean isExists = bm.checkOrgTypePrincipalshipCodeDuplicate(parentCode + code, true, id);
if (isExists) {
renderJson(CommonUtil.returnMessageJson(false, "传入的code有误系统中已存在此记录"));

@ -92,10 +92,10 @@ public class BaseModel {
if (!UpdateCheck) {
sql = Db.getSql("Base.t_base_org_type_principalship_CountByCode");
count = Db.find(sql, code).get(0).getInt("c");
count = Db.find(sql, code).getFirst().getInt("c");
} else {
sql = Db.getSql("Base.t_base_org_type_principalship_CountByCodeExceptSelf");
count = Db.find(sql, code, Integer.parseInt(id)).get(0).getInt("c");
count = Db.find(sql, code, Integer.parseInt(id)).getFirst().getInt("c");
}
if (count == 0) {
@ -202,7 +202,7 @@ public class BaseModel {
Kv kv = Kv.by("person_id", person_id);
SqlPara sp = Db.getSqlPara("Base.getCurrentPerson", kv);
List<Record> list = Db.find(sp);
return list.get(0);
return list.getFirst();
}
/**
@ -216,7 +216,7 @@ public class BaseModel {
Kv kv = Kv.by("person_id", person_id);
SqlPara sp = Db.getSqlPara("Base.getCurrentClass", kv);
List<Record> list = Db.find(sp);
return list.get(0);
return list.getFirst();
}
/**
@ -237,7 +237,7 @@ public class BaseModel {
Kv kv = Kv.by("person_id", person_id).set("ids", v_ids);
SqlPara sp = Db.getSqlPara("Base.isInDutyList", kv);
List<Record> list = Db.find(sp);
return list.get(0).getInt("c") >= 1 ? true : false;
return list.getFirst().getInt("c") >= 1 ? true : false;
}

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save