mirror of
https://github.com/jeecgboot/JeecgBoot.git
synced 2025-12-08 17:12:28 +08:00
Compare commits
236 Commits
v3.7.1
...
v3.7.3spri
| Author | SHA1 | Date | |
|---|---|---|---|
| 197d7adaaf | |||
| e952518d71 | |||
| 2ba17648c4 | |||
| 36caab37e2 | |||
| 6e721e4120 | |||
| a17b403675 | |||
| 632fd72d79 | |||
| 15fc262675 | |||
| 6768d65e1e | |||
| 410ab7bcc3 | |||
| 174f1ae432 | |||
| eef2f7e269 | |||
| 6a0ec66d3d | |||
| 163b0b531f | |||
| d1af49a33f | |||
| 03265691e6 | |||
| de9cc2f30d | |||
| 26887959cd | |||
| 7e15e81218 | |||
| 45f905ddac | |||
| 55696efcaa | |||
| 3671b81f01 | |||
| 74ad7e6f92 | |||
| 49d55a79f4 | |||
| 8395d106a2 | |||
| d716111ded | |||
| 81b4cbbe35 | |||
| 86cfc18fe8 | |||
| 98ba72ae4b | |||
| 8b0e0367c7 | |||
| 334f7dbb62 | |||
| 29248561d6 | |||
| ad74b78134 | |||
| bd716417e8 | |||
| e9ddd21286 | |||
| 1acb773adf | |||
| 5753f3d1d9 | |||
| 46fb1cce91 | |||
| d0487e7a9d | |||
| b8c096eee5 | |||
| c84f62e418 | |||
| c2107ee74a | |||
| 48a9ba6253 | |||
| 1a4abfc89c | |||
| 9550c15d56 | |||
| 229256738a | |||
| 781432c678 | |||
| a4fba72da5 | |||
| 65f90ea84a | |||
| b8ef121fe7 | |||
| d6c6a1c01f | |||
| 7257dfe5ba | |||
| 18166a3c69 | |||
| 54abb67303 | |||
| 84f46c2142 | |||
| 63d60092dc | |||
| dd9ec47cdb | |||
| 49ce9e0763 | |||
| a7089b7b16 | |||
| 53f8c0c076 | |||
| 6ad8c3d824 | |||
| 6947f47bd3 | |||
| 973804189e | |||
| 1942980154 | |||
| 64b852e1c6 | |||
| 0277a968f2 | |||
| 79ca5ebf96 | |||
| 84a7ce9b7a | |||
| ab2469ff98 | |||
| 8fc27bb261 | |||
| d9737c891f | |||
| 17dc1916aa | |||
| a00e4684b5 | |||
| a2a3ff6709 | |||
| 266f49e72f | |||
| 6be0f94ddc | |||
| 7159df8d18 | |||
| b4cd341abc | |||
| 327f034640 | |||
| 00b1250901 | |||
| 964e9b3851 | |||
| 9c5e71476f | |||
| 80a54746b1 | |||
| 9861e1a867 | |||
| 5b2ac82e94 | |||
| c5909cae34 | |||
| b0880c373b | |||
| 2b0bedd263 | |||
| 458526075e | |||
| a1b55f0d40 | |||
| ee382c0a5b | |||
| f7f6d0ff88 | |||
| 4d058e1dce | |||
| 5c9c2dbebe | |||
| 44f7075316 | |||
| c88bfcf35a | |||
| 11d13c8305 | |||
| 0582436b9c | |||
| 00252f392f | |||
| ef16814216 | |||
| a626b6a4d0 | |||
| fca5d0e54e | |||
| 1c3b9a10f1 | |||
| b0c4194602 | |||
| 64b29f47e0 | |||
| 6198a3702f | |||
| 453acb9b4e | |||
| 565753e370 | |||
| e2aaf0f978 | |||
| 32c8370ef2 | |||
| a79004b924 | |||
| eb1612f8dd | |||
| 2f0a3bcd87 | |||
| a35555619c | |||
| b3e3951064 | |||
| 44ec26574e | |||
| 55a25caafd | |||
| 62f7b0d489 | |||
| b16fdef8dc | |||
| b5b667058b | |||
| 6c0c259742 | |||
| ca56c54aa0 | |||
| 30d3a9f17b | |||
| 74297af987 | |||
| fedb6b84b9 | |||
| fdc713339e | |||
| 03739f2837 | |||
| f28a2dbbeb | |||
| b81435aaca | |||
| d9e8bd2bc8 | |||
| 81eef5a838 | |||
| f528f72903 | |||
| 918286c144 | |||
| 512234a804 | |||
| 48805484d4 | |||
| 7fecdf94e5 | |||
| a3997dfd16 | |||
| c868d90c2f | |||
| 77aebf5dd2 | |||
| e770524f3a | |||
| c5fee07cba | |||
| 9fd20fde9e | |||
| 2af9451b7f | |||
| 575baa8d49 | |||
| 48bc76cce7 | |||
| 58c0882329 | |||
| c400ec8482 | |||
| 2068bdc112 | |||
| ffe806352e | |||
| 167a6c458c | |||
| 872e6ed024 | |||
| cacc59b8fd | |||
| c744633139 | |||
| 0e4d304878 | |||
| 17a8964487 | |||
| 8ac6989d2c | |||
| 402ab0ffc4 | |||
| 7778ede90e | |||
| 06144206df | |||
| 3d3b5850ad | |||
| 816eeb9225 | |||
| 0b42efbbbf | |||
| b8e0d4391d | |||
| 72b34d082b | |||
| 7112649a21 | |||
| fbc312c35d | |||
| b8162a4a6d | |||
| 28404d2fd3 | |||
| c92c9be49a | |||
| 58e85e0569 | |||
| 6fc34d8a39 | |||
| 790df934b5 | |||
| 8aee4011a2 | |||
| 6e0277c60a | |||
| e923654161 | |||
| 06b41ae479 | |||
| 11af85d87a | |||
| 4caff75cce | |||
| 811861a957 | |||
| 24623ba4b0 | |||
| 7c68b46943 | |||
| 7c34161369 | |||
| bc52aa918d | |||
| 9dfdd47b36 | |||
| 272a7540eb | |||
| ad796f079f | |||
| e7e7716d05 | |||
| c5d620d2b2 | |||
| cdea05ebb0 | |||
| ca9a433f3c | |||
| 2be6052cd4 | |||
| 68ed67ee49 | |||
| d5903ba52a | |||
| 3ee635eddf | |||
| 21bc68fb53 | |||
| f532e57862 | |||
| da08adbea1 | |||
| 46e3e62b59 | |||
| 3656264f8a | |||
| 3361d48cd4 | |||
| ed86ea3da1 | |||
| 3deb0e5487 | |||
| 9e4792941e | |||
| b5fd5fe782 | |||
| 33c0104a02 | |||
| 81ed5100af | |||
| 87f9dc0064 | |||
| b311fedc6b | |||
| e321a0405f | |||
| d8bc74794d | |||
| 732f05dc74 | |||
| 6ce92798c6 | |||
| f4454e9348 | |||
| d9134ae0c8 | |||
| 25180e41c8 | |||
| a99e3f2268 | |||
| d27c354bf1 | |||
| d818b1dd9d | |||
| bcdbec0091 | |||
| 098bb12b9e | |||
| 4a6c750b19 | |||
| d396e5304a | |||
| 9bed25be8c | |||
| 7109b42092 | |||
| 1667b14194 | |||
| e9514873d2 | |||
| 0ee090664e | |||
| 4a9eda4ab0 | |||
| 2416c8b251 | |||
| 5b056f9dd6 | |||
| a93998dc56 | |||
| 268c27a782 | |||
| 23ace2712a | |||
| 157feeb925 | |||
| 4e25d4162f | |||
| 47a68f31e1 |
1
.gitattributes
vendored
1
.gitattributes
vendored
@ -3,3 +3,4 @@
|
|||||||
*.ts linguist-language=vue
|
*.ts linguist-language=vue
|
||||||
*.html linguist-language=vue
|
*.html linguist-language=vue
|
||||||
*.sql linguist-language=Java
|
*.sql linguist-language=Java
|
||||||
|
*.ftl linguist-language=Java
|
||||||
25
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
25
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
---
|
||||||
|
name: 提交 Bug
|
||||||
|
about: 请告诉我框架存在的问题,我会协助你解决此问题!
|
||||||
|
labels: bug
|
||||||
|
assignees: getActivity
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
##### 版本号:
|
||||||
|
|
||||||
|
|
||||||
|
##### 问题描述:
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
##### 错误截图:
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#### 友情提示:
|
||||||
|
- 未按格式要求发帖、描述过于简单的,会被直接删掉;
|
||||||
|
- 描述问题请图文并茂,方便我们理解并快速定位问题;
|
||||||
|
- 如果使用的不是master,请说明你使用的分支;
|
||||||
@ -1,3 +1,12 @@
|
|||||||
|
---
|
||||||
|
name: 提交建议
|
||||||
|
about: 请告诉我框架的不足之处,让我做得更好!
|
||||||
|
labels: help wanted
|
||||||
|
assignees: getActivity
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
##### 版本号:
|
##### 版本号:
|
||||||
|
|
||||||
|
|
||||||
10
LICENSE
10
LICENSE
@ -201,3 +201,13 @@
|
|||||||
limitations under the License.
|
limitations under the License.
|
||||||
|
|
||||||
In any case, you must not make any such use of this software as to develop software which may be considered competitive with this software.
|
In any case, you must not make any such use of this software as to develop software which may be considered competitive with this software.
|
||||||
|
|
||||||
|
JeecgBoot 是由 北京国炬信息技术有限公司 发行的软件。 总部位于北京,地址:中国·北京·朝阳区科荟前街1号院奥林佳泰大厦。邮箱:jeecgos@163.com
|
||||||
|
本软件受适用的国家软件著作权法(包括国际条约)和开源协议 双重保护许可。
|
||||||
|
|
||||||
|
开源协议中文释意如下:
|
||||||
|
1.JeecgBoot开源版本无任何限制,在遵循本开源协议条款下,允许商用使用,不会造成侵权行为。
|
||||||
|
2.允许基于本平台软件开展业务系统开发。
|
||||||
|
3.在任何情况下,您不得使用本软件开发可能被认为与本软件竞争的软件。
|
||||||
|
|
||||||
|
最终解释权归:http://www.jeecg.com
|
||||||
40
README-EN.md
40
README-EN.md
@ -4,15 +4,15 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
JEECG BOOT Low Code Development Platform
|
JEECG BOOT AI Low Code Platform
|
||||||
===============
|
===============
|
||||||
|
|
||||||
Current version: 3.7.1 (Release date: 2024-09-12)
|
Current version: 3.7.3 (Release date: 2025-02-10)
|
||||||
|
|
||||||
|
|
||||||
[](https://github.com/zhangdaiscott/jeecg-boot/blob/master/LICENSE)
|
[](https://github.com/zhangdaiscott/jeecg-boot/blob/master/LICENSE)
|
||||||
[](http://www.jeecg.com)
|
[](http://www.jeecg.com)
|
||||||
[](https://github.com/zhangdaiscott/jeecg-boot)
|
[](https://github.com/zhangdaiscott/jeecg-boot)
|
||||||
[](https://github.com/zhangdaiscott/jeecg-boot)
|
[](https://github.com/zhangdaiscott/jeecg-boot)
|
||||||
[](https://github.com/zhangdaiscott/jeecg-boot)
|
[](https://github.com/zhangdaiscott/jeecg-boot)
|
||||||
|
|
||||||
@ -21,9 +21,9 @@ Current version: 3.7.1 (Release date: 2024-09-12)
|
|||||||
Project introduction
|
Project introduction
|
||||||
-----------------------------------
|
-----------------------------------
|
||||||
|
|
||||||
<h3 align="center">Java Low Code Platform for Enterprise web applications</h3>
|
<h3 align="center">Java AI Low Code Platform for Enterprise web applications</h3>
|
||||||
|
|
||||||
JeecgBoot is a `low code development platform` based on code `generators`! Front and back end separation architecture SpringBoot2.x, SpringCloud, Ant Design&Vue, Mybatis plus, Shiro, JWT, support for microservices. The powerful code generator makes the front and back end of the code generation, low code development! JeecgBoot leads a new low-code development paradigm (OnlineCoding-> Code Generator -> Manual MERGE) that helps resolve 70% of the duplication in Java projects and makes development more business-focused. Not only can quickly improve efficiency, save research and development costs, but also do not lose flexibility!
|
JeecgBoot is a `AI low code platform` based on code `generators`! Front and back end separation architecture SpringBoot2.x, SpringCloud, Ant Design&Vue, Mybatis plus, Shiro, JWT, support for microservices. The powerful code generator makes the front and back end of the code generation, low code development! JeecgBoot leads a new low-code development paradigm (OnlineCoding-> Code Generator -> Manual MERGE) that helps resolve 70% of the duplication in Java projects and makes development more business-focused. Not only can quickly improve efficiency, save research and development costs, but also do not lose flexibility!
|
||||||
|
|
||||||
JeecgBoot provides a series of low code modules to make Online development truly zero code: Online form development, online reports, report configuration capabilities, online chart design, large screen design, mobile configuration capabilities, form designer, online design flow, process automation configuration, plug-in capabilities (pluggable) and more!
|
JeecgBoot provides a series of low code modules to make Online development truly zero code: Online form development, online reports, report configuration capabilities, online chart design, large screen design, mobile configuration capabilities, form designer, online design flow, process automation configuration, plug-in capabilities (pluggable) and more!
|
||||||
|
|
||||||
@ -32,6 +32,7 @@ The purpose of JEECG is: simple functions are implemented by OnlineCoding config
|
|||||||
|
|
||||||
JEECG Business process: Using workflow to implement and extend the task interface for developing and writing business logic, forms provides a variety of solutions: form designer, online configuration form, and coding form. At the same time, the separation design of process and form (loose coupling) is realized, and the flexible configuration of task nodes is supported, which not only ensures the confidentiality of the company's process, but also reduces the workload of developers.
|
JEECG Business process: Using workflow to implement and extend the task interface for developing and writing business logic, forms provides a variety of solutions: form designer, online configuration form, and coding form. At the same time, the separation design of process and form (loose coupling) is realized, and the flexible configuration of task nodes is supported, which not only ensures the confidentiality of the company's process, but also reduces the workload of developers.
|
||||||
|
|
||||||
|
AI Empowering Low-Code: Currently, JeecgBoot supports AI large models such as ChatGPT and DeepSeek. The latest version defaults to using DeepSeek, which offers faster speed and higher quality. It now provides features such as AI chat assistant, AI table creation, and AI report generation.
|
||||||
|
|
||||||
Technical support
|
Technical support
|
||||||
-----------------------------------
|
-----------------------------------
|
||||||
@ -57,7 +58,7 @@ Download other source code
|
|||||||
|
|
||||||
For the project
|
For the project
|
||||||
-----------------------------------
|
-----------------------------------
|
||||||
Jeecg-Boot low code development platform can be applied in the development of any J2EE project, especially for SAAS projects, enterprise information management system (MIS), internal office system (OA), enterprise resource planning system (ERP), customer relationship management system (CRM), etc. Its semi-intelligent manual Merge development method, Can significantly improve the development efficiency of more than 70%, greatly reduce the development cost.
|
Jeecg-Boot AI low code platform can be applied in the development of any J2EE project, especially for SAAS projects, enterprise information management system (MIS), internal office system (OA), enterprise resource planning system (ERP), customer relationship management system (CRM), etc. Its semi-intelligent manual Merge development method, Can significantly improve the development efficiency of more than 70%, greatly reduce the development cost.
|
||||||
|
|
||||||
|
|
||||||
Starts the project
|
Starts the project
|
||||||
@ -72,10 +73,11 @@ Technical documentation
|
|||||||
-----------------------------------
|
-----------------------------------
|
||||||
|
|
||||||
- Website: [http://www.jeecg.com](http://www.jeecg.com)
|
- Website: [http://www.jeecg.com](http://www.jeecg.com)
|
||||||
- Doc: [http://help.jeecg.com](http://help.jeecg.com)
|
|
||||||
- Newbie guide: [Quick start](http://www.jeecg.com/doc/quickstart) | [Q&A ](http://www.jeecg.com/doc/qa) | [1 minute experience](https://my.oschina.net/jeecg/blog/3083313)
|
|
||||||
- QQ group : ⑨808791225、⑧825232878、⑦791696430、⑥730954414(full)、683903138(full)、⑤860162132(full)、④774126647(full)、③816531124(full)、②769925425(full)、①284271917(full)
|
|
||||||
- Demo : [OnlineDemo](http://boot3.jeecg.com) | [APP](http://jeecg.com/appIndex)
|
- Demo : [OnlineDemo](http://boot3.jeecg.com) | [APP](http://jeecg.com/appIndex)
|
||||||
|
- Doc: [DocumentCenter](http://help.jeecg.com) | [AI Config](https://help.jeecg.com/java/ai/aichat.html)
|
||||||
|
- Newbie guide: [Quick start](http://www.jeecg.com/doc/quickstart) | [Q&A ](http://www.jeecg.com/doc/qa) | [1 minute experience](https://my.oschina.net/jeecg/blog/3083313)
|
||||||
|
- QQ group : ⑩716488839、⑨808791225、⑧825232878、⑦791696430、⑥730954414(full)、683903138(full)、⑤860162132(full)、④774126647(full)、③816531124(full)、②769925425(full)、①284271917(full)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -195,7 +197,7 @@ Technical Architecture:
|
|||||||
|
|
||||||
- Persistence layer framework: MybatisPlus 3.5.3.2
|
- Persistence layer framework: MybatisPlus 3.5.3.2
|
||||||
|
|
||||||
- Report tool: JimuReport 1.7.6
|
- Report tool: JimuReport 1.9.3
|
||||||
|
|
||||||
- Security framework: Apache Shiro 1.12.0, Jwt 3.11.0
|
- Security framework: Apache Shiro 1.12.0, Jwt 3.11.0
|
||||||
|
|
||||||
@ -212,6 +214,14 @@ Technical Architecture:
|
|||||||
|
|
||||||
- TechnologyStack:`Vue3.0+TypeScript+Vite+AntDesignVue+pinia+echarts`
|
- TechnologyStack:`Vue3.0+TypeScript+Vite+AntDesignVue+pinia+echarts`
|
||||||
|
|
||||||
|
#### Front-end environment requirements
|
||||||
|
|
||||||
|
* `Node.js 、npm 、pnpm`
|
||||||
|
* pnpm `v9+` is now required.
|
||||||
|
* Node.js Version suggestion: `v20.15.0`
|
||||||
|
` ( Since Vite6 Node.js 18/20 + is now required )`
|
||||||
|
|
||||||
|
|
||||||
#### Support library
|
#### Support library
|
||||||
|
|
||||||
| database | support |
|
| database | support |
|
||||||
@ -223,8 +233,18 @@ Technical Architecture:
|
|||||||
| MariaDB | √ |
|
| MariaDB | √ |
|
||||||
| 达梦 | √ |
|
| 达梦 | √ |
|
||||||
| 人大金仓 | √ |
|
| 人大金仓 | √ |
|
||||||
|
| TiDB | √ |
|
||||||
|
|
||||||
|
|
||||||
|
#### AI Support
|
||||||
|
|
||||||
|
| AI Model | Supported |
|
||||||
|
| --- | --- |
|
||||||
|
| DeepSeek | √ |
|
||||||
|
| ChatGPT | √ |
|
||||||
|
|
||||||
|
AI Config: https://help.jeecg.com/java/ai/aichat.html
|
||||||
|
|
||||||
## Microservice solutions
|
## Microservice solutions
|
||||||
|
|
||||||
- 1. Service registration and discovery Nacos √
|
- 1. Service registration and discovery Nacos √
|
||||||
|
|||||||
112
README.md
112
README.md
@ -1,13 +1,13 @@
|
|||||||
|
|
||||||
JeecgBoot 低代码开发平台
|
JeecgBoot AI低代码平台
|
||||||
===============
|
===============
|
||||||
|
|
||||||
当前最新版本: 3.7.1(发布日期:2024-09-12)
|
当前最新版本: 3.7.3(发布日期:2025-02-10)
|
||||||
|
|
||||||
|
|
||||||
[](https://github.com/jeecgboot/JeecgBoot/blob/master/LICENSE)
|
[](https://github.com/jeecgboot/JeecgBoot/blob/master/LICENSE)
|
||||||
[](http://guojusoft.com)
|
[](http://guojusoft.com)
|
||||||
[](https://github.com/jeecgboot/JeecgBoot)
|
[](https://github.com/jeecgboot/JeecgBoot)
|
||||||
[](https://github.com/jeecgboot/JeecgBoot)
|
[](https://github.com/jeecgboot/JeecgBoot)
|
||||||
[](https://github.com/jeecgboot/JeecgBoot)
|
[](https://github.com/jeecgboot/JeecgBoot)
|
||||||
|
|
||||||
@ -16,42 +16,52 @@ JeecgBoot 低代码开发平台
|
|||||||
项目介绍
|
项目介绍
|
||||||
-----------------------------------
|
-----------------------------------
|
||||||
|
|
||||||
<h3 align="center">Java Low Code Platform for Enterprise web applications</h3>
|
<h3 align="center">Java AI Low Code Platform for Enterprise web applications</h3>
|
||||||
|
|
||||||
JeecgBoot 是一款基于代码生成器的`低代码开发平台`!前后端分离架构 SpringBoot2.x和3.x,SpringCloud,Ant Design Vue3,Mybatis-plus,Shiro,JWT,支持微服务。强大的代码生成器让前后端代码一键生成,实现低代码开发! JeecgBoot 引领新的低代码开发模式(OnlineCoding-> 代码生成器-> 手工MERGE), 帮助解决Java项目70%的重复工作,让开发更多关注业务。既能快速提高效率,节省研发成本,同时又不失灵活性!
|
JeecgBoot 是一款基于`BPM`和`代码生成器`的 AI低代码平台!前后端分离架构 SpringBoot2.x/3.x,SpringCloud,Ant Design Vue3,Mybatis-plus,Shiro,JWT,支持微服务、多租户;支持 AI 大模型 DeepSeek 和 ChatGPT、Ollama本地模型; 强大的代码生成器让前后端代码一键生成,无需写任何代码! JeecgBoot 引领 AI 低代码开发模式(AI生成-> OnlineCoding-> 代码生成器-> 手工MERGE), 帮助解决Java项目80%的重复工作,让开发更多关注业务。既能快速提高效率,节省成本,同时又不失灵活性!AIGC能力:AI对话助手、AI建表、AI写文章、AI流程编排、AI知识库问答等等.
|
||||||
|
|
||||||
JeecgBoot 提供了一系列`低代码模块`,实现在线开发`真正的零代码`:Online表单开发、Online报表、报表配置能力、在线图表设计、仪表盘设计、大屏设计、移动配置能力、表单设计器、在线设计流程、流程自动化配置、插件能力(可插拔)等等!
|
JeecgBoot 提供了一系列 `AI能力` `低代码模块`,实现在线开发`真正的零代码`:Online表单开发、Online报表、报表配置能力、在线图表设计、仪表盘设计、大屏设计、移动配置能力、表单设计器、在线设计流程、流程自动化配置、插件能力(可插拔)、AI对话助手,AI建表、AI写文章、AI流程编排、AI知识库问答、AI赋能低代码等等!
|
||||||
|
|
||||||
|
|
||||||
`JEECG宗旨是:` 简单功能由OnlineCoding配置实现,做到`零代码开发`;复杂功能由代码生成器生成进行手工Merge 实现`低代码开发`,既保证了`智能`又兼顾`灵活`;实现了低代码开发的同时又支持灵活编码,解决了当前低代码产品普遍不灵活的弊端!
|
`JEECG宗旨是:` 简单功能由OnlineCoding配置实现,做到`零代码开发`;复杂功能由代码生成器生成进行手工Merge 实现`低代码开发`,既保证了`智能`又兼顾`灵活`;实现了低代码开发的同时又支持灵活编码,解决了当前低代码产品普遍不灵活的弊端!
|
||||||
|
|
||||||
`JEECG业务流程:` 采用工作流来实现、扩展出任务接口,供开发编写业务逻辑,表单提供多种解决方案: 表单设计器、online配置表单、编码表单。同时实现了流程与表单的分离设计(松耦合)、并支持任务节点灵活配置,既保证了公司流程的保密性,又减少了开发人员的工作量。
|
`JEECG业务流程:` 采用工作流来实现、扩展出任务接口,供开发编写业务逻辑,表单提供多种解决方案: 表单设计器、online配置表单、编码表单。同时实现了流程与表单的分离设计(松耦合)、并支持任务节点灵活配置,既保证了公司流程的保密性,又减少了开发人员的工作量。
|
||||||
|
|
||||||
|
`AI赋能低代码:` 目前JeecgBoot支持AI大模型`ChatGPT`和`DeepSeek`,现在最新版默认使用`DeepSeek`,速度更快质量更高。目前提供了AI对话助手、AI建表、AI报表、AI写文章、AI流程编排、AI知识库问答等功能。
|
||||||
|
|
||||||
|
|
||||||
适用项目
|
适用项目
|
||||||
-----------------------------------
|
-----------------------------------
|
||||||
Jeecg-Boot低代码开发平台,可以应用在任何J2EE项目的开发中,支持信创国产化(默认适配达梦和人大金仓)。尤其适合SAAS项目、企业信息管理系统(MIS)、内部办公系统(OA)、企业资源计划系统(ERP)、客户关系管理系统(CRM)等,其半智能手工Merge的开发方式,可以显著提高开发效率70%以上,极大降低开发成本。
|
JeecgBoot AI低代码平台,可以应用在任何J2EE项目的开发中,支持信创国产化(默认适配达梦和人大金仓)。尤其适合SAAS项目、企业信息管理系统(MIS)、内部办公系统(OA)、企业资源计划系统(ERP)、客户关系管理系统(CRM)等,其半智能手工Merge的开发方式,可以显著提高开发效率70%以上,极大降低开发成本。
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### 视频介绍
|
||||||
|
|
||||||
|
[](https://www.bilibili.com/video/BV1Nk4y1o7Qc)
|
||||||
|
|
||||||
|
|
||||||
#### 项目说明
|
#### 项目说明
|
||||||
|
|
||||||
| 项目名 | 说明 |
|
| 项目名 | 说明 |
|
||||||
|--------------------|------------------------|
|
|--------------------|------------------------|
|
||||||
| `jeecg-boot` | 后端源码JAVA(SpringBoot微服务架构) |
|
| `jeecg-boot` | 后端源码JAVA(SpringBoot微服务架构) |
|
||||||
| `jeecgboot-vue3` | 前端源码VUE3(vue3+vite5+ts最新技术栈) |
|
| `jeecgboot-vue3` | 前端源码VUE3(vue3+vite6+ts最新技术栈) |
|
||||||
| `jeecg-uniapp` | [配套APP框架](https://github.com/jeecgboot/jeecg-uniapp) 适配多个终端,支持APP、小程序、H5 |
|
| `jeecg-uniapp` | [配套APP框架](https://github.com/jeecgboot/jeecg-uniapp) 适配多个终端,支持APP、小程序、H5 |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
技术文档
|
技术文档
|
||||||
-----------------------------------
|
-----------------------------------
|
||||||
|
|
||||||
- 官方网站: [http://www.jeecg.com](http://www.jeecg.com)
|
- 官方网站: [http://www.jeecg.com](http://www.jeecg.com)
|
||||||
- 开发文档: [https://help.jeecg.com](https://help.jeecg.com)
|
- 在线演示 : [在线演示](http://boot3.jeecg.com) | [APP演示](http://jeecg.com/appIndex)
|
||||||
|
- 快速体验: [一分钟体验低代码](https://jeecg.blog.csdn.net/article/details/106079007?spm=1001.2014.3001.5502 "一分钟体验零代码") | [在线体验零代码](https://app.qiaoqiaoyun.com/myapps/index "在线体验零代码")
|
||||||
|
- 开发文档: [文档中心](https://help.jeecg.com) | [AI集成配置(支持DeepSeek)](https://help.jeecg.com/java/ai/aichat.html)
|
||||||
- 反馈问题: [在Github上提Issues](https://github.com/jeecgboot/JeecgBoot/issues/new)
|
- 反馈问题: [在Github上提Issues](https://github.com/jeecgboot/JeecgBoot/issues/new)
|
||||||
- 新手指南: [快速入门](http://www.jeecg.com/doc/quickstart) | [入门视频](http://jeecg.com/doc/video)
|
- 新手指南: [快速入门](http://www.jeecg.com/doc/quickstart) | [入门视频](http://jeecg.com/doc/video)
|
||||||
- QQ交流群 : ⑨808791225、其他(满)
|
- QQ交流群 : ⑩716488839、⑨808791225(满)、其他(满)
|
||||||
- 在线演示 : [在线演示](http://boot3.jeecg.com) | [APP演示](http://jeecg.com/appIndex)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -62,6 +72,24 @@ Jeecg-Boot低代码开发平台,可以应用在任何J2EE项目的开发中,
|
|||||||
- [Docker一键启动前后端](https://help.jeecg.com/java/docker/quick.html)
|
- [Docker一键启动前后端](https://help.jeecg.com/java/docker/quick.html)
|
||||||
|
|
||||||
|
|
||||||
|
AIGC功能清单
|
||||||
|
-----------------------------------
|
||||||
|
|
||||||
|
- AI对聊天助手
|
||||||
|
- AI建表(Online表单)
|
||||||
|
- AI写文章(CMS)
|
||||||
|
- AI表单建议(表单设计器)
|
||||||
|
- AI流程编排(研发中)
|
||||||
|
- AI知识库问答系统(研发中)
|
||||||
|
- AI应用开发平台(研发中)
|
||||||
|
- AI聊天窗口支持嵌入第三方(研发中)
|
||||||
|
|
||||||
|
|
||||||
|
<b>关注公众号了解官方动态</b>
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
技术架构:
|
技术架构:
|
||||||
-----------------------------------
|
-----------------------------------
|
||||||
|
|
||||||
@ -73,10 +101,11 @@ Jeecg-Boot低代码开发平台,可以应用在任何J2EE项目的开发中,
|
|||||||
- 基础框架:Spring Boot 2.7.18
|
- 基础框架:Spring Boot 2.7.18
|
||||||
- 微服务框架: Spring Cloud Alibaba 2021.0.1.0
|
- 微服务框架: Spring Cloud Alibaba 2021.0.1.0
|
||||||
- 持久层框架:MybatisPlus 3.5.3.2
|
- 持久层框架:MybatisPlus 3.5.3.2
|
||||||
- 报表工具: JimuReport 1.7.6
|
- 报表工具: JimuReport 1.9.3
|
||||||
- 安全框架:Apache Shiro 1.12.0,Jwt 3.11.0
|
- 安全框架:Apache Shiro 1.12.0,Jwt 3.11.0
|
||||||
- 微服务技术栈:Spring Cloud Alibaba、Nacos、Gateway、Sentinel、Skywalking
|
- 微服务技术栈:Spring Cloud Alibaba、Nacos、Gateway、Sentinel、Skywalking
|
||||||
- 数据库连接池:阿里巴巴Druid 1.1.22
|
- 数据库连接池:阿里巴巴Druid 1.1.22
|
||||||
|
- AI大模型:支持 `ChatGPT` `DeepSeek`切换
|
||||||
- 日志打印:logback
|
- 日志打印:logback
|
||||||
- 缓存:Redis
|
- 缓存:Redis
|
||||||
- 其他:autopoi, fastjson,poi,Swagger-ui,quartz, lombok(简化代码)等。
|
- 其他:autopoi, fastjson,poi,Swagger-ui,quartz, lombok(简化代码)等。
|
||||||
@ -87,11 +116,19 @@ Jeecg-Boot低代码开发平台,可以应用在任何J2EE项目的开发中,
|
|||||||
#### 前端
|
#### 前端
|
||||||
|
|
||||||
- 前端IDE建议:WebStorm、Vscode
|
- 前端IDE建议:WebStorm、Vscode
|
||||||
- 采用 Vue3.0+TypeScript+Vite+Ant-Design-Vue等新技术方案,包括二次封装组件、utils、hooks、动态菜单、权限校验、按钮级别权限控制等功能
|
- 采用 Vue3.0+TypeScript+Vite6+Ant-Design-Vue等新技术方案,包括二次封装组件、utils、hooks、动态菜单、权限校验、按钮级别权限控制等功能
|
||||||
- 最新技术栈:Vue3.0 + TypeScript + Vite5 + ant-design-vue4 + pinia + echarts + unocss + vxe-table + qiankun + es6
|
- 最新技术栈:Vue3.0 + TypeScript + Vite6 + ant-design-vue4 + pinia + echarts + unocss + vxe-table + qiankun + es6
|
||||||
- 依赖管理:node、npm、pnpm
|
- 依赖管理:node、npm、pnpm
|
||||||
|
|
||||||
|
|
||||||
|
#### 前端环境要求
|
||||||
|
|
||||||
|
* 本地环境安装 `Node.js 、npm 、pnpm`
|
||||||
|
* pnpm 要求`9+` 版本以上
|
||||||
|
* Node.js 版本建议`v20.15.0`,要求`Node 20+` 版本以上
|
||||||
|
|
||||||
|
` ( 因为Vite6 需要 Node.js 18 / 20+ )`
|
||||||
|
|
||||||
|
|
||||||
#### 支持库
|
#### 支持库
|
||||||
|
|
||||||
@ -102,9 +139,20 @@ Jeecg-Boot低代码开发平台,可以应用在任何J2EE项目的开发中,
|
|||||||
| Sqlserver2017 | √ |
|
| Sqlserver2017 | √ |
|
||||||
| PostgreSQL | √ |
|
| PostgreSQL | √ |
|
||||||
| MariaDB | √ |
|
| MariaDB | √ |
|
||||||
|
| MariaDB | √ |
|
||||||
| 达梦 | √ |
|
| 达梦 | √ |
|
||||||
| 人大金仓 | √ |
|
| 人大金仓 | √ |
|
||||||
|
| TiDB | √ |
|
||||||
|
|
||||||
|
#### 支持AI大模型
|
||||||
|
|
||||||
|
| AI大模型 | 支持 |
|
||||||
|
| --- | --- |
|
||||||
|
| DeepSeek | √ |
|
||||||
|
| ChatGTP | √ |
|
||||||
|
| Ollama本地搭建大模型 | √ |
|
||||||
|
|
||||||
|
AI集成文档: https://help.jeecg.com/java/ai/aichat.html
|
||||||
|
|
||||||
|
|
||||||
## 微服务解决方案
|
## 微服务解决方案
|
||||||
@ -143,12 +191,12 @@ Jeecg-Boot低代码开发平台,可以应用在任何J2EE项目的开发中,
|
|||||||
-----------------------------------
|
-----------------------------------
|
||||||
* 1.采用最新主流前后分离框架(Springboot+Mybatis+antd+vue3),容易上手; 代码生成器依赖性低,灵活的扩展能力,可快速实现二次开发;
|
* 1.采用最新主流前后分离框架(Springboot+Mybatis+antd+vue3),容易上手; 代码生成器依赖性低,灵活的扩展能力,可快速实现二次开发;
|
||||||
* 2.支持微服务SpringCloud Alibaba(Nacos、Gateway、Sentinel、Skywalking),提供切换机制支持单体和微服务自由切换
|
* 2.支持微服务SpringCloud Alibaba(Nacos、Gateway、Sentinel、Skywalking),提供切换机制支持单体和微服务自由切换
|
||||||
* 3.开发效率高,采用代码生成器,单表、树列表、一对多、一对一等数据模型,增删改查功能一键生成,菜单配置直接使用;
|
* 3.开发效率高,采用代码生成器,单表、树列表、一对多、一对一等数据模型,增删改查功能一键生成,菜单配置直接使用;引入AI能力,支持自动建表等功能;
|
||||||
* 4.代码生成器提供强大模板机制,支持自定义模板,目前提供四套风格模板(单表两套、树模型一套、一对多三套)
|
* 4.代码生成器提供强大模板机制,支持自定义模板,目前提供四套风格模板(单表两套、树模型一套、一对多三套)
|
||||||
* 5.代码生成器非常智能,在线业务建模、在线配置、所见即所得支持23种类控件,一键生成前后端代码,大幅度提升开发效率,不再为重复工作发愁。
|
* 5.代码生成器非常智能,在线业务建模、在线配置、所见即所得支持23种类控件,一键生成前后端代码,大幅度提升开发效率,不再为重复工作发愁。
|
||||||
|
* 6.AI能力:目前JeecgBoot支持AI大模型chatgpt和deepseek,现在最新版默认使用deepseek,速度更快质量更高。目前提供了AI对话助手、AI建表、AI报表等功能。
|
||||||
* 6.低代码能力:Online在线表单(无需编码,通过在线配置表单,实现表单的增删改查,支持单表、树、一对多、一对一等模型,实现人人皆可编码)
|
* 6.低代码能力:Online在线表单(无需编码,通过在线配置表单,实现表单的增删改查,支持单表、树、一对多、一对一等模型,实现人人皆可编码)
|
||||||
* 7.低代码能力:Online在线报表(无需编码,通过在线配置方式,实现数据报表,可以快速抽取数据,减轻开发压力,实现人人皆可编码)
|
* 7.低代码能力:Online在线报表、Online在线图表(无需编码,通过在线配置方式,实现数据报表和图形报表,可以快速抽取数据,减轻开发压力,实现人人皆可编码)
|
||||||
* 8.低代码能力:Online在线图表(无需编码,通过在线配置方式,实现曲线图,柱状图,数据报表等,支持自定义排版布局,实现人人皆可编码)
|
|
||||||
* 9.封装完善的用户、角色、菜单、组织机构、数据字典、在线定时任务等基础功能,支持访问授权、按钮权限、数据权限等功能
|
* 9.封装完善的用户、角色、菜单、组织机构、数据字典、在线定时任务等基础功能,支持访问授权、按钮权限、数据权限等功能
|
||||||
* 10.常用共通封装,各种工具类(定时任务,短信接口,邮件发送,Excel导入导出等),基本满足80%项目需求
|
* 10.常用共通封装,各种工具类(定时任务,短信接口,邮件发送,Excel导入导出等),基本满足80%项目需求
|
||||||
* 11.简易Excel导入导出,支持单表导出和一对多表模式导出,生成的代码自带导入导出功能
|
* 11.简易Excel导入导出,支持单表导出和一对多表模式导出,生成的代码自带导入导出功能
|
||||||
@ -207,12 +255,20 @@ Jeecg-Boot低代码开发平台,可以应用在任何J2EE项目的开发中,
|
|||||||
|
|
||||||
### 功能模块
|
### 功能模块
|
||||||
```
|
```
|
||||||
|
├─AI开发
|
||||||
|
│ ├─支持AI大模型ChatGPT和DeepSeek
|
||||||
|
│ ├─AI对话助手
|
||||||
|
│ ├─AI建表
|
||||||
|
│ ├─AI写文章
|
||||||
|
│ ├─AI流程编排(研发中)
|
||||||
|
│ ├─AI知识库问答系统(研发中)
|
||||||
|
│ ├─AI应用开发平台(研发中)
|
||||||
|
│ ├─AI聊天窗口支持嵌入第三方(研发中)
|
||||||
├─Online在线开发(低代码)
|
├─Online在线开发(低代码)
|
||||||
│ ├─Online在线表单
|
│ ├─Online在线表单
|
||||||
│ ├─Online代码生成器
|
│ ├─Online代码生成器
|
||||||
│ ├─Online在线报表
|
│ ├─Online在线报表
|
||||||
│ ├─仪表盘设计器
|
│ ├─仪表盘设计器
|
||||||
│ ├─AI助手
|
|
||||||
│ ├─系统编码规则
|
│ ├─系统编码规则
|
||||||
│ ├─系统校验规则
|
│ ├─系统校验规则
|
||||||
├─积木报表设计器
|
├─积木报表设计器
|
||||||
@ -347,6 +403,24 @@ Jeecg-Boot低代码开发平台,可以应用在任何J2EE项目的开发中,
|
|||||||
|
|
||||||
### 系统效果
|
### 系统效果
|
||||||
|
|
||||||
|
|
||||||
|
##### AI功能
|
||||||
|
|
||||||
|
AI聊天助手
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
AI建表
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
AI写文章
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
##### PC端
|
##### PC端
|
||||||

|

|
||||||
|
|
||||||
@ -365,8 +439,6 @@ Jeecg-Boot低代码开发平台,可以应用在任何J2EE项目的开发中,
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
##### AI助手
|
|
||||||

|
|
||||||
|
|
||||||
|
|
||||||
##### 仪表盘设计器
|
##### 仪表盘设计器
|
||||||
|
|||||||
@ -201,3 +201,13 @@
|
|||||||
limitations under the License.
|
limitations under the License.
|
||||||
|
|
||||||
In any case, you must not make any such use of this software as to develop software which may be considered competitive with this software.
|
In any case, you must not make any such use of this software as to develop software which may be considered competitive with this software.
|
||||||
|
|
||||||
|
JeecgBoot 是由 北京国炬信息技术有限公司 发行的软件。 总部位于北京,地址:中国·北京·朝阳区科荟前街1号院奥林佳泰大厦。邮箱:jeecgos@163.com
|
||||||
|
本软件受适用的国家软件著作权法(包括国际条约)和开源协议 双重保护许可。
|
||||||
|
|
||||||
|
开源协议中文释意如下:
|
||||||
|
1.JeecgBoot开源版本无任何限制,在遵循本开源协议条款下,允许商用使用,不会造成侵权行为。
|
||||||
|
2.允许基于本平台软件开展业务系统开发。
|
||||||
|
3.在任何情况下,您不得使用本软件开发可能被认为与本软件竞争的软件。
|
||||||
|
|
||||||
|
最终解释权归:http://www.jeecg.com
|
||||||
@ -2,12 +2,12 @@
|
|||||||
JeecgBoot 低代码开发平台
|
JeecgBoot 低代码开发平台
|
||||||
===============
|
===============
|
||||||
|
|
||||||
当前最新版本: 3.7.1(发布日期:2024-09-12)
|
当前最新版本: 3.7.3(发布日期:2025-02-10)
|
||||||
|
|
||||||
|
|
||||||
[](https://github.com/zhangdaiscott/jeecg-boot/blob/master/LICENSE)
|
[](https://github.com/zhangdaiscott/jeecg-boot/blob/master/LICENSE)
|
||||||
[](http://jeecg.com/aboutusIndex)
|
[](http://jeecg.com/aboutusIndex)
|
||||||
[](https://github.com/zhangdaiscott/jeecg-boot)
|
[](https://github.com/zhangdaiscott/jeecg-boot)
|
||||||
[](https://github.com/zhangdaiscott/jeecg-boot)
|
[](https://github.com/zhangdaiscott/jeecg-boot)
|
||||||
[](https://github.com/zhangdaiscott/jeecg-boot)
|
[](https://github.com/zhangdaiscott/jeecg-boot)
|
||||||
|
|
||||||
@ -35,7 +35,7 @@ JeecgBoot 是一款基于代码生成器的`低代码开发平台`!前后端
|
|||||||
|
|
||||||
- 官方网站: [http://www.jeecg.com](http://www.jeecg.com)
|
- 官方网站: [http://www.jeecg.com](http://www.jeecg.com)
|
||||||
- 新手指南: [快速入门](http://www.jeecg.com/doc/quickstart)
|
- 新手指南: [快速入门](http://www.jeecg.com/doc/quickstart)
|
||||||
- QQ交流群 : ⑨808791225、其他(满)
|
- QQ交流群 : ⑩716488839、⑨808791225、其他(满)
|
||||||
- 在线演示 : [在线演示](http://boot3.jeecg.com) | [APP演示](http://jeecg.com/appIndex)
|
- 在线演示 : [在线演示](http://boot3.jeecg.com) | [APP演示](http://jeecg.com/appIndex)
|
||||||
> 演示系统的登录账号密码,请点击 [获取账号密码](http://jeecg.com/doc/demo) 获取
|
> 演示系统的登录账号密码,请点击 [获取账号密码](http://jeecg.com/doc/demo) 获取
|
||||||
|
|
||||||
@ -66,7 +66,7 @@ JeecgBoot 是一款基于代码生成器的`低代码开发平台`!前后端
|
|||||||
- 基础框架:Spring Boot 2.7.18
|
- 基础框架:Spring Boot 2.7.18
|
||||||
- 微服务框架: Spring Cloud Alibaba 2021.0.1.0
|
- 微服务框架: Spring Cloud Alibaba 2021.0.1.0
|
||||||
- 持久层框架:MybatisPlus 3.5.3.2
|
- 持久层框架:MybatisPlus 3.5.3.2
|
||||||
- 报表工具: JimuReport 1.7.6
|
- 报表工具: JimuReport 1.8.1
|
||||||
- 安全框架:Apache Shiro 1.12.0,Jwt 3.11.0
|
- 安全框架:Apache Shiro 1.12.0,Jwt 3.11.0
|
||||||
- 微服务技术栈:Spring Cloud Alibaba、Nacos、Gateway、Sentinel、Skywalking
|
- 微服务技术栈:Spring Cloud Alibaba、Nacos、Gateway、Sentinel、Skywalking
|
||||||
- 数据库连接池:阿里巴巴Druid 1.1.22
|
- 数据库连接池:阿里巴巴Druid 1.1.22
|
||||||
@ -97,6 +97,7 @@ JeecgBoot 是一款基于代码生成器的`低代码开发平台`!前后端
|
|||||||
| MariaDB | √ |
|
| MariaDB | √ |
|
||||||
| 达梦 | √ |
|
| 达梦 | √ |
|
||||||
| 人大金仓 | √ |
|
| 人大金仓 | √ |
|
||||||
|
| TiDB | √ |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -5,115 +5,356 @@
|
|||||||
CREATE database if NOT EXISTS `xxl_job` default character set utf8mb4 collate utf8mb4_general_ci;
|
CREATE database if NOT EXISTS `xxl_job` default character set utf8mb4 collate utf8mb4_general_ci;
|
||||||
use `xxl_job`;
|
use `xxl_job`;
|
||||||
|
|
||||||
SET NAMES utf8mb4;
|
/*
|
||||||
|
Navicat Premium Data Transfer
|
||||||
|
|
||||||
|
Source Server : mysql5.7
|
||||||
|
Source Server Type : MySQL
|
||||||
|
Source Server Version : 50738 (5.7.38)
|
||||||
|
Source Host : 127.0.0.1:3306
|
||||||
|
Source Schema : xxl_job
|
||||||
|
|
||||||
|
Target Server Type : MySQL
|
||||||
|
Target Server Version : 50738 (5.7.38)
|
||||||
|
File Encoding : 65001
|
||||||
|
|
||||||
|
Date: 10/02/2025 13:49:31
|
||||||
|
*/
|
||||||
|
|
||||||
|
SET NAMES utf8mb4;
|
||||||
|
SET FOREIGN_KEY_CHECKS = 0;
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- Table structure for xxl_job_group
|
||||||
|
-- ----------------------------
|
||||||
|
DROP TABLE IF EXISTS `xxl_job_group`;
|
||||||
|
CREATE TABLE `xxl_job_group` (
|
||||||
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`app_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '执行器AppName',
|
||||||
|
`title` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '执行器名称',
|
||||||
|
`address_type` tinyint(4) NOT NULL DEFAULT 0 COMMENT '执行器地址类型:0=自动注册、1=手动录入',
|
||||||
|
`address_list` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '执行器地址列表,多地址逗号分隔',
|
||||||
|
`update_time` datetime NULL DEFAULT NULL,
|
||||||
|
PRIMARY KEY (`id`) USING BTREE
|
||||||
|
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- Records of xxl_job_group
|
||||||
|
-- ----------------------------
|
||||||
|
INSERT INTO `xxl_job_group` VALUES (1, 'xxl-job-executor-sample', '示例执行器', 0, NULL, '2025-02-10 13:49:04');
|
||||||
|
INSERT INTO `xxl_job_group` VALUES (2, 'jeecg-demo', '测试Demo模块', 0, NULL, '2025-02-10 13:49:04');
|
||||||
|
INSERT INTO `xxl_job_group` VALUES (3, 'jeecg-system', '系统System模块', 0, NULL, '2025-02-10 13:49:04');
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- Table structure for xxl_job_info
|
||||||
|
-- ----------------------------
|
||||||
|
DROP TABLE IF EXISTS `xxl_job_info`;
|
||||||
CREATE TABLE `xxl_job_info` (
|
CREATE TABLE `xxl_job_info` (
|
||||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
`job_group` int(11) NOT NULL COMMENT '执行器主键ID',
|
`job_group` int(11) NOT NULL COMMENT '执行器主键ID',
|
||||||
`job_cron` varchar(128) NOT NULL COMMENT '任务执行CRON',
|
`job_desc` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
|
||||||
`job_desc` varchar(255) NOT NULL,
|
`add_time` datetime NULL DEFAULT NULL,
|
||||||
`add_time` datetime DEFAULT NULL,
|
`update_time` datetime NULL DEFAULT NULL,
|
||||||
`update_time` datetime DEFAULT NULL,
|
`author` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '作者',
|
||||||
`author` varchar(64) DEFAULT NULL COMMENT '作者',
|
`alarm_email` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '报警邮件',
|
||||||
`alarm_email` varchar(255) DEFAULT NULL COMMENT '报警邮件',
|
`schedule_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'NONE' COMMENT '调度类型',
|
||||||
`executor_route_strategy` varchar(50) DEFAULT NULL COMMENT '执行器路由策略',
|
`schedule_conf` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '调度配置,值含义取决于调度类型',
|
||||||
`executor_handler` varchar(255) DEFAULT NULL COMMENT '执行器任务handler',
|
`misfire_strategy` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'DO_NOTHING' COMMENT '调度过期策略',
|
||||||
`executor_param` varchar(512) DEFAULT NULL COMMENT '执行器任务参数',
|
`executor_route_strategy` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '执行器路由策略',
|
||||||
`executor_block_strategy` varchar(50) DEFAULT NULL COMMENT '阻塞处理策略',
|
`executor_handler` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '执行器任务handler',
|
||||||
`executor_timeout` int(11) NOT NULL DEFAULT '0' COMMENT '任务执行超时时间,单位秒',
|
`executor_param` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '执行器任务参数',
|
||||||
`executor_fail_retry_count` int(11) NOT NULL DEFAULT '0' COMMENT '失败重试次数',
|
`executor_block_strategy` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '阻塞处理策略',
|
||||||
`glue_type` varchar(50) NOT NULL COMMENT 'GLUE类型',
|
`executor_timeout` int(11) NOT NULL DEFAULT 0 COMMENT '任务执行超时时间,单位秒',
|
||||||
`glue_source` mediumtext COMMENT 'GLUE源代码',
|
`executor_fail_retry_count` int(11) NOT NULL DEFAULT 0 COMMENT '失败重试次数',
|
||||||
`glue_remark` varchar(128) DEFAULT NULL COMMENT 'GLUE备注',
|
`glue_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'GLUE类型',
|
||||||
`glue_updatetime` datetime DEFAULT NULL COMMENT 'GLUE更新时间',
|
`glue_source` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT 'GLUE源代码',
|
||||||
`child_jobid` varchar(255) DEFAULT NULL COMMENT '子任务ID,多个逗号分隔',
|
`glue_remark` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'GLUE备注',
|
||||||
`trigger_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '调度状态:0-停止,1-运行',
|
`glue_updatetime` datetime NULL DEFAULT NULL COMMENT 'GLUE更新时间',
|
||||||
`trigger_last_time` bigint(13) NOT NULL DEFAULT '0' COMMENT '上次调度时间',
|
`child_jobid` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '子任务ID,多个逗号分隔',
|
||||||
`trigger_next_time` bigint(13) NOT NULL DEFAULT '0' COMMENT '下次调度时间',
|
`trigger_status` tinyint(4) NOT NULL DEFAULT 0 COMMENT '调度状态:0-停止,1-运行',
|
||||||
PRIMARY KEY (`id`)
|
`trigger_last_time` bigint(13) NOT NULL DEFAULT 0 COMMENT '上次调度时间',
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
`trigger_next_time` bigint(13) NOT NULL DEFAULT 0 COMMENT '下次调度时间',
|
||||||
|
PRIMARY KEY (`id`) USING BTREE
|
||||||
|
) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- Records of xxl_job_info
|
||||||
|
-- ----------------------------
|
||||||
|
INSERT INTO `xxl_job_info` VALUES (1, 1, '测试任务1', '2018-11-03 22:21:31', '2024-08-21 22:30:30', 'XXL', '', 'CRON', '0 0 0 * * ? *', 'DO_NOTHING', 'FIRST', 'demoJob', '', 'SERIAL_EXECUTION', 0, 0, 'BEAN', '', 'GLUE代码初始化', '2018-11-03 22:21:31', '', 1, 1729353600000, 1739203200000);
|
||||||
|
INSERT INTO `xxl_job_info` VALUES (2, 3, '测试jeecg xxljob', '2024-08-21 22:41:10', '2024-08-21 22:41:30', 'JEECG', '', 'CRON', '* * * * * ?', 'DO_NOTHING', 'FIRST', 'demoJob', '', 'SERIAL_EXECUTION', 0, 0, 'BEAN', '', 'GLUE代码初始化', '2024-08-21 22:41:10', '', 1, 1739166572000, 1739166573000);
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- Table structure for xxl_job_lock
|
||||||
|
-- ----------------------------
|
||||||
|
DROP TABLE IF EXISTS `xxl_job_lock`;
|
||||||
|
CREATE TABLE `xxl_job_lock` (
|
||||||
|
`lock_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '锁名称',
|
||||||
|
PRIMARY KEY (`lock_name`) USING BTREE
|
||||||
|
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- Records of xxl_job_lock
|
||||||
|
-- ----------------------------
|
||||||
|
INSERT INTO `xxl_job_lock` VALUES ('schedule_lock');
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- Table structure for xxl_job_log
|
||||||
|
-- ----------------------------
|
||||||
|
DROP TABLE IF EXISTS `xxl_job_log`;
|
||||||
CREATE TABLE `xxl_job_log` (
|
CREATE TABLE `xxl_job_log` (
|
||||||
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
`id` bigint(20) NOT NULL AUTO_INCREMENT,
|
||||||
`job_group` int(11) NOT NULL COMMENT '执行器主键ID',
|
`job_group` int(11) NOT NULL COMMENT '执行器主键ID',
|
||||||
`job_id` int(11) NOT NULL COMMENT '任务,主键ID',
|
`job_id` int(11) NOT NULL COMMENT '任务,主键ID',
|
||||||
`executor_address` varchar(255) DEFAULT NULL COMMENT '执行器地址,本次执行的地址',
|
`executor_address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '执行器地址,本次执行的地址',
|
||||||
`executor_handler` varchar(255) DEFAULT NULL COMMENT '执行器任务handler',
|
`executor_handler` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '执行器任务handler',
|
||||||
`executor_param` varchar(512) DEFAULT NULL COMMENT '执行器任务参数',
|
`executor_param` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '执行器任务参数',
|
||||||
`executor_sharding_param` varchar(20) DEFAULT NULL COMMENT '执行器任务分片参数,格式如 1/2',
|
`executor_sharding_param` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '执行器任务分片参数,格式如 1/2',
|
||||||
`executor_fail_retry_count` int(11) NOT NULL DEFAULT '0' COMMENT '失败重试次数',
|
`executor_fail_retry_count` int(11) NOT NULL DEFAULT 0 COMMENT '失败重试次数',
|
||||||
`trigger_time` datetime DEFAULT NULL COMMENT '调度-时间',
|
`trigger_time` datetime NULL DEFAULT NULL COMMENT '调度-时间',
|
||||||
`trigger_code` int(11) NOT NULL COMMENT '调度-结果',
|
`trigger_code` int(11) NOT NULL COMMENT '调度-结果',
|
||||||
`trigger_msg` text COMMENT '调度-日志',
|
`trigger_msg` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '调度-日志',
|
||||||
`handle_time` datetime DEFAULT NULL COMMENT '执行-时间',
|
`handle_time` datetime NULL DEFAULT NULL COMMENT '执行-时间',
|
||||||
`handle_code` int(11) NOT NULL COMMENT '执行-状态',
|
`handle_code` int(11) NOT NULL COMMENT '执行-状态',
|
||||||
`handle_msg` text COMMENT '执行-日志',
|
`handle_msg` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '执行-日志',
|
||||||
`alarm_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '告警状态:0-默认、1-无需告警、2-告警成功、3-告警失败',
|
`alarm_status` tinyint(4) NOT NULL DEFAULT 0 COMMENT '告警状态:0-默认、1-无需告警、2-告警成功、3-告警失败',
|
||||||
PRIMARY KEY (`id`),
|
PRIMARY KEY (`id`) USING BTREE,
|
||||||
KEY `I_trigger_time` (`trigger_time`),
|
INDEX `I_trigger_time`(`trigger_time`) USING BTREE,
|
||||||
KEY `I_handle_code` (`handle_code`)
|
INDEX `I_handle_code`(`handle_code`) USING BTREE
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
) ENGINE = InnoDB AUTO_INCREMENT = 6761 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- Records of xxl_job_log
|
||||||
|
-- ----------------------------
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6618, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:09', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6619, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:10', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6620, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:11', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6621, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:12', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6622, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:13', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6623, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:14', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6624, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:15', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6625, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:16', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6626, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:17', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6627, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:18', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6628, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:19', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6629, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:20', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6630, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:21', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6631, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:22', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6632, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:23', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6633, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:24', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6634, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:25', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6635, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:26', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6636, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:27', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6637, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:28', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6638, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:29', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6639, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:30', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6640, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:31', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6641, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:32', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6642, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:33', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6643, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:34', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6644, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:35', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6645, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:36', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6646, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:37', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6647, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:38', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6648, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:39', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6649, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:40', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6650, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:41', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6651, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:42', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6652, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:43', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6653, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:44', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6654, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:45', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6655, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:46', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6656, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:47', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6657, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:48', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6658, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:49', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6659, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:50', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6660, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:51', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6661, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:52', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6662, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:53', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6663, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:54', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6664, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:55', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6665, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:56', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6666, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:57', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6667, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:58', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6668, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:47:59', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6669, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:00', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6670, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:01', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6671, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:02', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6672, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:03', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6673, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:04', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6674, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:05', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6675, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:06', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6676, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:07', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6677, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:08', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6678, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:09', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6679, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:10', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6680, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:11', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6681, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:12', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6682, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:13', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6683, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:14', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6684, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:15', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6685, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:16', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6686, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:17', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6687, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:18', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6688, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:19', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6689, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:20', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6690, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:21', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6691, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:22', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6692, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:23', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6693, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:24', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6694, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:25', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6695, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:26', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6696, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:27', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6697, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:28', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6698, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:29', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6699, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:30', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6700, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:31', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6701, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:32', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6702, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:33', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6703, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:34', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6704, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:35', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6705, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:36', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6706, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:37', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6707, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:38', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6708, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:39', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6709, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:40', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6710, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:41', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6711, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:42', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6712, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:43', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6713, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:44', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6714, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:45', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6715, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:46', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6716, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:47', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6717, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:48', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6718, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:49', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6719, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:50', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6720, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:51', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6721, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:52', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6722, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:53', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6723, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:54', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6724, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:55', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6725, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:56', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6726, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:57', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6727, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:58', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6728, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:48:59', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6729, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:00', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6730, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:01', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6731, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:02', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6732, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:03', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6733, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:04', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6734, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:05', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6735, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:06', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6736, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:07', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6737, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:08', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6738, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:09', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6739, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:10', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6740, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:11', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6741, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:12', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6742, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:13', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6743, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:14', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6744, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:15', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6745, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:16', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6746, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:17', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6747, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:18', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6748, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:19', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6749, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:20', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6750, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:21', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6751, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:22', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6752, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:23', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6753, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:24', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 2);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6754, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:25', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 0);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6755, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:26', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 0);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6756, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:27', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 0);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6757, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:28', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 0);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6758, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:29', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 0);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6759, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:30', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 0);
|
||||||
|
INSERT INTO `xxl_job_log` VALUES (6760, 3, 2, NULL, 'demoJob', '', NULL, 0, '2025-02-10 13:49:31', 500, '任务触发类型:Cron触发<br>调度机器:192.168.1.11<br>执行器-注册方式:自动注册<br>执行器-地址列表:null<br>路由策略:第一个<br>阻塞处理策略:单机串行<br>任务超时时间:0<br>失败重试次数:0<br><br><span style=\"color:#00c0ef;\" > >>>>>>>>>>>触发调度<<<<<<<<<<< </span><br>调度失败:执行器地址为空<br><br>', NULL, 0, NULL, 0);
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- Table structure for xxl_job_log_report
|
||||||
|
-- ----------------------------
|
||||||
|
DROP TABLE IF EXISTS `xxl_job_log_report`;
|
||||||
CREATE TABLE `xxl_job_log_report` (
|
CREATE TABLE `xxl_job_log_report` (
|
||||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
`trigger_day` datetime DEFAULT NULL COMMENT '调度-时间',
|
`trigger_day` datetime NULL DEFAULT NULL COMMENT '调度-时间',
|
||||||
`running_count` int(11) NOT NULL DEFAULT '0' COMMENT '运行中-日志数量',
|
`running_count` int(11) NOT NULL DEFAULT 0 COMMENT '运行中-日志数量',
|
||||||
`suc_count` int(11) NOT NULL DEFAULT '0' COMMENT '执行成功-日志数量',
|
`suc_count` int(11) NOT NULL DEFAULT 0 COMMENT '执行成功-日志数量',
|
||||||
`fail_count` int(11) NOT NULL DEFAULT '0' COMMENT '执行失败-日志数量',
|
`fail_count` int(11) NOT NULL DEFAULT 0 COMMENT '执行失败-日志数量',
|
||||||
PRIMARY KEY (`id`),
|
`update_time` datetime NULL DEFAULT NULL,
|
||||||
UNIQUE KEY `i_trigger_day` (`trigger_day`) USING BTREE
|
PRIMARY KEY (`id`) USING BTREE,
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
UNIQUE INDEX `i_trigger_day`(`trigger_day`) USING BTREE
|
||||||
|
) ENGINE = InnoDB AUTO_INCREMENT = 13 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- Records of xxl_job_log_report
|
||||||
|
-- ----------------------------
|
||||||
|
INSERT INTO `xxl_job_log_report` VALUES (1, '2024-08-21 00:00:00', 70, 0, 5, NULL);
|
||||||
|
INSERT INTO `xxl_job_log_report` VALUES (2, '2024-08-20 00:00:00', 0, 0, 0, NULL);
|
||||||
|
INSERT INTO `xxl_job_log_report` VALUES (3, '2024-08-19 00:00:00', 0, 0, 0, NULL);
|
||||||
|
INSERT INTO `xxl_job_log_report` VALUES (4, '2024-09-10 00:00:00', 0, 0, 56, NULL);
|
||||||
|
INSERT INTO `xxl_job_log_report` VALUES (5, '2024-09-09 00:00:00', 0, 0, 0, NULL);
|
||||||
|
INSERT INTO `xxl_job_log_report` VALUES (6, '2024-09-08 00:00:00', 0, 0, 0, NULL);
|
||||||
|
INSERT INTO `xxl_job_log_report` VALUES (7, '2024-10-19 00:00:00', 0, 0, 6391, NULL);
|
||||||
|
INSERT INTO `xxl_job_log_report` VALUES (8, '2024-10-18 00:00:00', 0, 0, 0, NULL);
|
||||||
|
INSERT INTO `xxl_job_log_report` VALUES (9, '2024-10-17 00:00:00', 0, 0, 0, NULL);
|
||||||
|
INSERT INTO `xxl_job_log_report` VALUES (10, '2025-02-10 00:00:00', 0, 0, 116, NULL);
|
||||||
|
INSERT INTO `xxl_job_log_report` VALUES (11, '2025-02-09 00:00:00', 0, 0, 0, NULL);
|
||||||
|
INSERT INTO `xxl_job_log_report` VALUES (12, '2025-02-08 00:00:00', 0, 0, 0, NULL);
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- Table structure for xxl_job_logglue
|
||||||
|
-- ----------------------------
|
||||||
|
DROP TABLE IF EXISTS `xxl_job_logglue`;
|
||||||
CREATE TABLE `xxl_job_logglue` (
|
CREATE TABLE `xxl_job_logglue` (
|
||||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
`job_id` int(11) NOT NULL COMMENT '任务,主键ID',
|
`job_id` int(11) NOT NULL COMMENT '任务,主键ID',
|
||||||
`glue_type` varchar(50) DEFAULT NULL COMMENT 'GLUE类型',
|
`glue_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'GLUE类型',
|
||||||
`glue_source` mediumtext COMMENT 'GLUE源代码',
|
`glue_source` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT 'GLUE源代码',
|
||||||
`glue_remark` varchar(128) NOT NULL COMMENT 'GLUE备注',
|
`glue_remark` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'GLUE备注',
|
||||||
`add_time` datetime DEFAULT NULL,
|
`add_time` datetime NULL DEFAULT NULL,
|
||||||
`update_time` datetime DEFAULT NULL,
|
`update_time` datetime NULL DEFAULT NULL,
|
||||||
PRIMARY KEY (`id`)
|
PRIMARY KEY (`id`) USING BTREE
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- Records of xxl_job_logglue
|
||||||
|
-- ----------------------------
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- Table structure for xxl_job_registry
|
||||||
|
-- ----------------------------
|
||||||
|
DROP TABLE IF EXISTS `xxl_job_registry`;
|
||||||
CREATE TABLE `xxl_job_registry` (
|
CREATE TABLE `xxl_job_registry` (
|
||||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
`registry_group` varchar(50) NOT NULL,
|
`registry_group` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
|
||||||
`registry_key` varchar(255) NOT NULL,
|
`registry_key` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
|
||||||
`registry_value` varchar(255) NOT NULL,
|
`registry_value` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
|
||||||
`update_time` datetime DEFAULT NULL,
|
`update_time` datetime NULL DEFAULT NULL,
|
||||||
PRIMARY KEY (`id`),
|
PRIMARY KEY (`id`) USING BTREE,
|
||||||
KEY `i_g_k_v` (`registry_group`,`registry_key`,`registry_value`)
|
INDEX `i_g_k_v`(`registry_group`, `registry_key`, `registry_value`) USING BTREE
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
|
||||||
|
|
||||||
CREATE TABLE `xxl_job_group` (
|
-- ----------------------------
|
||||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
-- Records of xxl_job_registry
|
||||||
`app_name` varchar(64) NOT NULL COMMENT '执行器AppName',
|
-- ----------------------------
|
||||||
`title` varchar(12) NOT NULL COMMENT '执行器名称',
|
|
||||||
`address_type` tinyint(4) NOT NULL DEFAULT '0' COMMENT '执行器地址类型:0=自动注册、1=手动录入',
|
|
||||||
`address_list` varchar(512) DEFAULT NULL COMMENT '执行器地址列表,多地址逗号分隔',
|
|
||||||
PRIMARY KEY (`id`)
|
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
|
||||||
|
|
||||||
|
-- ----------------------------
|
||||||
|
-- Table structure for xxl_job_user
|
||||||
|
-- ----------------------------
|
||||||
|
DROP TABLE IF EXISTS `xxl_job_user`;
|
||||||
CREATE TABLE `xxl_job_user` (
|
CREATE TABLE `xxl_job_user` (
|
||||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
`username` varchar(50) NOT NULL COMMENT '账号',
|
`username` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '账号',
|
||||||
`password` varchar(50) NOT NULL COMMENT '密码',
|
`password` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '密码',
|
||||||
`role` tinyint(4) NOT NULL COMMENT '角色:0-普通用户、1-管理员',
|
`role` tinyint(4) NOT NULL COMMENT '角色:0-普通用户、1-管理员',
|
||||||
`permission` varchar(255) DEFAULT NULL COMMENT '权限:执行器ID列表,多个逗号分割',
|
`permission` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '权限:执行器ID列表,多个逗号分割',
|
||||||
PRIMARY KEY (`id`),
|
PRIMARY KEY (`id`) USING BTREE,
|
||||||
UNIQUE KEY `i_username` (`username`) USING BTREE
|
UNIQUE INDEX `i_username`(`username`) USING BTREE
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
|
||||||
|
|
||||||
CREATE TABLE `xxl_job_lock` (
|
-- ----------------------------
|
||||||
`lock_name` varchar(50) NOT NULL COMMENT '锁名称',
|
-- Records of xxl_job_user
|
||||||
PRIMARY KEY (`lock_name`)
|
-- ----------------------------
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
INSERT INTO `xxl_job_user` VALUES (1, 'admin', 'e10adc3949ba59abbe56e057f20f883e', 1, NULL);
|
||||||
|
|
||||||
|
SET FOREIGN_KEY_CHECKS = 1;
|
||||||
INSERT INTO `xxl_job_group`(`id`, `app_name`, `title`, `address_type`, `address_list`) VALUES (1, 'xxl-job-executor-sample', '示例执行器', 0, NULL);
|
|
||||||
INSERT INTO `xxl_job_info`(`id`, `job_group`, `job_cron`, `job_desc`, `add_time`, `update_time`, `author`, `alarm_email`, `executor_route_strategy`, `executor_handler`, `executor_param`, `executor_block_strategy`, `executor_timeout`, `executor_fail_retry_count`, `glue_type`, `glue_source`, `glue_remark`, `glue_updatetime`, `child_jobid`) VALUES (1, 1, '0 0 0 * * ? *', '测试任务1', '2018-11-03 22:21:31', '2018-11-03 22:21:31', 'XXL', '', 'FIRST', 'demoJobHandler', '', 'SERIAL_EXECUTION', 0, 0, 'BEAN', '', 'GLUE代码初始化', '2018-11-03 22:21:31', '');
|
|
||||||
INSERT INTO `xxl_job_user`(`id`, `username`, `password`, `role`, `permission`) VALUES (1, 'admin', 'e10adc3949ba59abbe56e057f20f883e', 1, NULL);
|
|
||||||
INSERT INTO `xxl_job_lock` ( `lock_name`) VALUES ( 'schedule_lock');
|
|
||||||
|
|
||||||
commit;
|
|
||||||
|
|
||||||
|
|||||||
@ -3,6 +3,7 @@
|
|||||||
> JeecgBoot属于平台级产品,每次升级改动较大,目前做不到平滑升级。
|
> JeecgBoot属于平台级产品,每次升级改动较大,目前做不到平滑升级。
|
||||||
|
|
||||||
### 增量升级方案
|
### 增量升级方案
|
||||||
|
|
||||||
#### 1.代码合并
|
#### 1.代码合并
|
||||||
本地通过svn或git做好主干,在分支上做业务开发,jeecg每次版本发布,可以手工覆盖主干的代码,对比合并代码;
|
本地通过svn或git做好主干,在分支上做业务开发,jeecg每次版本发布,可以手工覆盖主干的代码,对比合并代码;
|
||||||
|
|
||||||
@ -11,5 +12,12 @@
|
|||||||
- 其他库请手工执行SQL, 目录: `jeecg-module-system\jeecg-system-start\src\main\resources\flyway\sql\mysql`
|
- 其他库请手工执行SQL, 目录: `jeecg-module-system\jeecg-system-start\src\main\resources\flyway\sql\mysql`
|
||||||
> 注意: 升级sql只提供mysql版本;如果有权限升级, 还需要手工角色授权,退出重新登录才好使。
|
> 注意: 升级sql只提供mysql版本;如果有权限升级, 还需要手工角色授权,退出重新登录才好使。
|
||||||
|
|
||||||
#### 3.兼容问题
|
#### 3.其他数据库脚本说明
|
||||||
|
原先官方默认提供oracle和SqlServer的脚本,但是维护成本太高,未提供脚本的数据库,可以参考下面的文档自己转
|
||||||
|
https://my.oschina.net/jeecg/blog/4905722
|
||||||
|
(注意:定时任务的表qrtz_*,需要删掉用原始的脚本重新执行一下)
|
||||||
|
quartz-2.2.3-distribution.tar.gz放到百度网盘中,大家自己下载,执行所需数据库脚本
|
||||||
|
https://pan.baidu.com/s/1WrmZdUuAPg3iBwJ-LoHWyg?pwd=8mdz
|
||||||
|
|
||||||
|
#### 4.兼容问题
|
||||||
每次发版,会针对不兼容地方重点说明。
|
每次发版,会针对不兼容地方重点说明。
|
||||||
@ -4,11 +4,15 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>org.jeecgframework.boot</groupId>
|
<groupId>org.jeecgframework.boot</groupId>
|
||||||
<artifactId>jeecg-boot-parent</artifactId>
|
<artifactId>jeecg-boot-parent</artifactId>
|
||||||
<version>3.7.1</version>
|
<version>3.7.3</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<artifactId>jeecg-boot-base-core</artifactId>
|
<artifactId>jeecg-boot-base-core</artifactId>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<spring-boot.version>3.1.5</spring-boot.version>
|
||||||
|
</properties>
|
||||||
|
|
||||||
<repositories>
|
<repositories>
|
||||||
<repository>
|
<repository>
|
||||||
<id>aliyun</id>
|
<id>aliyun</id>
|
||||||
@ -43,12 +47,22 @@
|
|||||||
<!--jeecg-tools-->
|
<!--jeecg-tools-->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.jeecgframework.boot</groupId>
|
<groupId>org.jeecgframework.boot</groupId>
|
||||||
<artifactId>jeecg-boot-common</artifactId>
|
<artifactId>jeecg-boot-common3</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
<!--集成springmvc框架并实现自动配置 -->
|
<!--集成springmvc框架并实现自动配置 -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.springframework.boot</groupId>
|
<groupId>org.springframework.boot</groupId>
|
||||||
<artifactId>spring-boot-starter-web</artifactId>
|
<artifactId>spring-boot-starter-web</artifactId>
|
||||||
|
<exclusions>
|
||||||
|
<exclusion>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-tomcat</artifactId>
|
||||||
|
</exclusion>
|
||||||
|
</exclusions>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-undertow</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
<!-- websocket -->
|
<!-- websocket -->
|
||||||
<dependency>
|
<dependency>
|
||||||
@ -105,14 +119,14 @@
|
|||||||
<!-- druid -->
|
<!-- druid -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.alibaba</groupId>
|
<groupId>com.alibaba</groupId>
|
||||||
<artifactId>druid-spring-boot-starter</artifactId>
|
<artifactId>druid-spring-boot-3-starter</artifactId>
|
||||||
<version>${druid.version}</version>
|
<version>${druid.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- 动态数据源 -->
|
<!-- 动态数据源 -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.baomidou</groupId>
|
<groupId>com.baomidou</groupId>
|
||||||
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
|
<artifactId>dynamic-datasource-spring-boot3-starter</artifactId>
|
||||||
<version>${dynamic-datasource-spring-boot-starter.version}</version>
|
<version>${dynamic-datasource-spring-boot-starter.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
@ -164,6 +178,7 @@
|
|||||||
<version>${dm8.version}</version>
|
<version>${dm8.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
|
||||||
<!-- Quartz定时任务 -->
|
<!-- Quartz定时任务 -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.springframework.boot</groupId>
|
<groupId>org.springframework.boot</groupId>
|
||||||
@ -181,7 +196,14 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.apache.shiro</groupId>
|
<groupId>org.apache.shiro</groupId>
|
||||||
<artifactId>shiro-spring-boot-starter</artifactId>
|
<artifactId>shiro-spring-boot-starter</artifactId>
|
||||||
|
<classifier>jakarta</classifier>
|
||||||
<version>${shiro.version}</version>
|
<version>${shiro.version}</version>
|
||||||
|
<exclusions>
|
||||||
|
<exclusion>
|
||||||
|
<groupId>org.apache.shiro</groupId>
|
||||||
|
<artifactId>shiro-spring</artifactId>
|
||||||
|
</exclusion>
|
||||||
|
</exclusions>
|
||||||
</dependency>
|
</dependency>
|
||||||
<!-- shiro-redis -->
|
<!-- shiro-redis -->
|
||||||
<dependency>
|
<dependency>
|
||||||
@ -197,18 +219,61 @@
|
|||||||
<artifactId>checkstyle</artifactId>
|
<artifactId>checkstyle</artifactId>
|
||||||
<groupId>com.puppycrawl.tools</groupId>
|
<groupId>com.puppycrawl.tools</groupId>
|
||||||
</exclusion>
|
</exclusion>
|
||||||
|
<!-- TODO shiro 无法使用 spring boot 3.X 自带的jedis,降版本处理 -->
|
||||||
|
<exclusion>
|
||||||
|
<artifactId>jedis</artifactId>
|
||||||
|
<groupId>redis.clients</groupId>
|
||||||
|
</exclusion>
|
||||||
|
</exclusions>
|
||||||
|
</dependency>
|
||||||
|
<!-- TODO shiro 无法使用 spring boot 3.X 自带的jedis,降版本处理 -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>redis.clients</groupId>
|
||||||
|
<artifactId>jedis</artifactId>
|
||||||
|
<version>${jedis.version}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.shiro</groupId>
|
||||||
|
<artifactId>shiro-spring</artifactId>
|
||||||
|
<classifier>jakarta</classifier>
|
||||||
|
<version>${shiro.version}</version>
|
||||||
|
<!-- 排除仍使用了javax.servlet的依赖 -->
|
||||||
|
<exclusions>
|
||||||
|
<exclusion>
|
||||||
|
<groupId>org.apache.shiro</groupId>
|
||||||
|
<artifactId>shiro-core</artifactId>
|
||||||
|
</exclusion>
|
||||||
|
<exclusion>
|
||||||
|
<groupId>org.apache.shiro</groupId>
|
||||||
|
<artifactId>shiro-web</artifactId>
|
||||||
|
</exclusion>
|
||||||
|
</exclusions>
|
||||||
|
</dependency>
|
||||||
|
<!-- 引入适配jakarta的依赖包 -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.shiro</groupId>
|
||||||
|
<artifactId>shiro-core</artifactId>
|
||||||
|
<classifier>jakarta</classifier>
|
||||||
|
<version>${shiro.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.shiro</groupId>
|
||||||
|
<artifactId>shiro-web</artifactId>
|
||||||
|
<classifier>jakarta</classifier>
|
||||||
|
<version>${shiro.version}</version>
|
||||||
|
<exclusions>
|
||||||
|
<exclusion>
|
||||||
|
<groupId>org.apache.shiro</groupId>
|
||||||
|
<artifactId>shiro-core</artifactId>
|
||||||
|
</exclusion>
|
||||||
</exclusions>
|
</exclusions>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- knife4j -->
|
<!-- knife4j -->
|
||||||
<!-- <dependency>
|
|
||||||
<groupId>com.github.xiaoymin</groupId>
|
|
||||||
<artifactId>knife4j-spring-boot-starter</artifactId>
|
|
||||||
<version>3.0.3</version>
|
|
||||||
</dependency>-->
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.github.xiaoymin</groupId>
|
<groupId>com.github.xiaoymin</groupId>
|
||||||
<artifactId>knife4j-openapi2-spring-boot-starter</artifactId>
|
<artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>
|
||||||
<version>${knife4j-spring-boot-starter.version}</version>
|
<version>${knife4j-spring-boot-starter.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
@ -222,7 +287,7 @@
|
|||||||
|
|
||||||
<!-- AutoPoi Excel工具类-->
|
<!-- AutoPoi Excel工具类-->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.jeecgframework</groupId>
|
<groupId>org.jeecgframework.boot3</groupId>
|
||||||
<artifactId>autopoi-web</artifactId>
|
<artifactId>autopoi-web</artifactId>
|
||||||
<version>${autopoi-web.version}</version>
|
<version>${autopoi-web.version}</version>
|
||||||
<exclusions>
|
<exclusions>
|
||||||
@ -265,6 +330,16 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.xkcoding.justauth</groupId>
|
<groupId>com.xkcoding.justauth</groupId>
|
||||||
<artifactId>justauth-spring-boot-starter</artifactId>
|
<artifactId>justauth-spring-boot-starter</artifactId>
|
||||||
|
<exclusions>
|
||||||
|
<exclusion>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-autoconfigure</artifactId>
|
||||||
|
</exclusion>
|
||||||
|
<exclusion>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-configuration-processor</artifactId>
|
||||||
|
</exclusion>
|
||||||
|
</exclusions>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.squareup.okhttp3</groupId>
|
<groupId>com.squareup.okhttp3</groupId>
|
||||||
@ -292,7 +367,7 @@
|
|||||||
<!-- chatgpt -->
|
<!-- chatgpt -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.jeecgframework.boot</groupId>
|
<groupId>org.jeecgframework.boot</groupId>
|
||||||
<artifactId>jeecg-boot-starter-chatgpt</artifactId>
|
<artifactId>jeecg-boot-starter3-chatgpt</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
</project>
|
</project>
|
||||||
@ -2,7 +2,7 @@ package org.jeecg.common.api.dto;
|
|||||||
|
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import jakarta.servlet.http.HttpServletResponse;
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -84,6 +84,12 @@ public class MessageDTO implements Serializable {
|
|||||||
* 邮件抄送地址
|
* 邮件抄送地址
|
||||||
*/
|
*/
|
||||||
protected Set<String> ccEmailList;
|
protected Set<String> ccEmailList;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否为定时任务推送email
|
||||||
|
*/
|
||||||
|
private Boolean isTimeJob = false;
|
||||||
|
|
||||||
//---【邮件相关参数】-------------------------------------------------------------
|
//---【邮件相关参数】-------------------------------------------------------------
|
||||||
|
|
||||||
public MessageDTO(){
|
public MessageDTO(){
|
||||||
|
|||||||
@ -1,8 +1,7 @@
|
|||||||
package org.jeecg.common.api.vo;
|
package org.jeecg.common.api.vo;
|
||||||
|
|
||||||
import com.fasterxml.jackson.annotation.JsonIgnore;
|
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||||
import io.swagger.annotations.ApiModel;
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
import io.swagger.annotations.ApiModelProperty;
|
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import org.jeecg.common.constant.CommonConstant;
|
import org.jeecg.common.constant.CommonConstant;
|
||||||
|
|
||||||
@ -15,7 +14,7 @@ import java.io.Serializable;
|
|||||||
* @date 2019年1月19日
|
* @date 2019年1月19日
|
||||||
*/
|
*/
|
||||||
@Data
|
@Data
|
||||||
@ApiModel(value="接口返回对象", description="接口返回对象")
|
@Schema(description="接口返回对象")
|
||||||
public class Result<T> implements Serializable {
|
public class Result<T> implements Serializable {
|
||||||
|
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
@ -23,31 +22,31 @@ public class Result<T> implements Serializable {
|
|||||||
/**
|
/**
|
||||||
* 成功标志
|
* 成功标志
|
||||||
*/
|
*/
|
||||||
@ApiModelProperty(value = "成功标志")
|
@Schema(description = "成功标志")
|
||||||
private boolean success = true;
|
private boolean success = true;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 返回处理消息
|
* 返回处理消息
|
||||||
*/
|
*/
|
||||||
@ApiModelProperty(value = "返回处理消息")
|
@Schema(description = "返回处理消息")
|
||||||
private String message = "";
|
private String message = "";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 返回代码
|
* 返回代码
|
||||||
*/
|
*/
|
||||||
@ApiModelProperty(value = "返回代码")
|
@Schema(description = "返回代码")
|
||||||
private Integer code = 0;
|
private Integer code = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 返回数据对象 data
|
* 返回数据对象 data
|
||||||
*/
|
*/
|
||||||
@ApiModelProperty(value = "返回数据对象")
|
@Schema(description = "返回数据对象")
|
||||||
private T result;
|
private T result;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 时间戳
|
* 时间戳
|
||||||
*/
|
*/
|
||||||
@ApiModelProperty(value = "时间戳")
|
@Schema(description = "时间戳")
|
||||||
private long timestamp = System.currentTimeMillis();
|
private long timestamp = System.currentTimeMillis();
|
||||||
|
|
||||||
public Result() {
|
public Result() {
|
||||||
|
|||||||
@ -21,13 +21,14 @@ import org.jeecg.common.util.IpUtils;
|
|||||||
import org.jeecg.common.util.SpringContextUtils;
|
import org.jeecg.common.util.SpringContextUtils;
|
||||||
import org.jeecg.common.util.oConvertUtils;
|
import org.jeecg.common.util.oConvertUtils;
|
||||||
import org.springframework.core.LocalVariableTableParameterNameDiscoverer;
|
import org.springframework.core.LocalVariableTableParameterNameDiscoverer;
|
||||||
|
import org.springframework.core.StandardReflectionParameterNameDiscoverer;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
import org.springframework.validation.BindingResult;
|
import org.springframework.validation.BindingResult;
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
import javax.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
import javax.servlet.ServletRequest;
|
import jakarta.servlet.ServletRequest;
|
||||||
import javax.servlet.ServletResponse;
|
import jakarta.servlet.ServletResponse;
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
|
||||||
@ -172,7 +173,7 @@ public class AutoLogAspect {
|
|||||||
// 请求的方法参数值
|
// 请求的方法参数值
|
||||||
Object[] args = joinPoint.getArgs();
|
Object[] args = joinPoint.getArgs();
|
||||||
// 请求的方法参数名称
|
// 请求的方法参数名称
|
||||||
LocalVariableTableParameterNameDiscoverer u = new LocalVariableTableParameterNameDiscoverer();
|
StandardReflectionParameterNameDiscoverer u=new StandardReflectionParameterNameDiscoverer();
|
||||||
String[] paramNames = u.getParameterNames(method);
|
String[] paramNames = u.getParameterNames(method);
|
||||||
if (args != null && paramNames != null) {
|
if (args != null && paramNames != null) {
|
||||||
for (int i = 0; i < args.length; i++) {
|
for (int i = 0; i < args.length; i++) {
|
||||||
|
|||||||
@ -21,7 +21,7 @@ import org.springframework.beans.factory.annotation.Autowired;
|
|||||||
import org.springframework.context.annotation.Lazy;
|
import org.springframework.context.annotation.Lazy;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
|||||||
@ -604,6 +604,11 @@ public interface CommonConstant {
|
|||||||
*/
|
*/
|
||||||
String CHANGE_PHONE_REDIS_KEY_PRE = "sys:cache:phone:change_phone_msg:";
|
String CHANGE_PHONE_REDIS_KEY_PRE = "sys:cache:phone:change_phone_msg:";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 手机号短信验证码redis-key的前缀
|
||||||
|
*/
|
||||||
|
String LOG_OFF_PHONE_REDIS_KEY_PRE = "sys:cache:phone:qqy_log_off_user_msg:";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 缓存用户最后一次收到消息通知的时间 KEY
|
* 缓存用户最后一次收到消息通知的时间 KEY
|
||||||
*/
|
*/
|
||||||
|
|||||||
@ -15,15 +15,7 @@ public enum DySmsEnum {
|
|||||||
/**修改密码短信模板编码*/
|
/**修改密码短信模板编码*/
|
||||||
CHANGE_PASSWORD_TEMPLATE_CODE("SMS_465391221","敲敲云","code"),
|
CHANGE_PASSWORD_TEMPLATE_CODE("SMS_465391221","敲敲云","code"),
|
||||||
/**注册账号短信模板编码*/
|
/**注册账号短信模板编码*/
|
||||||
REGISTER_TEMPLATE_CODE("SMS_175430166","敲敲云","code"),
|
REGISTER_TEMPLATE_CODE("SMS_175430166","敲敲云","code");
|
||||||
/**会议通知*/
|
|
||||||
MEET_NOTICE_TEMPLATE_CODE("SMS_201480469","JEECG","username,title,minute,time"),
|
|
||||||
/**我的计划通知*/
|
|
||||||
PLAN_NOTICE_TEMPLATE_CODE("SMS_201470515","JEECG","username,title,time"),
|
|
||||||
/**支付成功短信通知*/
|
|
||||||
PAY_SUCCESS_NOTICE_CODE("SMS_461735163","敲敲云","realname,money,endTime"),
|
|
||||||
/**会员到期通知提醒*/
|
|
||||||
VIP_EXPIRE_NOTICE_CODE("SMS_461885023","敲敲云","realname,endTime");
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 短信模板编码
|
* 短信模板编码
|
||||||
|
|||||||
@ -1,6 +1,8 @@
|
|||||||
package org.jeecg.common.exception;
|
package org.jeecg.common.exception;
|
||||||
|
|
||||||
import cn.hutool.core.util.ObjectUtil;
|
import cn.hutool.core.util.ObjectUtil;
|
||||||
|
import jakarta.annotation.Resource;
|
||||||
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.commons.lang3.exception.ExceptionUtils;
|
import org.apache.commons.lang3.exception.ExceptionUtils;
|
||||||
import org.apache.shiro.SecurityUtils;
|
import org.apache.shiro.SecurityUtils;
|
||||||
@ -30,8 +32,6 @@ import org.springframework.web.bind.annotation.RestControllerAdvice;
|
|||||||
import org.springframework.web.multipart.MaxUploadSizeExceededException;
|
import org.springframework.web.multipart.MaxUploadSizeExceededException;
|
||||||
import org.springframework.web.servlet.NoHandlerFoundException;
|
import org.springframework.web.servlet.NoHandlerFoundException;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -23,9 +23,9 @@ import org.springframework.web.multipart.MultipartFile;
|
|||||||
import org.springframework.web.multipart.MultipartHttpServletRequest;
|
import org.springframework.web.multipart.MultipartHttpServletRequest;
|
||||||
import org.springframework.web.servlet.ModelAndView;
|
import org.springframework.web.servlet.ModelAndView;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import jakarta.servlet.http.HttpServletResponse;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
|
|||||||
@ -9,10 +9,10 @@ import com.baomidou.mybatisplus.annotation.IdType;
|
|||||||
import com.baomidou.mybatisplus.annotation.TableId;
|
import com.baomidou.mybatisplus.annotation.TableId;
|
||||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||||
|
|
||||||
import io.swagger.annotations.ApiModelProperty;
|
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
import lombok.experimental.Accessors;
|
import lombok.experimental.Accessors;
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @Description: Entity基类
|
* @Description: Entity基类
|
||||||
@ -30,20 +30,20 @@ public class JeecgEntity implements Serializable {
|
|||||||
* ID
|
* ID
|
||||||
*/
|
*/
|
||||||
@TableId(type = IdType.ASSIGN_ID)
|
@TableId(type = IdType.ASSIGN_ID)
|
||||||
@ApiModelProperty(value = "ID")
|
@Schema(description = "ID")
|
||||||
private java.lang.String id;
|
private java.lang.String id;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 创建人
|
* 创建人
|
||||||
*/
|
*/
|
||||||
@ApiModelProperty(value = "创建人")
|
@Schema(description = "创建人")
|
||||||
@Excel(name = "创建人", width = 15)
|
@Excel(name = "创建人", width = 15)
|
||||||
private java.lang.String createBy;
|
private java.lang.String createBy;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 创建时间
|
* 创建时间
|
||||||
*/
|
*/
|
||||||
@ApiModelProperty(value = "创建时间")
|
@Schema(description = "创建时间")
|
||||||
@Excel(name = "创建时间", width = 20, format = "yyyy-MM-dd HH:mm:ss")
|
@Excel(name = "创建时间", width = 20, format = "yyyy-MM-dd HH:mm:ss")
|
||||||
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
|
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
|
||||||
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||||
@ -52,14 +52,14 @@ public class JeecgEntity implements Serializable {
|
|||||||
/**
|
/**
|
||||||
* 更新人
|
* 更新人
|
||||||
*/
|
*/
|
||||||
@ApiModelProperty(value = "更新人")
|
@Schema(description = "更新人")
|
||||||
@Excel(name = "更新人", width = 15)
|
@Excel(name = "更新人", width = 15)
|
||||||
private java.lang.String updateBy;
|
private java.lang.String updateBy;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 更新时间
|
* 更新时间
|
||||||
*/
|
*/
|
||||||
@ApiModelProperty(value = "更新时间")
|
@Schema(description = "更新时间")
|
||||||
@Excel(name = "更新时间", width = 20, format = "yyyy-MM-dd HH:mm:ss")
|
@Excel(name = "更新时间", width = 20, format = "yyyy-MM-dd HH:mm:ss")
|
||||||
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
|
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
|
||||||
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||||
|
|||||||
@ -805,7 +805,9 @@ public class QueryGenerator {
|
|||||||
addEasyQuery(queryWrapper, name, rule, DateUtils.str2Date(dateStr,DateUtils.datetimeFormat.get()));
|
addEasyQuery(queryWrapper, name, rule, DateUtils.str2Date(dateStr,DateUtils.datetimeFormat.get()));
|
||||||
}
|
}
|
||||||
}else {
|
}else {
|
||||||
addEasyQuery(queryWrapper, name, rule, NumberUtils.parseNumber(dataRule.getRuleValue(), propertyType));
|
//update-begin---author:chenrui ---date:20241125 for:[issues/7481]多租户模式下 数据权限使用变量:#{tenant_id} 报错------------
|
||||||
|
addEasyQuery(queryWrapper, name, rule, NumberUtils.parseNumber(converRuleValue(dataRule.getRuleValue()), propertyType));
|
||||||
|
//update-end---author:chenrui ---date:20241125 for:[issues/7481]多租户模式下 数据权限使用变量:#{tenant_id} 报错------------
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -859,7 +861,9 @@ public class QueryGenerator {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
Set<String> varParams = new HashSet<String>();
|
Set<String> varParams = new HashSet<String>();
|
||||||
String regex = "\\#\\{\\w+\\}";
|
//update-begin---author:chenrui ---date:20250108 for:[QQYUN-10785]数据权限,查看自己拥有部门的权限中存在问题 #7288------------
|
||||||
|
String regex = "#\\{\\[*\\w+]*}";
|
||||||
|
//update-end---author:chenrui ---date:20250108 for:[QQYUN-10785]数据权限,查看自己拥有部门的权限中存在问题 #7288------------
|
||||||
|
|
||||||
Pattern p = Pattern.compile(regex);
|
Pattern p = Pattern.compile(regex);
|
||||||
Matcher m = p.matcher(sql);
|
Matcher m = p.matcher(sql);
|
||||||
|
|||||||
@ -54,8 +54,10 @@ public enum QueryRuleEnum {
|
|||||||
NOT_EMPTY("NOT_EMPTY","not_empty","值不为空"),
|
NOT_EMPTY("NOT_EMPTY","not_empty","值不为空"),
|
||||||
/**查询规则 不包含*/
|
/**查询规则 不包含*/
|
||||||
NOT_IN("NOT_IN","not_in","不包含"),
|
NOT_IN("NOT_IN","not_in","不包含"),
|
||||||
/**查询规则 多词匹配*/
|
/**查询规则 多词精确匹配*/
|
||||||
ELE_MATCH("ELE_MATCH","elemMatch","多词匹配"),
|
ELE_MATCH("ELE_MATCH","elemMatch","多词匹配"),
|
||||||
|
/**查询规则 多词精确不匹配*/
|
||||||
|
ELE_NOT_MATCH("ELE_NOT_MATCH","elemNotMatch","多词精确不匹配"),
|
||||||
/**查询规则 范围查询*/
|
/**查询规则 范围查询*/
|
||||||
RANGE("RANGE","range","范围查询"),
|
RANGE("RANGE","range","范围查询"),
|
||||||
/**查询规则 不在范围内查询*/
|
/**查询规则 不在范围内查询*/
|
||||||
|
|||||||
@ -5,7 +5,7 @@ import org.jeecg.common.system.vo.SysUserCacheInfo;
|
|||||||
import org.jeecg.common.util.SpringContextUtils;
|
import org.jeecg.common.util.SpringContextUtils;
|
||||||
import org.springframework.util.StringUtils;
|
import org.springframework.util.StringUtils;
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
|||||||
@ -11,10 +11,13 @@ import com.google.common.base.Joiner;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import javax.servlet.ServletResponse;
|
import java.util.Objects;
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import java.util.stream.Collectors;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
|
||||||
import javax.servlet.http.HttpSession;
|
import jakarta.servlet.ServletResponse;
|
||||||
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
|
import jakarta.servlet.http.HttpServletResponse;
|
||||||
|
import jakarta.servlet.http.HttpSession;
|
||||||
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.shiro.SecurityUtils;
|
import org.apache.shiro.SecurityUtils;
|
||||||
@ -63,7 +66,7 @@ public class JwtUtil {
|
|||||||
os.flush();
|
os.flush();
|
||||||
os.close();
|
os.close();
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
e.printStackTrace();
|
log.error(e.getMessage(), e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -82,7 +85,8 @@ public class JwtUtil {
|
|||||||
// 效验TOKEN
|
// 效验TOKEN
|
||||||
DecodedJWT jwt = verifier.verify(token);
|
DecodedJWT jwt = verifier.verify(token);
|
||||||
return true;
|
return true;
|
||||||
} catch (Exception exception) {
|
} catch (Exception e) {
|
||||||
|
log.error(e.getMessage(), e);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -97,6 +101,7 @@ public class JwtUtil {
|
|||||||
DecodedJWT jwt = JWT.decode(token);
|
DecodedJWT jwt = JWT.decode(token);
|
||||||
return jwt.getClaim("username").asString();
|
return jwt.getClaim("username").asString();
|
||||||
} catch (JWTDecodeException e) {
|
} catch (JWTDecodeException e) {
|
||||||
|
log.warn(e.getMessage(), e);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -195,6 +200,14 @@ public class JwtUtil {
|
|||||||
} else {
|
} else {
|
||||||
key = key;
|
key = key;
|
||||||
}
|
}
|
||||||
|
//update-begin---author:chenrui ---date:20250107 for:[QQYUN-10785]数据权限,查看自己拥有部门的权限中存在问题 #7288------------
|
||||||
|
// 是否存在字符串标志
|
||||||
|
boolean multiStr = false;
|
||||||
|
if(oConvertUtils.isNotEmpty(key) && key.trim().matches("^\\[\\w+]$")){
|
||||||
|
key = key.substring(1,key.length()-1);
|
||||||
|
multiStr = true;
|
||||||
|
}
|
||||||
|
//update-end---author:chenrui ---date:20250107 for:[QQYUN-10785]数据权限,查看自己拥有部门的权限中存在问题 #7288------------
|
||||||
//替换为当前系统时间(年月日)
|
//替换为当前系统时间(年月日)
|
||||||
if (key.equals(DataBaseConstant.SYS_DATE)|| key.toLowerCase().equals(DataBaseConstant.SYS_DATE_TABLE)) {
|
if (key.equals(DataBaseConstant.SYS_DATE)|| key.toLowerCase().equals(DataBaseConstant.SYS_DATE_TABLE)) {
|
||||||
returnValue = DateUtils.formatDate();
|
returnValue = DateUtils.formatDate();
|
||||||
@ -263,11 +276,22 @@ public class JwtUtil {
|
|||||||
if(user==null){
|
if(user==null){
|
||||||
//TODO 暂时使用用户登录部门,存在逻辑缺陷,不是用户所拥有的部门
|
//TODO 暂时使用用户登录部门,存在逻辑缺陷,不是用户所拥有的部门
|
||||||
returnValue = sysUser.getOrgCode();
|
returnValue = sysUser.getOrgCode();
|
||||||
|
//update-begin---author:chenrui ---date:20250107 for:[QQYUN-10785]数据权限,查看自己拥有部门的权限中存在问题 #7288------------
|
||||||
|
returnValue = multiStr ? "'" + returnValue + "'" : returnValue;
|
||||||
|
//update-end---author:chenrui ---date:20250107 for:[QQYUN-10785]数据权限,查看自己拥有部门的权限中存在问题 #7288------------
|
||||||
}else{
|
}else{
|
||||||
if(user.isOneDepart()) {
|
if(user.isOneDepart()) {
|
||||||
returnValue = user.getSysMultiOrgCode().get(0);
|
returnValue = user.getSysMultiOrgCode().get(0);
|
||||||
|
//update-begin---author:chenrui ---date:20250107 for:[QQYUN-10785]数据权限,查看自己拥有部门的权限中存在问题 #7288------------
|
||||||
|
returnValue = multiStr ? "'" + returnValue + "'" : returnValue;
|
||||||
|
//update-end---author:chenrui ---date:20250107 for:[QQYUN-10785]数据权限,查看自己拥有部门的权限中存在问题 #7288------------
|
||||||
}else {
|
}else {
|
||||||
returnValue = Joiner.on(",").join(user.getSysMultiOrgCode());
|
//update-begin---author:chenrui ---date:20250107 for:[QQYUN-10785]数据权限,查看自己拥有部门的权限中存在问题 #7288------------
|
||||||
|
returnValue = user.getSysMultiOrgCode().stream()
|
||||||
|
.filter(Objects::nonNull)
|
||||||
|
.map(orgCode -> "'" + orgCode + "'")
|
||||||
|
.collect(Collectors.joining(", "));
|
||||||
|
//update-end---author:chenrui ---date:20250107 for:[QQYUN-10785]数据权限,查看自己拥有部门的权限中存在问题 #7288------------
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -5,7 +5,7 @@ import java.util.Map;
|
|||||||
import java.util.regex.Matcher;
|
import java.util.regex.Matcher;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
|
|||||||
@ -19,7 +19,7 @@ import org.springframework.jdbc.datasource.DriverManagerDataSource;
|
|||||||
import org.springframework.util.FileCopyUtils;
|
import org.springframework.util.FileCopyUtils;
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
import javax.sql.DataSource;
|
import javax.sql.DataSource;
|
||||||
import java.io.ByteArrayInputStream;
|
import java.io.ByteArrayInputStream;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
package org.jeecg.common.util;
|
package org.jeecg.common.util;
|
||||||
|
|
||||||
|
import cn.hutool.core.collection.CollectionUtil;
|
||||||
import com.alibaba.fastjson.JSONObject;
|
import com.alibaba.fastjson.JSONObject;
|
||||||
import com.aliyuncs.DefaultAcsClient;
|
import com.aliyuncs.DefaultAcsClient;
|
||||||
import com.aliyuncs.IAcsClient;
|
import com.aliyuncs.IAcsClient;
|
||||||
@ -8,11 +9,15 @@ import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
|
|||||||
import com.aliyuncs.exceptions.ClientException;
|
import com.aliyuncs.exceptions.ClientException;
|
||||||
import com.aliyuncs.profile.DefaultProfile;
|
import com.aliyuncs.profile.DefaultProfile;
|
||||||
import com.aliyuncs.profile.IClientProfile;
|
import com.aliyuncs.profile.IClientProfile;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.jeecg.common.constant.enums.DySmsEnum;
|
import org.jeecg.common.constant.enums.DySmsEnum;
|
||||||
|
import org.jeecg.config.JeecgSmsTemplateConfig;
|
||||||
import org.jeecg.config.StaticConfig;
|
import org.jeecg.config.StaticConfig;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created on 17/6/7.
|
* Created on 17/6/7.
|
||||||
* 短信API产品的DEMO程序,工程中包含了一个SmsDemo类,直接通过
|
* 短信API产品的DEMO程序,工程中包含了一个SmsDemo类,直接通过
|
||||||
@ -76,14 +81,32 @@ public class DySmsHelper {
|
|||||||
//验证json参数
|
//验证json参数
|
||||||
validateParam(templateParamJson,dySmsEnum);
|
validateParam(templateParamJson,dySmsEnum);
|
||||||
|
|
||||||
|
//update-begin---author:wangshuai---date:2024-11-05---for:【QQYUN-9422】短信模板管理,阿里云---
|
||||||
|
String templateCode = dySmsEnum.getTemplateCode();
|
||||||
|
JeecgSmsTemplateConfig baseConfig = SpringContextUtils.getBean(JeecgSmsTemplateConfig.class);
|
||||||
|
if(baseConfig != null && CollectionUtil.isNotEmpty(baseConfig.getTemplateCode())){
|
||||||
|
Map<String, String> smsTemplate = baseConfig.getTemplateCode();
|
||||||
|
if(smsTemplate.containsKey(templateCode) && StringUtils.isNotEmpty(smsTemplate.get(templateCode))){
|
||||||
|
templateCode = smsTemplate.get(templateCode);
|
||||||
|
logger.info("yml中读取短信code{}",templateCode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//签名名称
|
||||||
|
String signName = dySmsEnum.getSignName();
|
||||||
|
if(baseConfig != null && StringUtils.isNotEmpty(baseConfig.getSignature())){
|
||||||
|
logger.info("yml中读取签名名称{}",baseConfig.getSignature());
|
||||||
|
signName = baseConfig.getSignature();
|
||||||
|
}
|
||||||
|
//update-end---author:wangshuai---date:2024-11-05---for:【QQYUN-9422】短信模板管理,阿里云---
|
||||||
|
|
||||||
//组装请求对象-具体描述见控制台-文档部分内容
|
//组装请求对象-具体描述见控制台-文档部分内容
|
||||||
SendSmsRequest request = new SendSmsRequest();
|
SendSmsRequest request = new SendSmsRequest();
|
||||||
//必填:待发送手机号
|
//必填:待发送手机号
|
||||||
request.setPhoneNumbers(phone);
|
request.setPhoneNumbers(phone);
|
||||||
//必填:短信签名-可在短信控制台中找到
|
//必填:短信签名-可在短信控制台中找到
|
||||||
request.setSignName(dySmsEnum.getSignName());
|
request.setSignName(signName);
|
||||||
//必填:短信模板-可在短信控制台中找到
|
//必填:短信模板-可在短信控制台中找到
|
||||||
request.setTemplateCode(dySmsEnum.getTemplateCode());
|
request.setTemplateCode(templateCode);
|
||||||
//可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
|
//可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
|
||||||
request.setTemplateParam(templateParamJson.toJSONString());
|
request.setTemplateParam(templateParamJson.toJSONString());
|
||||||
|
|
||||||
|
|||||||
@ -1,10 +1,10 @@
|
|||||||
package org.jeecg.common.util;
|
package org.jeecg.common.util;
|
||||||
|
|
||||||
|
import jakarta.servlet.http.HttpServletResponse;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.commons.io.FilenameUtils;
|
import org.apache.commons.io.FilenameUtils;
|
||||||
import org.jeecg.common.exception.JeecgBootException;
|
import org.jeecg.common.exception.JeecgBootException;
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletResponse;
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.net.URLConnection;
|
import java.net.URLConnection;
|
||||||
|
|||||||
@ -4,9 +4,13 @@ import com.alibaba.fastjson.JSON;
|
|||||||
import com.alibaba.fastjson.JSONObject;
|
import com.alibaba.fastjson.JSONObject;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.jeecg.common.constant.SymbolConstant;
|
||||||
import org.jeecg.common.handler.IFillRuleHandler;
|
import org.jeecg.common.handler.IFillRuleHandler;
|
||||||
|
import org.jeecg.common.system.query.QueryGenerator;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -42,6 +46,30 @@ public class FillRuleUtil {
|
|||||||
if (params == null) {
|
if (params == null) {
|
||||||
params = new JSONObject();
|
params = new JSONObject();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
HttpServletRequest request = SpringContextUtils.getHttpServletRequest();
|
||||||
|
|
||||||
|
// 解析 params 中的变量
|
||||||
|
// 优先级:queryString > 系统变量 > 默认值
|
||||||
|
for (String key : params.keySet()) {
|
||||||
|
// 1. 判断 queryString 中是否有该参数,如果有就优先取值
|
||||||
|
//noinspection ConstantValue
|
||||||
|
if (request != null) {
|
||||||
|
String parameter = request.getParameter(key);
|
||||||
|
if (oConvertUtils.isNotEmpty(parameter)) {
|
||||||
|
params.put(key, parameter);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
String value = params.getString(key);
|
||||||
|
// 2. 用于替换 系统变量的值 #{sys_user_code}
|
||||||
|
if (value != null && value.contains(SymbolConstant.SYS_VAR_PREFIX)) {
|
||||||
|
value = QueryGenerator.getSqlRuleValue(value);
|
||||||
|
params.put(key, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (formData == null) {
|
if (formData == null) {
|
||||||
formData = new JSONObject();
|
formData = new JSONObject();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
package org.jeecg.common.util;
|
package org.jeecg.common.util;
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
|
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.jeecg.common.constant.CommonConstant;
|
import org.jeecg.common.constant.CommonConstant;
|
||||||
|
|||||||
@ -57,8 +57,8 @@ public class RestUtil {
|
|||||||
|
|
||||||
static {
|
static {
|
||||||
SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
|
SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
|
||||||
requestFactory.setConnectTimeout(3000);
|
requestFactory.setConnectTimeout(30000);
|
||||||
requestFactory.setReadTimeout(3000);
|
requestFactory.setReadTimeout(30000);
|
||||||
RT = new RestTemplate(requestFactory);
|
RT = new RestTemplate(requestFactory);
|
||||||
// 解决乱码问题
|
// 解决乱码问题
|
||||||
RT.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));
|
RT.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
package org.jeecg.common.util;
|
package org.jeecg.common.util;
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import jakarta.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
import org.jeecg.common.constant.CommonConstant;
|
import org.jeecg.common.constant.CommonConstant;
|
||||||
import org.jeecg.common.constant.ServiceNameConstants;
|
import org.jeecg.common.constant.ServiceNameConstants;
|
||||||
|
|||||||
@ -11,7 +11,7 @@ import org.jeecg.common.exception.JeecgBoot401Exception;
|
|||||||
import org.jeecg.common.system.util.JwtUtil;
|
import org.jeecg.common.system.util.JwtUtil;
|
||||||
import org.jeecg.common.system.vo.LoginUser;
|
import org.jeecg.common.system.vo.LoginUser;
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @Author scott
|
* @Author scott
|
||||||
|
|||||||
@ -84,6 +84,10 @@ public class DynamicDBUtil {
|
|||||||
} else {
|
} else {
|
||||||
DruidDataSource dataSource = getJdbcDataSource(dbSource);
|
DruidDataSource dataSource = getJdbcDataSource(dbSource);
|
||||||
if(dataSource!=null && dataSource.isEnable()){
|
if(dataSource!=null && dataSource.isEnable()){
|
||||||
|
|
||||||
|
// 【TV360X-2060】设置超时时间 6秒
|
||||||
|
dataSource.setMaxWait(6000);
|
||||||
|
|
||||||
DataSourceCachePool.putCacheBasicDataSource(dbKey, dataSource);
|
DataSourceCachePool.putCacheBasicDataSource(dbKey, dataSource);
|
||||||
}else{
|
}else{
|
||||||
throw new JeecgBootException("动态数据源连接失败,dbKey:"+dbKey);
|
throw new JeecgBootException("动态数据源连接失败,dbKey:"+dbKey);
|
||||||
@ -106,9 +110,10 @@ public class DynamicDBUtil {
|
|||||||
dataSource.getConnection().commit();
|
dataSource.getConnection().commit();
|
||||||
dataSource.getConnection().close();
|
dataSource.getConnection().close();
|
||||||
dataSource.close();
|
dataSource.close();
|
||||||
|
DataSourceCachePool.removeCache(dbKey);
|
||||||
}
|
}
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
e.printStackTrace();
|
log.warn(e.getMessage(), e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
package org.jeecg.common.util.encryption;
|
package org.jeecg.common.util.encryption;
|
||||||
|
|
||||||
import org.apache.shiro.codec.Base64;
|
import org.apache.shiro.lang.codec.Base64;
|
||||||
|
|
||||||
import javax.crypto.Cipher;
|
import javax.crypto.Cipher;
|
||||||
import javax.crypto.spec.IvParameterSpec;
|
import javax.crypto.spec.IvParameterSpec;
|
||||||
|
|||||||
@ -9,7 +9,7 @@ import org.jeecg.common.constant.CommonConstant;
|
|||||||
import org.jeecg.common.constant.SymbolConstant;
|
import org.jeecg.common.constant.SymbolConstant;
|
||||||
import org.springframework.beans.BeanUtils;
|
import org.springframework.beans.BeanUtils;
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.UnsupportedEncodingException;
|
import java.io.UnsupportedEncodingException;
|
||||||
@ -463,7 +463,7 @@ public class oConvertUtils {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
String[] childs = childArray.toArray(new String[]{});
|
String[] childs = (String[]) childArray.toArray();
|
||||||
for (String v : childs) {
|
for (String v : childs) {
|
||||||
if (!isIn(v, all)) {
|
if (!isIn(v, all)) {
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@ -73,6 +73,12 @@ public class JSqlParserUtils {
|
|||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
private static SelectSqlInfo parseBySelectBody(SelectBody selectBody) {
|
private static SelectSqlInfo parseBySelectBody(SelectBody selectBody) {
|
||||||
|
// 判断是否使用了union等操作
|
||||||
|
if (selectBody instanceof SetOperationList) {
|
||||||
|
// 如果使用了union等操作,则只解析第一个查询
|
||||||
|
List<SelectBody> selectBodyList = ((SetOperationList) selectBody).getSelects();
|
||||||
|
return JSqlParserUtils.parseBySelectBody(selectBodyList.get(0));
|
||||||
|
}
|
||||||
// 简单的select查询
|
// 简单的select查询
|
||||||
if (selectBody instanceof PlainSelect) {
|
if (selectBody instanceof PlainSelect) {
|
||||||
SelectSqlInfo sqlInfo = new SelectSqlInfo(selectBody);
|
SelectSqlInfo sqlInfo = new SelectSqlInfo(selectBody);
|
||||||
|
|||||||
@ -3,7 +3,7 @@ package org.jeecg.config;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
|
|
||||||
import org.jeecg.common.api.CommonAPI;
|
import org.jeecg.common.api.CommonAPI;
|
||||||
import org.jeecg.common.system.vo.DictModel;
|
import org.jeecg.common.system.vo.DictModel;
|
||||||
|
|||||||
@ -2,7 +2,9 @@ package org.jeecg.config;
|
|||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
import javax.servlet.*;
|
import com.alibaba.druid.spring.boot3.autoconfigure.DruidDataSourceAutoConfigure;
|
||||||
|
import com.alibaba.druid.spring.boot3.autoconfigure.properties.DruidStatProperties;
|
||||||
|
import jakarta.servlet.*;
|
||||||
|
|
||||||
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
|
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
|
||||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||||
@ -11,8 +13,6 @@ import org.springframework.boot.web.servlet.FilterRegistrationBean;
|
|||||||
import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.Bean;
|
||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
|
||||||
import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure;
|
|
||||||
import com.alibaba.druid.spring.boot.autoconfigure.properties.DruidStatProperties;
|
|
||||||
import com.alibaba.druid.util.Utils;
|
import com.alibaba.druid.util.Utils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -12,6 +12,7 @@ import java.util.HashMap;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* @author eightmonth@qq.com
|
||||||
* 启动程序修改DruidWallConfig配置
|
* 启动程序修改DruidWallConfig配置
|
||||||
* 允许SELECT语句的WHERE子句是一个永真条件
|
* 允许SELECT语句的WHERE子句是一个永真条件
|
||||||
* @author eightmonth
|
* @author eightmonth
|
||||||
|
|||||||
@ -0,0 +1,33 @@
|
|||||||
|
package org.jeecg.config;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
import org.springframework.boot.context.properties.ConfigurationProperties;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Description: 短信模板
|
||||||
|
*
|
||||||
|
* @author: wangshuai
|
||||||
|
* @date: 2024/11/5 下午3:44
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@Component("jeecgSmsTemplateConfig")
|
||||||
|
@ConfigurationProperties(prefix = "jeecg.oss.sms-template")
|
||||||
|
public class JeecgSmsTemplateConfig {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 短信签名
|
||||||
|
*/
|
||||||
|
private String signature;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 短信模板code
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private Map<String,String> templateCode;
|
||||||
|
|
||||||
|
}
|
||||||
@ -21,6 +21,12 @@ public class StaticConfig {
|
|||||||
@Value(value = "${spring.mail.username:}")
|
@Value(value = "${spring.mail.username:}")
|
||||||
private String emailFrom;
|
private String emailFrom;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否开启定时发送
|
||||||
|
*/
|
||||||
|
@Value(value = "${spring.mail.timeJobSend:false}")
|
||||||
|
private Boolean timeJobSend;
|
||||||
|
|
||||||
// /**
|
// /**
|
||||||
// * 签名密钥串
|
// * 签名密钥串
|
||||||
// */
|
// */
|
||||||
|
|||||||
@ -1,188 +1,188 @@
|
|||||||
package org.jeecg.config;
|
//package org.jeecg.config;
|
||||||
|
//
|
||||||
|
//
|
||||||
import io.swagger.annotations.ApiOperation;
|
//import io.swagger.annotations.ApiOperation;
|
||||||
import org.jeecg.common.constant.CommonConstant;
|
//import org.jeecg.common.constant.CommonConstant;
|
||||||
import org.jeecg.config.mybatis.MybatisPlusSaasConfig;
|
//import org.jeecg.config.mybatis.MybatisPlusSaasConfig;
|
||||||
import org.springframework.beans.BeansException;
|
//import org.springframework.beans.BeansException;
|
||||||
import org.springframework.beans.factory.config.BeanPostProcessor;
|
//import org.springframework.beans.factory.config.BeanPostProcessor;
|
||||||
import org.springframework.context.annotation.Bean;
|
//import org.springframework.context.annotation.Bean;
|
||||||
import org.springframework.context.annotation.Configuration;
|
//import org.springframework.context.annotation.Configuration;
|
||||||
import org.springframework.context.annotation.Import;
|
//import org.springframework.context.annotation.Import;
|
||||||
import org.springframework.util.ReflectionUtils;
|
//import org.springframework.util.ReflectionUtils;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
//import org.springframework.web.bind.annotation.RestController;
|
||||||
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
|
//import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
|
||||||
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
|
//import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
|
||||||
import org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping;
|
//import org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping;
|
||||||
import springfox.bean.validators.configuration.BeanValidatorPluginsConfiguration;
|
//import springfox.bean.validators.configuration.BeanValidatorPluginsConfiguration;
|
||||||
import springfox.documentation.builders.ApiInfoBuilder;
|
//import springfox.documentation.builders.ApiInfoBuilder;
|
||||||
import springfox.documentation.builders.ParameterBuilder;
|
//import springfox.documentation.builders.ParameterBuilder;
|
||||||
import springfox.documentation.builders.PathSelectors;
|
//import springfox.documentation.builders.PathSelectors;
|
||||||
import springfox.documentation.builders.RequestHandlerSelectors;
|
//import springfox.documentation.builders.RequestHandlerSelectors;
|
||||||
import springfox.documentation.schema.ModelRef;
|
//import springfox.documentation.schema.ModelRef;
|
||||||
import springfox.documentation.service.*;
|
//import springfox.documentation.service.*;
|
||||||
import springfox.documentation.spi.DocumentationType;
|
//import springfox.documentation.spi.DocumentationType;
|
||||||
import springfox.documentation.spi.service.contexts.SecurityContext;
|
//import springfox.documentation.spi.service.contexts.SecurityContext;
|
||||||
import springfox.documentation.spring.web.plugins.Docket;
|
//import springfox.documentation.spring.web.plugins.Docket;
|
||||||
import springfox.documentation.spring.web.plugins.WebMvcRequestHandlerProvider;
|
//import springfox.documentation.spring.web.plugins.WebMvcRequestHandlerProvider;
|
||||||
import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc;
|
//import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc;
|
||||||
|
//
|
||||||
import java.lang.reflect.Field;
|
//import java.lang.reflect.Field;
|
||||||
import java.util.ArrayList;
|
//import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
//import java.util.Collections;
|
||||||
import java.util.List;
|
//import java.util.List;
|
||||||
import java.util.stream.Collectors;
|
//import java.util.stream.Collectors;
|
||||||
|
//
|
||||||
/**
|
///**
|
||||||
* @Author scott
|
// * @Author scott
|
||||||
*/
|
// */
|
||||||
@Configuration
|
//@Configuration
|
||||||
@EnableSwagger2WebMvc
|
//@EnableSwagger2WebMvc
|
||||||
@Import(BeanValidatorPluginsConfiguration.class)
|
//@Import(BeanValidatorPluginsConfiguration.class)
|
||||||
public class Swagger2Config implements WebMvcConfigurer {
|
//public class Swagger2Config implements WebMvcConfigurer {
|
||||||
|
//
|
||||||
/**
|
// /**
|
||||||
*
|
// *
|
||||||
* 显示swagger-ui.html文档展示页,还必须注入swagger资源:
|
// * 显示swagger-ui.html文档展示页,还必须注入swagger资源:
|
||||||
*
|
// *
|
||||||
* @param registry
|
// * @param registry
|
||||||
*/
|
// */
|
||||||
@Override
|
// @Override
|
||||||
public void addResourceHandlers(ResourceHandlerRegistry registry) {
|
// public void addResourceHandlers(ResourceHandlerRegistry registry) {
|
||||||
registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");
|
// registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");
|
||||||
registry.addResourceHandler("doc.html").addResourceLocations("classpath:/META-INF/resources/");
|
// registry.addResourceHandler("doc.html").addResourceLocations("classpath:/META-INF/resources/");
|
||||||
registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
|
// registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
/**
|
// /**
|
||||||
* swagger2的配置文件,这里可以配置swagger2的一些基本的内容,比如扫描的包等等
|
// * swagger2的配置文件,这里可以配置swagger2的一些基本的内容,比如扫描的包等等
|
||||||
*
|
// *
|
||||||
* @return Docket
|
// * @return Docket
|
||||||
*/
|
// */
|
||||||
@Bean(value = "defaultApi2")
|
// @Bean(value = "defaultApi2")
|
||||||
public Docket defaultApi2() {
|
// public Docket defaultApi2() {
|
||||||
return new Docket(DocumentationType.SWAGGER_2)
|
// return new Docket(DocumentationType.SWAGGER_2)
|
||||||
.apiInfo(apiInfo())
|
// .apiInfo(apiInfo())
|
||||||
.select()
|
// .select()
|
||||||
//此包路径下的类,才生成接口文档
|
// //此包路径下的类,才生成接口文档
|
||||||
.apis(RequestHandlerSelectors.basePackage("org.jeecg"))
|
// .apis(RequestHandlerSelectors.basePackage("org.jeecg"))
|
||||||
//加了ApiOperation注解的类,才生成接口文档
|
// //加了ApiOperation注解的类,才生成接口文档
|
||||||
.apis(RequestHandlerSelectors.withClassAnnotation(RestController.class))
|
// .apis(RequestHandlerSelectors.withClassAnnotation(RestController.class))
|
||||||
.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
|
// .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
|
||||||
.paths(PathSelectors.any())
|
// .paths(PathSelectors.any())
|
||||||
.build()
|
// .build()
|
||||||
.securitySchemes(Collections.singletonList(securityScheme()))
|
// .securitySchemes(Collections.singletonList(securityScheme()))
|
||||||
.securityContexts(securityContexts())
|
// .securityContexts(securityContexts())
|
||||||
.globalOperationParameters(setHeaderToken());
|
// .globalOperationParameters(setHeaderToken());
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
/***
|
// /***
|
||||||
* oauth2配置
|
// * oauth2配置
|
||||||
* 需要增加swagger授权回调地址
|
// * 需要增加swagger授权回调地址
|
||||||
* http://localhost:8888/webjars/springfox-swagger-ui/o2c.html
|
// * http://localhost:8888/webjars/springfox-swagger-ui/o2c.html
|
||||||
* @return
|
// * @return
|
||||||
*/
|
// */
|
||||||
@Bean
|
// @Bean
|
||||||
SecurityScheme securityScheme() {
|
// SecurityScheme securityScheme() {
|
||||||
return new ApiKey(CommonConstant.X_ACCESS_TOKEN, CommonConstant.X_ACCESS_TOKEN, "header");
|
// return new ApiKey(CommonConstant.X_ACCESS_TOKEN, CommonConstant.X_ACCESS_TOKEN, "header");
|
||||||
}
|
// }
|
||||||
/**
|
// /**
|
||||||
* JWT token
|
// * JWT token
|
||||||
* @return
|
// * @return
|
||||||
*/
|
// */
|
||||||
private List<Parameter> setHeaderToken() {
|
// private List<Parameter> setHeaderToken() {
|
||||||
ParameterBuilder tokenPar = new ParameterBuilder();
|
// ParameterBuilder tokenPar = new ParameterBuilder();
|
||||||
List<Parameter> pars = new ArrayList<>();
|
// List<Parameter> pars = new ArrayList<>();
|
||||||
tokenPar.name(CommonConstant.X_ACCESS_TOKEN).description("token").modelRef(new ModelRef("string")).parameterType("header").required(false).build();
|
// tokenPar.name(CommonConstant.X_ACCESS_TOKEN).description("token").modelRef(new ModelRef("string")).parameterType("header").required(false).build();
|
||||||
pars.add(tokenPar.build());
|
// pars.add(tokenPar.build());
|
||||||
//update-begin-author:liusq---date:2024-08-15--for: 开启多租户时,全局参数增加租户id
|
// //update-begin-author:liusq---date:2024-08-15--for: 开启多租户时,全局参数增加租户id
|
||||||
if(MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL){
|
// if(MybatisPlusSaasConfig.OPEN_SYSTEM_TENANT_CONTROL){
|
||||||
ParameterBuilder tenantPar = new ParameterBuilder();
|
// ParameterBuilder tenantPar = new ParameterBuilder();
|
||||||
tenantPar.name(CommonConstant.TENANT_ID).description("租户ID").modelRef(new ModelRef("string")).parameterType("header").required(false).build();
|
// tenantPar.name(CommonConstant.TENANT_ID).description("租户ID").modelRef(new ModelRef("string")).parameterType("header").required(false).build();
|
||||||
pars.add(tenantPar.build());
|
// pars.add(tenantPar.build());
|
||||||
}
|
// }
|
||||||
//update-end-author:liusq---date:2024-08-15--for: 开启多租户时,全局参数增加租户id
|
// //update-end-author:liusq---date:2024-08-15--for: 开启多租户时,全局参数增加租户id
|
||||||
|
//
|
||||||
return pars;
|
// return pars;
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
/**
|
// /**
|
||||||
* api文档的详细信息函数,注意这里的注解引用的是哪个
|
// * api文档的详细信息函数,注意这里的注解引用的是哪个
|
||||||
*
|
// *
|
||||||
* @return
|
// * @return
|
||||||
*/
|
// */
|
||||||
private ApiInfo apiInfo() {
|
// private ApiInfo apiInfo() {
|
||||||
return new ApiInfoBuilder()
|
// return new ApiInfoBuilder()
|
||||||
// //大标题
|
// // //大标题
|
||||||
.title("JeecgBoot 后台服务API接口文档")
|
// .title("JeecgBoot 后台服务API接口文档")
|
||||||
// 版本号
|
// // 版本号
|
||||||
.version("1.0")
|
// .version("1.0")
|
||||||
// .termsOfServiceUrl("NO terms of service")
|
//// .termsOfServiceUrl("NO terms of service")
|
||||||
// 描述
|
// // 描述
|
||||||
.description("后台API接口")
|
// .description("后台API接口")
|
||||||
// 作者
|
// // 作者
|
||||||
.contact(new Contact("北京国炬信息技术有限公司","www.jeccg.com","jeecgos@163.com"))
|
// .contact(new Contact("北京国炬信息技术有限公司","www.jeccg.com","jeecgos@163.com"))
|
||||||
.license("The Apache License, Version 2.0")
|
// .license("The Apache License, Version 2.0")
|
||||||
.licenseUrl("http://www.apache.org/licenses/LICENSE-2.0.html")
|
// .licenseUrl("http://www.apache.org/licenses/LICENSE-2.0.html")
|
||||||
.build();
|
// .build();
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
/**
|
// /**
|
||||||
* 新增 securityContexts 保持登录状态
|
// * 新增 securityContexts 保持登录状态
|
||||||
*/
|
// */
|
||||||
private List<SecurityContext> securityContexts() {
|
// private List<SecurityContext> securityContexts() {
|
||||||
return new ArrayList(
|
// return new ArrayList(
|
||||||
Collections.singleton(SecurityContext.builder()
|
// Collections.singleton(SecurityContext.builder()
|
||||||
.securityReferences(defaultAuth())
|
// .securityReferences(defaultAuth())
|
||||||
.forPaths(PathSelectors.regex("^(?!auth).*$"))
|
// .forPaths(PathSelectors.regex("^(?!auth).*$"))
|
||||||
.build())
|
// .build())
|
||||||
);
|
// );
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
private List<SecurityReference> defaultAuth() {
|
// private List<SecurityReference> defaultAuth() {
|
||||||
AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
|
// AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
|
||||||
AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
|
// AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
|
||||||
authorizationScopes[0] = authorizationScope;
|
// authorizationScopes[0] = authorizationScope;
|
||||||
return new ArrayList(
|
// return new ArrayList(
|
||||||
Collections.singleton(new SecurityReference(CommonConstant.X_ACCESS_TOKEN, authorizationScopes)));
|
// Collections.singleton(new SecurityReference(CommonConstant.X_ACCESS_TOKEN, authorizationScopes)));
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
/**
|
// /**
|
||||||
* 解决springboot2.6 和springfox不兼容问题
|
// * 解决springboot2.6 和springfox不兼容问题
|
||||||
* @return
|
// * @return
|
||||||
*/
|
// */
|
||||||
@Bean
|
// @Bean
|
||||||
public static BeanPostProcessor springfoxHandlerProviderBeanPostProcessor() {
|
// public static BeanPostProcessor springfoxHandlerProviderBeanPostProcessor() {
|
||||||
return new BeanPostProcessor() {
|
// return new BeanPostProcessor() {
|
||||||
|
//
|
||||||
@Override
|
// @Override
|
||||||
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
|
// public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
|
||||||
if (bean instanceof WebMvcRequestHandlerProvider) {
|
// if (bean instanceof WebMvcRequestHandlerProvider) {
|
||||||
customizeSpringfoxHandlerMappings(getHandlerMappings(bean));
|
// customizeSpringfoxHandlerMappings(getHandlerMappings(bean));
|
||||||
}
|
// }
|
||||||
return bean;
|
// return bean;
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
private <T extends RequestMappingInfoHandlerMapping> void customizeSpringfoxHandlerMappings(List<T> mappings) {
|
// private <T extends RequestMappingInfoHandlerMapping> void customizeSpringfoxHandlerMappings(List<T> mappings) {
|
||||||
List<T> copy = mappings.stream()
|
// List<T> copy = mappings.stream()
|
||||||
.filter(mapping -> mapping.getPatternParser() == null)
|
// .filter(mapping -> mapping.getPatternParser() == null)
|
||||||
.collect(Collectors.toList());
|
// .collect(Collectors.toList());
|
||||||
mappings.clear();
|
// mappings.clear();
|
||||||
mappings.addAll(copy);
|
// mappings.addAll(copy);
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
@SuppressWarnings("unchecked")
|
// @SuppressWarnings("unchecked")
|
||||||
private List<RequestMappingInfoHandlerMapping> getHandlerMappings(Object bean) {
|
// private List<RequestMappingInfoHandlerMapping> getHandlerMappings(Object bean) {
|
||||||
try {
|
// try {
|
||||||
Field field = ReflectionUtils.findField(bean.getClass(), "handlerMappings");
|
// Field field = ReflectionUtils.findField(bean.getClass(), "handlerMappings");
|
||||||
field.setAccessible(true);
|
// field.setAccessible(true);
|
||||||
return (List<RequestMappingInfoHandlerMapping>) field.get(bean);
|
// return (List<RequestMappingInfoHandlerMapping>) field.get(bean);
|
||||||
} catch (IllegalArgumentException | IllegalAccessException e) {
|
// } catch (IllegalArgumentException | IllegalAccessException e) {
|
||||||
throw new IllegalStateException(e);
|
// throw new IllegalStateException(e);
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
};
|
// };
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
}
|
//}
|
||||||
|
|||||||
@ -0,0 +1,102 @@
|
|||||||
|
package org.jeecg.config;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.Operation;
|
||||||
|
import io.swagger.v3.oas.models.Components;
|
||||||
|
import io.swagger.v3.oas.models.OpenAPI;
|
||||||
|
import io.swagger.v3.oas.models.info.Contact;
|
||||||
|
import io.swagger.v3.oas.models.info.Info;
|
||||||
|
import io.swagger.v3.oas.models.info.License;
|
||||||
|
import io.swagger.v3.oas.models.security.SecurityRequirement;
|
||||||
|
import io.swagger.v3.oas.models.security.SecurityScheme;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.jeecg.common.constant.CommonConstant;
|
||||||
|
import org.springdoc.core.customizers.GlobalOpenApiCustomizer;
|
||||||
|
import org.springdoc.core.filters.GlobalOpenApiMethodFilter;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
import org.springframework.context.annotation.PropertySource;
|
||||||
|
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
|
||||||
|
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author eightmonth
|
||||||
|
*/
|
||||||
|
@Slf4j
|
||||||
|
@Configuration
|
||||||
|
@PropertySource("classpath:config/default-spring-doc.properties")
|
||||||
|
public class Swagger3Config implements WebMvcConfigurer {
|
||||||
|
// 定义不需要注入安全要求的路径集合
|
||||||
|
Set<String> excludedPaths = new HashSet<>(Arrays.asList(
|
||||||
|
"/sys/randomImage/{key}",
|
||||||
|
"/sys/login",
|
||||||
|
"/sys/phoneLogin",
|
||||||
|
"/sys/mLogin",
|
||||||
|
"/sys/sms",
|
||||||
|
"/sys/cas/client/validateLogin",
|
||||||
|
"/test/jeecgDemo/demo3",
|
||||||
|
"/sys/thirdLogin/**",
|
||||||
|
"/sys/user/register"
|
||||||
|
));
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* 显示swagger-ui.html文档展示页,还必须注入swagger资源:
|
||||||
|
*
|
||||||
|
* @param registry
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void addResourceHandlers(ResourceHandlerRegistry registry) {
|
||||||
|
registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");
|
||||||
|
registry.addResourceHandler("doc.html").addResourceLocations("classpath:/META-INF/resources/");
|
||||||
|
registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public GlobalOpenApiMethodFilter globalOpenApiMethodFilter() {
|
||||||
|
return method -> method.isAnnotationPresent(Operation.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public GlobalOpenApiCustomizer globalOpenApiCustomizer() {
|
||||||
|
return openApi -> {
|
||||||
|
// 全局添加鉴权参数
|
||||||
|
if (openApi.getPaths() != null) {
|
||||||
|
openApi.getPaths().forEach((path, pathItem) -> {
|
||||||
|
log.info("path: {}", path);
|
||||||
|
// 检查当前路径是否在排除列表中
|
||||||
|
boolean isExcluded = excludedPaths.stream().anyMatch(excludedPath ->
|
||||||
|
excludedPath.equals(path) ||
|
||||||
|
(excludedPath.endsWith("**") && path.startsWith(excludedPath.substring(0, excludedPath.length() - 2)))
|
||||||
|
);
|
||||||
|
|
||||||
|
if (!isExcluded) {
|
||||||
|
// 接口添加鉴权参数
|
||||||
|
pathItem.readOperations()
|
||||||
|
.forEach(operation ->
|
||||||
|
operation.addSecurityItem(new SecurityRequirement().addList(CommonConstant.X_ACCESS_TOKEN))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public OpenAPI customOpenAPI() {
|
||||||
|
return new OpenAPI()
|
||||||
|
.info(new Info()
|
||||||
|
.title("JeecgBoot 后台服务API接口文档")
|
||||||
|
.version("3.7.4")
|
||||||
|
.contact(new Contact().name("北京国炬信息技术有限公司").url("www.jeccg.com").email("jeecgos@163.com"))
|
||||||
|
.description( "后台API接口")
|
||||||
|
.termsOfService("NO terms of service")
|
||||||
|
.license(new License().name("Apache 2.0").url("http://www.apache.org/licenses/LICENSE-2.0.html")))
|
||||||
|
.addSecurityItem(new SecurityRequirement().addList(CommonConstant.X_ACCESS_TOKEN))
|
||||||
|
.components(new Components().addSecuritySchemes(CommonConstant.X_ACCESS_TOKEN,
|
||||||
|
new SecurityScheme().name(CommonConstant.X_ACCESS_TOKEN).type(SecurityScheme.Type.HTTP)));
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,19 @@
|
|||||||
|
package org.jeecg.config;
|
||||||
|
|
||||||
|
import io.undertow.server.DefaultByteBufferPool;
|
||||||
|
import io.undertow.websockets.jsr.WebSocketDeploymentInfo;
|
||||||
|
import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
|
||||||
|
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
public class UndertowCustomizer implements WebServerFactoryCustomizer<UndertowServletWebServerFactory> {
|
||||||
|
@Override
|
||||||
|
public void customize(UndertowServletWebServerFactory factory) {
|
||||||
|
factory.addDeploymentInfoCustomizers(deploymentInfo -> {
|
||||||
|
WebSocketDeploymentInfo webSocketDeploymentInfo = new WebSocketDeploymentInfo();
|
||||||
|
webSocketDeploymentInfo.setBuffers(new DefaultByteBufferPool(false, 1024));
|
||||||
|
deploymentInfo.addServletContextAttribute("io.undertow.websockets.jsr.WebSocketDeploymentInfo", webSocketDeploymentInfo);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -11,16 +11,20 @@ import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
|
|||||||
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
|
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
|
||||||
import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer;
|
import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer;
|
||||||
import io.micrometer.prometheus.PrometheusMeterRegistry;
|
import io.micrometer.prometheus.PrometheusMeterRegistry;
|
||||||
|
import jakarta.annotation.Resource;
|
||||||
import org.springframework.beans.factory.InitializingBean;
|
import org.springframework.beans.factory.InitializingBean;
|
||||||
|
import org.springframework.beans.factory.ObjectProvider;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
import org.springframework.beans.factory.config.BeanPostProcessor;
|
import org.springframework.beans.factory.config.BeanPostProcessor;
|
||||||
import org.springframework.boot.actuate.trace.http.InMemoryHttpTraceRepository;
|
import org.springframework.boot.actuate.web.exchanges.InMemoryHttpExchangeRepository;
|
||||||
|
import org.springframework.boot.autoconfigure.jackson.JacksonProperties;
|
||||||
import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.Bean;
|
||||||
import org.springframework.context.annotation.Conditional;
|
import org.springframework.context.annotation.Conditional;
|
||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
import org.springframework.context.annotation.Primary;
|
import org.springframework.context.annotation.Primary;
|
||||||
import org.springframework.http.converter.HttpMessageConverter;
|
import org.springframework.http.converter.HttpMessageConverter;
|
||||||
|
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
|
||||||
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
|
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
|
||||||
import org.springframework.web.cors.CorsConfiguration;
|
import org.springframework.web.cors.CorsConfiguration;
|
||||||
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
|
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
|
||||||
@ -30,7 +34,6 @@ import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry
|
|||||||
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
|
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
|
||||||
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
|
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
import java.time.LocalDate;
|
import java.time.LocalDate;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
|
|||||||
@ -31,7 +31,7 @@ public class WebSocketConfig {
|
|||||||
FilterRegistrationBean bean = new FilterRegistrationBean();
|
FilterRegistrationBean bean = new FilterRegistrationBean();
|
||||||
bean.setFilter(websocketFilter());
|
bean.setFilter(websocketFilter());
|
||||||
//TODO 临时注释掉,测试下线上socket总断的问题
|
//TODO 临时注释掉,测试下线上socket总断的问题
|
||||||
bean.addUrlPatterns("/taskCountSocket/*", "/websocket/*","/eoaSocket/*","/eoaNewChatSocket/*", "/newsWebsocket/*", "/vxeSocket/*");
|
bean.addUrlPatterns("/taskCountSocket/*", "/websocket/*","/eoaSocket/*","/eoaNewChatSocket/*", "/newsWebsocket/*", "/dragChannelSocket/*", "/vxeSocket/*");
|
||||||
return bean;
|
return bean;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -3,8 +3,8 @@ package org.jeecg.config.filter;
|
|||||||
import org.jeecg.common.constant.CommonConstant;
|
import org.jeecg.common.constant.CommonConstant;
|
||||||
import org.jeecg.config.sign.util.BodyReaderHttpServletRequestWrapper;
|
import org.jeecg.config.sign.util.BodyReaderHttpServletRequestWrapper;
|
||||||
|
|
||||||
import javax.servlet.*;
|
import jakarta.servlet.*;
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -7,9 +7,9 @@ import org.jeecg.common.util.SpringContextUtils;
|
|||||||
import org.jeecg.common.util.TokenUtils;
|
import org.jeecg.common.util.TokenUtils;
|
||||||
import org.jeecg.common.util.oConvertUtils;
|
import org.jeecg.common.util.oConvertUtils;
|
||||||
|
|
||||||
import javax.servlet.*;
|
import jakarta.servlet.*;
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import jakarta.servlet.http.HttpServletResponse;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -17,9 +17,9 @@ import org.springframework.beans.factory.annotation.Autowired;
|
|||||||
import org.springframework.util.AntPathMatcher;
|
import org.springframework.util.AntPathMatcher;
|
||||||
import org.springframework.web.servlet.HandlerInterceptor;
|
import org.springframework.web.servlet.HandlerInterceptor;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import jakarta.servlet.http.HttpServletResponse;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.PrintWriter;
|
import java.io.PrintWriter;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|||||||
@ -11,7 +11,7 @@ import org.jeecg.common.util.SpringContextUtils;
|
|||||||
import org.jeecg.config.mybatis.ThreadLocalDataHelper;
|
import org.jeecg.config.mybatis.ThreadLocalDataHelper;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -6,8 +6,8 @@ import org.apache.commons.lang3.StringUtils;
|
|||||||
import org.springframework.web.servlet.HandlerInterceptor;
|
import org.springframework.web.servlet.HandlerInterceptor;
|
||||||
import org.springframework.web.servlet.ModelAndView;
|
import org.springframework.web.servlet.ModelAndView;
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import jakarta.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 动态数据源切换拦截器
|
* 动态数据源切换拦截器
|
||||||
|
|||||||
@ -1,6 +1,5 @@
|
|||||||
package org.jeecg.config.shiro;
|
package org.jeecg.config.shiro;
|
||||||
|
|
||||||
import lombok.SneakyThrows;
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
|
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
|
||||||
import org.apache.shiro.mgt.DefaultSessionStorageEvaluator;
|
import org.apache.shiro.mgt.DefaultSessionStorageEvaluator;
|
||||||
@ -33,9 +32,9 @@ import org.springframework.web.filter.DelegatingFilterProxy;
|
|||||||
import redis.clients.jedis.HostAndPort;
|
import redis.clients.jedis.HostAndPort;
|
||||||
import redis.clients.jedis.JedisCluster;
|
import redis.clients.jedis.JedisCluster;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
import javax.servlet.DispatcherType;
|
import jakarta.servlet.Filter;
|
||||||
import javax.servlet.Filter;
|
import jakarta.servlet.DispatcherType;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
@ -127,13 +126,15 @@ public class ShiroConfig {
|
|||||||
filterChainDefinitionMap.put("/**/*.ttf", "anon");
|
filterChainDefinitionMap.put("/**/*.ttf", "anon");
|
||||||
filterChainDefinitionMap.put("/**/*.woff", "anon");
|
filterChainDefinitionMap.put("/**/*.woff", "anon");
|
||||||
filterChainDefinitionMap.put("/**/*.woff2", "anon");
|
filterChainDefinitionMap.put("/**/*.woff2", "anon");
|
||||||
|
filterChainDefinitionMap.put("/**/*.glb", "anon");
|
||||||
|
filterChainDefinitionMap.put("/**/*.wasm", "anon");
|
||||||
//update-end--Author:scott Date:20221116 for:排除静态资源后缀
|
//update-end--Author:scott Date:20221116 for:排除静态资源后缀
|
||||||
|
|
||||||
filterChainDefinitionMap.put("/druid/**", "anon");
|
filterChainDefinitionMap.put("/druid/**", "anon");
|
||||||
filterChainDefinitionMap.put("/swagger-ui.html", "anon");
|
filterChainDefinitionMap.put("/swagger-ui.html", "anon");
|
||||||
filterChainDefinitionMap.put("/swagger**/**", "anon");
|
filterChainDefinitionMap.put("/swagger**/**", "anon");
|
||||||
filterChainDefinitionMap.put("/webjars/**", "anon");
|
filterChainDefinitionMap.put("/webjars/**", "anon");
|
||||||
filterChainDefinitionMap.put("/v2/**", "anon");
|
filterChainDefinitionMap.put("/v3/**", "anon");
|
||||||
|
|
||||||
// update-begin--Author:sunjianlei Date:20210510 for:排除消息通告查看详情页面(用于第三方APP)
|
// update-begin--Author:sunjianlei Date:20210510 for:排除消息通告查看详情页面(用于第三方APP)
|
||||||
filterChainDefinitionMap.put("/sys/annountCement/show/**", "anon");
|
filterChainDefinitionMap.put("/sys/annountCement/show/**", "anon");
|
||||||
@ -144,12 +145,18 @@ public class ShiroConfig {
|
|||||||
filterChainDefinitionMap.put("/**/*.js.map", "anon");
|
filterChainDefinitionMap.put("/**/*.js.map", "anon");
|
||||||
filterChainDefinitionMap.put("/**/*.css.map", "anon");
|
filterChainDefinitionMap.put("/**/*.css.map", "anon");
|
||||||
|
|
||||||
//拖拽仪表盘设计器排除
|
//积木BI大屏和仪表盘排除
|
||||||
filterChainDefinitionMap.put("/drag/view", "anon");
|
filterChainDefinitionMap.put("/drag/view", "anon");
|
||||||
filterChainDefinitionMap.put("/drag/page/queryById", "anon");
|
filterChainDefinitionMap.put("/drag/page/queryById", "anon");
|
||||||
|
filterChainDefinitionMap.put("/drag/page/addVisitsNumber", "anon");
|
||||||
|
filterChainDefinitionMap.put("/drag/page/queryTemplateList", "anon");
|
||||||
|
filterChainDefinitionMap.put("/drag/share/view/**", "anon");
|
||||||
filterChainDefinitionMap.put("/drag/onlDragDatasetHead/getAllChartData", "anon");
|
filterChainDefinitionMap.put("/drag/onlDragDatasetHead/getAllChartData", "anon");
|
||||||
filterChainDefinitionMap.put("/drag/onlDragDatasetHead/getTotalData", "anon");
|
filterChainDefinitionMap.put("/drag/onlDragDatasetHead/getTotalData", "anon");
|
||||||
filterChainDefinitionMap.put("/drag/mock/json/**", "anon");
|
filterChainDefinitionMap.put("/drag/mock/json/**", "anon");
|
||||||
|
filterChainDefinitionMap.put("/jimubi/view", "anon");
|
||||||
|
filterChainDefinitionMap.put("/jimubi/share/view/**", "anon");
|
||||||
|
|
||||||
//大屏模板例子
|
//大屏模板例子
|
||||||
filterChainDefinitionMap.put("/test/bigScreen/**", "anon");
|
filterChainDefinitionMap.put("/test/bigScreen/**", "anon");
|
||||||
filterChainDefinitionMap.put("/bigscreen/template1/**", "anon");
|
filterChainDefinitionMap.put("/bigscreen/template1/**", "anon");
|
||||||
@ -173,6 +180,8 @@ public class ShiroConfig {
|
|||||||
// 企业微信证书排除
|
// 企业微信证书排除
|
||||||
filterChainDefinitionMap.put("/WW_verify*", "anon");
|
filterChainDefinitionMap.put("/WW_verify*", "anon");
|
||||||
|
|
||||||
|
filterChainDefinitionMap.put("/openapi/call/**", "anon");
|
||||||
|
|
||||||
// 添加自己的过滤器并且取名为jwt
|
// 添加自己的过滤器并且取名为jwt
|
||||||
Map<String, Filter> filterMap = new HashMap<String, Filter>(1);
|
Map<String, Filter> filterMap = new HashMap<String, Filter>(1);
|
||||||
//如果cloudServer为空 则说明是单体 需要加载跨域配置【微服务跨域切换】
|
//如果cloudServer为空 则说明是单体 需要加载跨域配置【微服务跨域切换】
|
||||||
@ -190,12 +199,24 @@ public class ShiroConfig {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//update-begin---author:chenrui ---date:20240126 for:【QQYUN-7932】AI助手------------
|
//update-begin---author:chenrui ---date:20240126 for:【QQYUN-7932】AI助手------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* spring过滤装饰器 <br/>
|
||||||
|
* 因为shiro的filter不支持异步请求,导致所有的异步请求都会报错. <br/>
|
||||||
|
* 所以需要用spring的FilterRegistrationBean再代理一下shiro的filter.为他扩展异步支持. <br/>
|
||||||
|
* 后续所有异步的接口都需要再这里增加registration.addUrlPatterns("/xxx/xxx");
|
||||||
|
* @return
|
||||||
|
* @author chenrui
|
||||||
|
* @date 2024/12/3 19:49
|
||||||
|
*/
|
||||||
@Bean
|
@Bean
|
||||||
public FilterRegistrationBean shiroFilterRegistration() {
|
public FilterRegistrationBean shiroFilterRegistration() {
|
||||||
FilterRegistrationBean registration = new FilterRegistrationBean();
|
FilterRegistrationBean registration = new FilterRegistrationBean();
|
||||||
registration.setFilter(new DelegatingFilterProxy("shiroFilterFactoryBean"));
|
registration.setFilter(new DelegatingFilterProxy("shiroFilterFactoryBean"));
|
||||||
registration.setEnabled(true);
|
registration.setEnabled(true);
|
||||||
registration.addUrlPatterns("/*");
|
//update-begin---author:chenrui ---date:20241202 for:[issues/7491]运行时间好长,效率慢 ------------
|
||||||
|
registration.addUrlPatterns("/test/ai/chat/send");
|
||||||
|
//update-end---author:chenrui ---date:20241202 for:[issues/7491]运行时间好长,效率慢 ------------
|
||||||
//支持异步
|
//支持异步
|
||||||
registration.setAsyncSupported(true);
|
registration.setAsyncSupported(true);
|
||||||
registration.setDispatcherTypes(DispatcherType.REQUEST, DispatcherType.ASYNC);
|
registration.setDispatcherTypes(DispatcherType.REQUEST, DispatcherType.ASYNC);
|
||||||
|
|||||||
@ -23,8 +23,8 @@ import org.jeecg.config.mybatis.MybatisPlusSaasConfig;
|
|||||||
import org.springframework.context.annotation.Lazy;
|
import org.springframework.context.annotation.Lazy;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -168,8 +168,8 @@ public class ShiroRealm extends AuthorizingRealm {
|
|||||||
|
|
||||||
//*********************************************
|
//*********************************************
|
||||||
if(!isAuthorization){
|
if(!isAuthorization){
|
||||||
log.warn("租户异常——当前登录的租户是:" + contextTenantId);
|
log.info("租户异常——登录租户:" + contextTenantId);
|
||||||
log.warn("租户异常——用户拥有的租户是:" + userTenantIds);
|
log.info("租户异常——用户拥有租户组:" + userTenantIds);
|
||||||
throw new AuthenticationException("登录租户授权变更,请重新登陆!");
|
throw new AuthenticationException("登录租户授权变更,请重新登陆!");
|
||||||
}
|
}
|
||||||
//*********************************************
|
//*********************************************
|
||||||
|
|||||||
@ -12,7 +12,7 @@ import org.apache.shiro.web.servlet.AbstractShiroFilter;
|
|||||||
import org.apache.shiro.mgt.SecurityManager;
|
import org.apache.shiro.mgt.SecurityManager;
|
||||||
import org.springframework.beans.factory.BeanInitializationException;
|
import org.springframework.beans.factory.BeanInitializationException;
|
||||||
|
|
||||||
import javax.servlet.Filter;
|
import jakarta.servlet.Filter;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -13,10 +13,10 @@ import org.springframework.http.HttpHeaders;
|
|||||||
import org.springframework.http.HttpStatus;
|
import org.springframework.http.HttpStatus;
|
||||||
import org.springframework.web.bind.annotation.RequestMethod;
|
import org.springframework.web.bind.annotation.RequestMethod;
|
||||||
|
|
||||||
import javax.servlet.ServletRequest;
|
import jakarta.servlet.ServletRequest;
|
||||||
import javax.servlet.ServletResponse;
|
import jakarta.servlet.ServletResponse;
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import jakarta.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @Description: 鉴权登录拦截器
|
* @Description: 鉴权登录拦截器
|
||||||
|
|||||||
@ -1,9 +1,9 @@
|
|||||||
package org.jeecg.config.shiro.filters;
|
package org.jeecg.config.shiro.filters;
|
||||||
|
|
||||||
import javax.servlet.ServletRequest;
|
import jakarta.servlet.ServletRequest;
|
||||||
import javax.servlet.ServletResponse;
|
import jakarta.servlet.ServletResponse;
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import jakarta.servlet.http.HttpServletResponse;
|
||||||
import org.apache.shiro.subject.Subject;
|
import org.apache.shiro.subject.Subject;
|
||||||
import org.apache.shiro.web.filter.AccessControlFilter;
|
import org.apache.shiro.web.filter.AccessControlFilter;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
|||||||
@ -10,7 +10,7 @@ import org.springframework.context.annotation.Configuration;
|
|||||||
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
|
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
|
||||||
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
|
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 签名 拦截器配置
|
* 签名 拦截器配置
|
||||||
|
|||||||
@ -4,8 +4,8 @@ package org.jeecg.config.sign.interceptor;
|
|||||||
import java.io.PrintWriter;
|
import java.io.PrintWriter;
|
||||||
import java.util.SortedMap;
|
import java.util.SortedMap;
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import jakarta.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
import org.jeecg.common.api.vo.Result;
|
import org.jeecg.common.api.vo.Result;
|
||||||
import org.jeecg.common.constant.CommonConstant;
|
import org.jeecg.common.constant.CommonConstant;
|
||||||
|
|||||||
@ -1,10 +1,10 @@
|
|||||||
package org.jeecg.config.sign.util;
|
package org.jeecg.config.sign.util;
|
||||||
|
|
||||||
import javax.servlet.ReadListener;
|
import jakarta.servlet.ReadListener;
|
||||||
import javax.servlet.ServletInputStream;
|
import jakarta.servlet.ServletInputStream;
|
||||||
import javax.servlet.ServletRequest;
|
import jakarta.servlet.ServletRequest;
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
import javax.servlet.http.HttpServletRequestWrapper;
|
import jakarta.servlet.http.HttpServletRequestWrapper;
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
import java.nio.charset.Charset;
|
import java.nio.charset.Charset;
|
||||||
|
|
||||||
|
|||||||
@ -10,7 +10,7 @@ import java.util.Map;
|
|||||||
import java.util.SortedMap;
|
import java.util.SortedMap;
|
||||||
import java.util.TreeMap;
|
import java.util.TreeMap;
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.jeecg.common.constant.SymbolConstant;
|
import org.jeecg.common.constant.SymbolConstant;
|
||||||
|
|||||||
@ -14,8 +14,8 @@ import org.jeecg.common.util.SpringContextUtils;
|
|||||||
import org.jeecg.common.util.oConvertUtils;
|
import org.jeecg.common.util.oConvertUtils;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -0,0 +1,2 @@
|
|||||||
|
springdoc.auto-tag-classes: false
|
||||||
|
springdoc.packages-to-scan: org.jeecg
|
||||||
@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>jeecg-boot-parent</artifactId>
|
<artifactId>jeecg-boot-parent</artifactId>
|
||||||
<groupId>org.jeecgframework.boot</groupId>
|
<groupId>org.jeecgframework.boot</groupId>
|
||||||
<version>3.7.1</version>
|
<version>3.7.3</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
@ -8,7 +8,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
|
|||||||
import org.springframework.web.bind.annotation.RequestParam;
|
import org.springframework.web.bind.annotation.RequestParam;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 服务端提供方——feign接口
|
* 服务端提供方——feign接口
|
||||||
|
|||||||
@ -14,8 +14,10 @@ import org.jetbrains.annotations.NotNull;
|
|||||||
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
|
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
|
||||||
|
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
//update-begin---author:chenrui ---date:20240126 for:【QQYUN-7932】AI助手------------
|
//update-begin---author:chenrui ---date:20240126 for:【QQYUN-7932】AI助手------------
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* OpenAI的SSE监听
|
* OpenAI的SSE监听
|
||||||
* @author chenrui
|
* @author chenrui
|
||||||
@ -29,22 +31,47 @@ public class OpenAISSEEventSourceListener extends EventSourceListener {
|
|||||||
private SseEmitter sseEmitter;
|
private SseEmitter sseEmitter;
|
||||||
|
|
||||||
private String topicId;
|
private String topicId;
|
||||||
|
/**
|
||||||
|
* 回复消息内容
|
||||||
|
*/
|
||||||
|
private String messageContent = "";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 完成回复回调
|
||||||
|
*/
|
||||||
|
private Consumer<String> doneCallback;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否正在思考
|
||||||
|
*/
|
||||||
|
private boolean isThinking = false;
|
||||||
|
|
||||||
public OpenAISSEEventSourceListener(SseEmitter sseEmitter) {
|
public OpenAISSEEventSourceListener(SseEmitter sseEmitter) {
|
||||||
this.sseEmitter = sseEmitter;
|
this.sseEmitter = sseEmitter;
|
||||||
}
|
}
|
||||||
|
|
||||||
public OpenAISSEEventSourceListener(String topicId,SseEmitter sseEmitter){
|
public OpenAISSEEventSourceListener(String topicId, SseEmitter sseEmitter){
|
||||||
this.topicId = topicId;
|
this.topicId = topicId;
|
||||||
this.sseEmitter = sseEmitter;
|
this.sseEmitter = sseEmitter;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置消息完成响应时的回调
|
||||||
|
* for [QQYUN-11102/QQYUN-11109]兼容deepseek模型,支持tink标签
|
||||||
|
* @param doneCallback
|
||||||
|
* @author chenrui
|
||||||
|
* @date 2025/2/7 18:14
|
||||||
|
*/
|
||||||
|
public void onDone(Consumer<String> doneCallback){
|
||||||
|
this.doneCallback = doneCallback;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@inheritDoc}
|
* {@inheritDoc}
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void onOpen(@NotNull EventSource eventSource, @NotNull Response response) {
|
public void onOpen(@NotNull EventSource eventSource, @NotNull Response response) {
|
||||||
log.info("OpenAI建立sse连接...");
|
log.info("ai-chat建立sse连接...");
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -53,10 +80,12 @@ public class OpenAISSEEventSourceListener extends EventSourceListener {
|
|||||||
@SneakyThrows
|
@SneakyThrows
|
||||||
@Override
|
@Override
|
||||||
public void onEvent(@NotNull EventSource eventSource, String id, String type, @NotNull String data) {
|
public void onEvent(@NotNull EventSource eventSource, String id, String type, @NotNull String data) {
|
||||||
log.debug("OpenAI返回数据:{}", data);
|
log.debug("ai-chat返回数据:{}", data);
|
||||||
tokens += 1;
|
tokens += 1;
|
||||||
if (data.equals("[DONE]")) {
|
if (data.equals("[DONE]")) {
|
||||||
log.info("OpenAI返回数据结束了");
|
log.info("ai-chat返回数据结束了");
|
||||||
|
this.doneCallback.accept(messageContent);
|
||||||
|
messageContent = "";
|
||||||
sseEmitter.send(SseEmitter.event()
|
sseEmitter.send(SseEmitter.event()
|
||||||
.id("[TOKENS]")
|
.id("[TOKENS]")
|
||||||
.data("<br/><br/>tokens:" + tokens())
|
.data("<br/><br/>tokens:" + tokens())
|
||||||
@ -72,12 +101,46 @@ public class OpenAISSEEventSourceListener extends EventSourceListener {
|
|||||||
ObjectMapper mapper = new ObjectMapper();
|
ObjectMapper mapper = new ObjectMapper();
|
||||||
ChatCompletionResponse completionResponse = mapper.readValue(data, ChatCompletionResponse.class); // 读取Json
|
ChatCompletionResponse completionResponse = mapper.readValue(data, ChatCompletionResponse.class); // 读取Json
|
||||||
try {
|
try {
|
||||||
|
//update-begin---author:chenrui ---date:20250207 for:[QQYUN-11102/QQYUN-11109]兼容deepseek模型,支持think标签------------
|
||||||
|
// 兼容think标签
|
||||||
|
//update-begin---author:chenrui ---date:20250210 for:判断空,防止反悔的内容为空报错.------------
|
||||||
|
if(null != completionResponse.getChoices()
|
||||||
|
&& !completionResponse.getChoices().isEmpty()
|
||||||
|
&& null != completionResponse.getChoices().get(0)) {
|
||||||
|
//update-end---author:chenrui ---date:20250210 for:判断空,防止反悔的内容为空报错.------------
|
||||||
|
Message delta = completionResponse.getChoices().get(0).getDelta();
|
||||||
|
if (null != delta) {
|
||||||
|
String content = delta.getContent();
|
||||||
|
if ("<think>".equals(content)) {
|
||||||
|
isThinking = true;
|
||||||
|
content = "> ";
|
||||||
|
delta.setContent(content);
|
||||||
|
}
|
||||||
|
if ("</think>".equals(content)) {
|
||||||
|
isThinking = false;
|
||||||
|
content = "\n\n";
|
||||||
|
delta.setContent(content);
|
||||||
|
}
|
||||||
|
if (isThinking) {
|
||||||
|
if (null != content && content.contains("\n")) {
|
||||||
|
content = "\n> ";
|
||||||
|
delta.setContent(content);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// 响应消息体不记录思考过程
|
||||||
|
messageContent += null == content ? "" : content;
|
||||||
|
}
|
||||||
|
log.info("ai-chat返回数据,发送给前端:" + content);
|
||||||
sseEmitter.send(SseEmitter.event()
|
sseEmitter.send(SseEmitter.event()
|
||||||
.id(this.topicId)
|
.id(this.topicId)
|
||||||
.data(completionResponse.getChoices().get(0).getDelta())
|
.data(delta)
|
||||||
.reconnectTime(3000));
|
.reconnectTime(3000));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//update-end---author:chenrui ---date:20250207 for:[QQYUN-11102/QQYUN-11109]兼容deepseek模型,支持think标签------------
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.error(e.getMessage(),e);
|
log.error("ai-chat返回数据,发生异常"+e.getMessage(),e);
|
||||||
|
sseEmitter.completeWithError(e);
|
||||||
eventSource.cancel();
|
eventSource.cancel();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -86,7 +149,7 @@ public class OpenAISSEEventSourceListener extends EventSourceListener {
|
|||||||
@Override
|
@Override
|
||||||
public void onClosed(@NotNull EventSource eventSource) {
|
public void onClosed(@NotNull EventSource eventSource) {
|
||||||
log.info("流式输出返回值总共{}tokens", tokens() - 2);
|
log.info("流式输出返回值总共{}tokens", tokens() - 2);
|
||||||
log.info("OpenAI关闭sse连接...");
|
log.info("ai-chat关闭sse连接...");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -96,10 +159,10 @@ public class OpenAISSEEventSourceListener extends EventSourceListener {
|
|||||||
String errMsg = "";
|
String errMsg = "";
|
||||||
ResponseBody body = null == response ? null:response.body();
|
ResponseBody body = null == response ? null:response.body();
|
||||||
if (Objects.nonNull(body)) {
|
if (Objects.nonNull(body)) {
|
||||||
log.error("OpenAI sse连接异常data:{},异常:{}", body.string(), t.getMessage());
|
log.error("ai-chat sse连接异常data:{},异常:{}", body.string(), t.getMessage());
|
||||||
errMsg = body.string();
|
errMsg = body.string();
|
||||||
} else {
|
} else {
|
||||||
log.error("OpenAI sse连接异常data:{},异常:{}", response, t.getMessage());
|
log.error("ai-chat sse连接异常data:{},异常:{}", response, t.getMessage());
|
||||||
errMsg = t.getMessage();
|
errMsg = t.getMessage();
|
||||||
}
|
}
|
||||||
eventSource.cancel();
|
eventSource.cancel();
|
||||||
|
|||||||
@ -9,6 +9,7 @@ import com.unfbx.chatgpt.entity.chat.Message;
|
|||||||
import com.unfbx.chatgpt.exception.BaseException;
|
import com.unfbx.chatgpt.exception.BaseException;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.shiro.SecurityUtils;
|
import org.apache.shiro.SecurityUtils;
|
||||||
|
import org.jeecg.chatgpt.prop.AiChatProperties;
|
||||||
import org.jeecg.common.api.vo.Result;
|
import org.jeecg.common.api.vo.Result;
|
||||||
import org.jeecg.common.exception.JeecgBootException;
|
import org.jeecg.common.exception.JeecgBootException;
|
||||||
import org.jeecg.common.system.vo.LoginUser;
|
import org.jeecg.common.system.vo.LoginUser;
|
||||||
@ -58,6 +59,11 @@ public class ChatServiceImpl implements ChatService {
|
|||||||
|
|
||||||
private OpenAiStreamClient openAiStreamClient = null;
|
private OpenAiStreamClient openAiStreamClient = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ai聊天配置
|
||||||
|
* for [QQYUN-10943]【AI 重要】jeecg-boot-starter-chatgpt 支持deepseek等国产模型
|
||||||
|
*/
|
||||||
|
private AiChatProperties aiChatProperties;
|
||||||
//update-begin---author:chenrui ---date:20240131 for:[QQYUN-8212]fix 没有配置启动报错------------
|
//update-begin---author:chenrui ---date:20240131 for:[QQYUN-8212]fix 没有配置启动报错------------
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -66,17 +72,17 @@ public class ChatServiceImpl implements ChatService {
|
|||||||
* @author chenrui
|
* @author chenrui
|
||||||
* @date 2024/2/3 23:08
|
* @date 2024/2/3 23:08
|
||||||
*/
|
*/
|
||||||
private OpenAiStreamClient ensureClient(){
|
private void ensureClient(){
|
||||||
if (null == this.openAiStreamClient){
|
if (null == this.openAiStreamClient){
|
||||||
//update-begin---author:chenrui ---date:20240625 for:[TV360X-1570]给于更友好的提示,提示未配置ai------------
|
//update-begin---author:chenrui ---date:20240625 for:[TV360X-1570]给于更友好的提示,提示未配置ai------------
|
||||||
try {
|
try {
|
||||||
this.openAiStreamClient = SpringContextUtils.getBean(OpenAiStreamClient.class);
|
this.openAiStreamClient = SpringContextUtils.getBean(OpenAiStreamClient.class);
|
||||||
|
this.aiChatProperties = SpringContextUtils.getBean(AiChatProperties.class);
|
||||||
} catch (Exception ignored) {
|
} catch (Exception ignored) {
|
||||||
sendErrorMsg("如果您想使用AI助手,请先设置相应配置!");
|
sendErrorMsg("如果您想使用AI助手,请先设置相应配置!");
|
||||||
}
|
}
|
||||||
//update-end---author:chenrui ---date:20240625 for:[TV360X-1570]给于更友好的提示,提示未配置ai------------
|
//update-end---author:chenrui ---date:20240625 for:[TV360X-1570]给于更友好的提示,提示未配置ai------------
|
||||||
}
|
}
|
||||||
return this.openAiStreamClient;
|
|
||||||
}
|
}
|
||||||
//update-end---author:chenrui ---date:20240131 for:[QQYUN-8212]fix 没有配置启动报错------------
|
//update-end---author:chenrui ---date:20240131 for:[QQYUN-8212]fix 没有配置启动报错------------
|
||||||
|
|
||||||
@ -98,6 +104,7 @@ public class ChatServiceImpl implements ChatService {
|
|||||||
//超时回调
|
//超时回调
|
||||||
sseEmitter.onTimeout(() -> {
|
sseEmitter.onTimeout(() -> {
|
||||||
log.info("[{}]连接超时...................", uid);
|
log.info("[{}]连接超时...................", uid);
|
||||||
|
LocalCache.CACHE.remove(uid);
|
||||||
});
|
});
|
||||||
//异常回调
|
//异常回调
|
||||||
sseEmitter.onError(
|
sseEmitter.onError(
|
||||||
@ -109,7 +116,7 @@ public class ChatServiceImpl implements ChatService {
|
|||||||
.name("发生异常!")
|
.name("发生异常!")
|
||||||
.data(Message.builder().content("发生异常请重试!").build())
|
.data(Message.builder().content("发生异常请重试!").build())
|
||||||
.reconnectTime(3000));
|
.reconnectTime(3000));
|
||||||
LocalCache.CACHE.put(uid, sseEmitter);
|
LocalCache.CACHE.remove(uid);
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
log.error(e.getMessage(),e);
|
log.error(e.getMessage(),e);
|
||||||
}
|
}
|
||||||
@ -138,6 +145,7 @@ public class ChatServiceImpl implements ChatService {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void sendMessage(String topicId, String message) {
|
public void sendMessage(String topicId, String message) {
|
||||||
|
ensureClient();
|
||||||
String uid = getUserId();
|
String uid = getUserId();
|
||||||
if (StrUtil.isBlank(message)) {
|
if (StrUtil.isBlank(message)) {
|
||||||
log.info("参数异常,message为null");
|
log.info("参数异常,message为null");
|
||||||
@ -164,18 +172,22 @@ public class ChatServiceImpl implements ChatService {
|
|||||||
throw new JeecgBootException("聊天消息推送失败uid:[{}],没有创建连接,请重试。~");
|
throw new JeecgBootException("聊天消息推送失败uid:[{}],没有创建连接,请重试。~");
|
||||||
}
|
}
|
||||||
//update-begin---author:chenrui ---date:20240625 for:[TV360X-1570]给于更友好的提示,提示未配置ai------------
|
//update-begin---author:chenrui ---date:20240625 for:[TV360X-1570]给于更友好的提示,提示未配置ai------------
|
||||||
OpenAiStreamClient client = ensureClient();
|
if (null != openAiStreamClient) {
|
||||||
if (null != client) {
|
|
||||||
OpenAISSEEventSourceListener openAIEventSourceListener = new OpenAISSEEventSourceListener(topicId, sseEmitter);
|
OpenAISSEEventSourceListener openAIEventSourceListener = new OpenAISSEEventSourceListener(topicId, sseEmitter);
|
||||||
|
List<Message> finalMsgHistory = msgHistory;
|
||||||
|
openAIEventSourceListener.onDone(respMessage -> {
|
||||||
|
Message tempMessage = Message.builder().content(respMessage).role(Message.Role.ASSISTANT).build();
|
||||||
|
finalMsgHistory.add(tempMessage);
|
||||||
|
redisTemplate.opsForHash().put(cacheKey, CACHE_KEY_MSG_CONTEXT, JSONUtil.toJsonStr(finalMsgHistory));
|
||||||
|
});
|
||||||
|
log.info("话题:{},开始发送消息~~~", topicId);
|
||||||
ChatCompletion completion = ChatCompletion
|
ChatCompletion completion = ChatCompletion
|
||||||
.builder()
|
.builder()
|
||||||
.messages(msgHistory)
|
.messages(msgHistory)
|
||||||
.model(ChatCompletion.Model.GPT_3_5_TURBO.getName())
|
.model(aiChatProperties.getModel())
|
||||||
.build();
|
.build();
|
||||||
client.streamChatCompletion(completion, openAIEventSourceListener);
|
openAiStreamClient.streamChatCompletion(completion, openAIEventSourceListener);
|
||||||
redisTemplate.opsForHash().put(cacheKey, CACHE_KEY_MSG_CONTEXT, JSONUtil.toJsonStr(msgHistory));
|
|
||||||
//update-end---author:chenrui ---date:20240223 for:[QQYUN-8225]聊天记录保存------------
|
//update-end---author:chenrui ---date:20240223 for:[QQYUN-8225]聊天记录保存------------
|
||||||
Result.ok(completion.tokens());
|
|
||||||
}
|
}
|
||||||
//update-end---author:chenrui ---date:20240625 for:[TV360X-1570]给于更友好的提示,提示未配置ai------------
|
//update-end---author:chenrui ---date:20240625 for:[TV360X-1570]给于更友好的提示,提示未配置ai------------
|
||||||
}
|
}
|
||||||
|
|||||||
@ -6,8 +6,8 @@ import org.apache.commons.io.IOUtils;
|
|||||||
import org.jeecg.common.api.vo.Result;
|
import org.jeecg.common.api.vo.Result;
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import jakarta.servlet.http.HttpServletResponse;
|
||||||
import javax.swing.filechooser.FileSystemView;
|
import javax.swing.filechooser.FileSystemView;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|||||||
@ -18,7 +18,7 @@ import org.jeecg.modules.demo.mock.vxe.entity.MockEntity;
|
|||||||
import org.jeecg.modules.demo.mock.vxe.websocket.VxeSocket;
|
import org.jeecg.modules.demo.mock.vxe.websocket.VxeSocket;
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.net.URLDecoder;
|
import java.net.URLDecoder;
|
||||||
|
|||||||
@ -6,12 +6,12 @@ import lombok.extern.slf4j.Slf4j;
|
|||||||
import org.jeecg.common.constant.VxeSocketConst;
|
import org.jeecg.common.constant.VxeSocketConst;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
import javax.websocket.OnClose;
|
import jakarta.websocket.OnClose;
|
||||||
import javax.websocket.OnMessage;
|
import jakarta.websocket.OnMessage;
|
||||||
import javax.websocket.OnOpen;
|
import jakarta.websocket.OnOpen;
|
||||||
import javax.websocket.Session;
|
import jakarta.websocket.Session;
|
||||||
import javax.websocket.server.PathParam;
|
import jakarta.websocket.server.PathParam;
|
||||||
import javax.websocket.server.ServerEndpoint;
|
import jakarta.websocket.server.ServerEndpoint;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|||||||
@ -4,13 +4,12 @@ import com.alibaba.fastjson.JSON;
|
|||||||
import com.alibaba.fastjson.JSONArray;
|
import com.alibaba.fastjson.JSONArray;
|
||||||
import com.alibaba.fastjson.JSONObject;
|
import com.alibaba.fastjson.JSONObject;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
|
||||||
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
|
|
||||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
import io.swagger.annotations.Api;
|
import io.swagger.v3.oas.annotations.Operation;
|
||||||
import io.swagger.annotations.ApiOperation;
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
import io.swagger.annotations.ApiParam;
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
|
import jakarta.servlet.http.HttpServletResponse;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.shiro.SecurityUtils;
|
import org.apache.shiro.SecurityUtils;
|
||||||
import org.apache.shiro.mgt.DefaultSecurityManager;
|
import org.apache.shiro.mgt.DefaultSecurityManager;
|
||||||
@ -31,8 +30,6 @@ import org.springframework.web.bind.annotation.*;
|
|||||||
import org.springframework.web.servlet.ModelAndView;
|
import org.springframework.web.servlet.ModelAndView;
|
||||||
import reactor.core.publisher.Mono;
|
import reactor.core.publisher.Mono;
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
|
||||||
import javax.servlet.http.HttpServletResponse;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
@ -45,7 +42,7 @@ import java.util.List;
|
|||||||
* @Version:V2.0
|
* @Version:V2.0
|
||||||
*/
|
*/
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@Api(tags = "单表DEMO")
|
@Tag(name = "单表DEMO")
|
||||||
@RestController
|
@RestController
|
||||||
@RequestMapping("/test/jeecgDemo")
|
@RequestMapping("/test/jeecgDemo")
|
||||||
public class JeecgDemoController extends JeecgController<JeecgDemo, IJeecgDemoService> {
|
public class JeecgDemoController extends JeecgController<JeecgDemo, IJeecgDemoService> {
|
||||||
@ -64,7 +61,7 @@ public class JeecgDemoController extends JeecgController<JeecgDemo, IJeecgDemoSe
|
|||||||
* @param req
|
* @param req
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
@ApiOperation(value = "获取Demo数据列表", notes = "获取所有Demo数据列表")
|
@Operation(summary = "获取所有Demo数据列表")
|
||||||
@GetMapping(value = "/list")
|
@GetMapping(value = "/list")
|
||||||
@PermissionData(pageComponent = "jeecg/JeecgDemoList")
|
@PermissionData(pageComponent = "jeecg/JeecgDemoList")
|
||||||
public Result<?> list(JeecgDemo jeecgDemo, @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo, @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
|
public Result<?> list(JeecgDemo jeecgDemo, @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo, @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
|
||||||
@ -89,7 +86,7 @@ public class JeecgDemoController extends JeecgController<JeecgDemo, IJeecgDemoSe
|
|||||||
*/
|
*/
|
||||||
@PostMapping(value = "/add")
|
@PostMapping(value = "/add")
|
||||||
@AutoLog(value = "添加测试DEMO")
|
@AutoLog(value = "添加测试DEMO")
|
||||||
@ApiOperation(value = "添加DEMO", notes = "添加DEMO")
|
@Operation(summary = "添加DEMO")
|
||||||
public Result<?> add(@RequestBody JeecgDemo jeecgDemo) {
|
public Result<?> add(@RequestBody JeecgDemo jeecgDemo) {
|
||||||
jeecgDemoService.save(jeecgDemo);
|
jeecgDemoService.save(jeecgDemo);
|
||||||
return Result.OK("添加成功!");
|
return Result.OK("添加成功!");
|
||||||
@ -102,7 +99,7 @@ public class JeecgDemoController extends JeecgController<JeecgDemo, IJeecgDemoSe
|
|||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
@AutoLog(value = "编辑DEMO", operateType = CommonConstant.OPERATE_TYPE_3)
|
@AutoLog(value = "编辑DEMO", operateType = CommonConstant.OPERATE_TYPE_3)
|
||||||
@ApiOperation(value = "编辑DEMO", notes = "编辑DEMO")
|
@Operation(summary = "编辑DEMO")
|
||||||
@RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
|
@RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
|
||||||
public Result<?> edit(@RequestBody JeecgDemo jeecgDemo) {
|
public Result<?> edit(@RequestBody JeecgDemo jeecgDemo) {
|
||||||
jeecgDemoService.updateById(jeecgDemo);
|
jeecgDemoService.updateById(jeecgDemo);
|
||||||
@ -117,7 +114,7 @@ public class JeecgDemoController extends JeecgController<JeecgDemo, IJeecgDemoSe
|
|||||||
*/
|
*/
|
||||||
@AutoLog(value = "删除测试DEMO")
|
@AutoLog(value = "删除测试DEMO")
|
||||||
@DeleteMapping(value = "/delete")
|
@DeleteMapping(value = "/delete")
|
||||||
@ApiOperation(value = "通过ID删除DEMO", notes = "通过ID删除DEMO")
|
@Operation(summary = "通过ID删除DEMO")
|
||||||
public Result<?> delete(@RequestParam(name = "id", required = true) String id) {
|
public Result<?> delete(@RequestParam(name = "id", required = true) String id) {
|
||||||
jeecgDemoService.removeById(id);
|
jeecgDemoService.removeById(id);
|
||||||
return Result.OK("删除成功!");
|
return Result.OK("删除成功!");
|
||||||
@ -130,7 +127,7 @@ public class JeecgDemoController extends JeecgController<JeecgDemo, IJeecgDemoSe
|
|||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
@DeleteMapping(value = "/deleteBatch")
|
@DeleteMapping(value = "/deleteBatch")
|
||||||
@ApiOperation(value = "批量删除DEMO", notes = "批量删除DEMO")
|
@Operation(summary = "批量删除DEMO")
|
||||||
public Result<?> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
|
public Result<?> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
|
||||||
this.jeecgDemoService.removeByIds(Arrays.asList(ids.split(",")));
|
this.jeecgDemoService.removeByIds(Arrays.asList(ids.split(",")));
|
||||||
return Result.OK("批量删除成功!");
|
return Result.OK("批量删除成功!");
|
||||||
@ -143,8 +140,8 @@ public class JeecgDemoController extends JeecgController<JeecgDemo, IJeecgDemoSe
|
|||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
@GetMapping(value = "/queryById")
|
@GetMapping(value = "/queryById")
|
||||||
@ApiOperation(value = "通过ID查询DEMO", notes = "通过ID查询DEMO")
|
@Operation(summary = "通过ID查询DEMO")
|
||||||
public Result<?> queryById(@ApiParam(name = "id", value = "示例id", required = true) @RequestParam(name = "id", required = true) String id) {
|
public Result<?> queryById(/*@ApiParam(name = "id", value = "示例id", required = true)*/ @RequestParam(name = "id", required = true) String id) {
|
||||||
JeecgDemo jeecgDemo = jeecgDemoService.getById(id);
|
JeecgDemo jeecgDemo = jeecgDemoService.getById(id);
|
||||||
return Result.OK(jeecgDemo);
|
return Result.OK(jeecgDemo);
|
||||||
}
|
}
|
||||||
@ -477,7 +474,7 @@ public class JeecgDemoController extends JeecgController<JeecgDemo, IJeecgDemoSe
|
|||||||
* 测试Mono对象
|
* 测试Mono对象
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
@ApiOperation("Mono测试")
|
@Operation(summary = "Mono测试")
|
||||||
@GetMapping(value ="/test")
|
@GetMapping(value ="/test")
|
||||||
public Mono<String> test() {
|
public Mono<String> test() {
|
||||||
//解决shiro报错No SecurityManager accessible to the calling code, either bound to the org.apache.shiro
|
//解决shiro报错No SecurityManager accessible to the calling code, either bound to the org.apache.shiro
|
||||||
|
|||||||
@ -1,8 +1,7 @@
|
|||||||
package org.jeecg.modules.demo.test.controller;
|
package org.jeecg.modules.demo.test.controller;
|
||||||
|
|
||||||
import io.lettuce.core.dynamic.annotation.Param;
|
import io.swagger.v3.oas.annotations.Operation;
|
||||||
import io.swagger.annotations.Api;
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
import io.swagger.annotations.ApiOperation;
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.jeecg.common.api.vo.Result;
|
import org.jeecg.common.api.vo.Result;
|
||||||
import org.jeecg.common.aspect.annotation.AutoLog;
|
import org.jeecg.common.aspect.annotation.AutoLog;
|
||||||
@ -11,7 +10,10 @@ import org.jeecg.modules.demo.test.entity.JeecgDemo;
|
|||||||
import org.jeecg.modules.demo.test.service.IJeecgDemoService;
|
import org.jeecg.modules.demo.test.service.IJeecgDemoService;
|
||||||
import org.jeecg.modules.demo.test.service.IJeecgDynamicDataService;
|
import org.jeecg.modules.demo.test.service.IJeecgDynamicDataService;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestParam;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@ -21,7 +23,7 @@ import java.util.List;
|
|||||||
* @Date:2020-04-21
|
* @Date:2020-04-21
|
||||||
*/
|
*/
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@Api(tags = "动态数据源测试")
|
@Tag(name = "动态数据源测试")
|
||||||
@RestController
|
@RestController
|
||||||
@RequestMapping("/test/dynamic")
|
@RequestMapping("/test/dynamic")
|
||||||
public class JeecgDynamicDataController extends JeecgController<JeecgDemo, IJeecgDemoService> {
|
public class JeecgDynamicDataController extends JeecgController<JeecgDemo, IJeecgDemoService> {
|
||||||
@ -37,7 +39,7 @@ public class JeecgDynamicDataController extends JeecgController<JeecgDemo, IJeec
|
|||||||
*/
|
*/
|
||||||
@PostMapping(value = "/test1")
|
@PostMapping(value = "/test1")
|
||||||
@AutoLog(value = "动态切换数据源")
|
@AutoLog(value = "动态切换数据源")
|
||||||
@ApiOperation(value = "动态切换数据源", notes = "动态切换数据源")
|
@Operation(summary = "动态切换数据源")
|
||||||
public Result<List<JeecgDemo>> selectSpelByKey(@RequestParam(required = false) String dsName) {
|
public Result<List<JeecgDemo>> selectSpelByKey(@RequestParam(required = false) String dsName) {
|
||||||
List<JeecgDemo> list = jeecgDynamicDataService.selectSpelByKey(dsName);
|
List<JeecgDemo> list = jeecgDynamicDataService.selectSpelByKey(dsName);
|
||||||
return Result.OK(list);
|
return Result.OK(list);
|
||||||
|
|||||||
@ -17,7 +17,7 @@ import org.springframework.beans.BeanUtils;
|
|||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -5,8 +5,8 @@ import java.util.Arrays;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import jakarta.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
import org.apache.shiro.SecurityUtils;
|
import org.apache.shiro.SecurityUtils;
|
||||||
import org.jeecg.common.api.vo.Result;
|
import org.jeecg.common.api.vo.Result;
|
||||||
|
|||||||
@ -7,8 +7,8 @@ import java.util.Arrays;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import jakarta.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
import org.jeecg.common.api.vo.Result;
|
import org.jeecg.common.api.vo.Result;
|
||||||
import org.jeecg.common.system.query.QueryGenerator;
|
import org.jeecg.common.system.query.QueryGenerator;
|
||||||
|
|||||||
@ -3,6 +3,7 @@ package org.jeecg.modules.demo.test.entity;
|
|||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.annotation.Version;
|
import com.baomidou.mybatisplus.annotation.Version;
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
import org.jeecg.common.system.base.entity.JeecgEntity;
|
import org.jeecg.common.system.base.entity.JeecgEntity;
|
||||||
import org.jeecgframework.poi.excel.annotation.Excel;
|
import org.jeecgframework.poi.excel.annotation.Excel;
|
||||||
import org.springframework.format.annotation.DateTimeFormat;
|
import org.springframework.format.annotation.DateTimeFormat;
|
||||||
@ -10,8 +11,6 @@ import org.springframework.format.annotation.DateTimeFormat;
|
|||||||
import com.baomidou.mybatisplus.annotation.TableName;
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||||
|
|
||||||
import io.swagger.annotations.ApiModel;
|
|
||||||
import io.swagger.annotations.ApiModelProperty;
|
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
import lombok.experimental.Accessors;
|
import lombok.experimental.Accessors;
|
||||||
@ -25,59 +24,59 @@ import lombok.experimental.Accessors;
|
|||||||
@Data
|
@Data
|
||||||
@EqualsAndHashCode(callSuper = false)
|
@EqualsAndHashCode(callSuper = false)
|
||||||
@Accessors(chain = true)
|
@Accessors(chain = true)
|
||||||
@ApiModel(value="测试DEMO对象", description="测试DEMO")
|
@Schema(description="测试DEMO")
|
||||||
@TableName("demo")
|
@TableName("demo")
|
||||||
public class JeecgDemo extends JeecgEntity implements Serializable {
|
public class JeecgDemo extends JeecgEntity implements Serializable {
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
/** 姓名 */
|
/** 姓名 */
|
||||||
@Excel(name="姓名",width=25)
|
@Excel(name="姓名",width=25)
|
||||||
@ApiModelProperty(value = "姓名")
|
@Schema(description = "姓名")
|
||||||
private java.lang.String name;
|
private java.lang.String name;
|
||||||
/** 关键词 */
|
/** 关键词 */
|
||||||
@ApiModelProperty(value = "关键词")
|
@Schema(description = "关键词")
|
||||||
@Excel(name="关键词",width=15)
|
@Excel(name="关键词",width=15)
|
||||||
private java.lang.String keyWord;
|
private java.lang.String keyWord;
|
||||||
/** 打卡时间 */
|
/** 打卡时间 */
|
||||||
@ApiModelProperty(value = "打卡时间")
|
@Schema(description = "打卡时间")
|
||||||
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
|
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
|
||||||
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||||
@Excel(name="打卡时间",width=20,format="yyyy-MM-dd HH:mm:ss")
|
@Excel(name="打卡时间",width=20,format="yyyy-MM-dd HH:mm:ss")
|
||||||
private java.util.Date punchTime;
|
private java.util.Date punchTime;
|
||||||
/** 工资 */
|
/** 工资 */
|
||||||
@ApiModelProperty(value = "工资",example = "0")
|
@Schema(description = "工资",example = "0")
|
||||||
@Excel(name="工资",type = 4,width=15)
|
@Excel(name="工资",type = 4,width=15)
|
||||||
private java.math.BigDecimal salaryMoney;
|
private java.math.BigDecimal salaryMoney;
|
||||||
/** 奖金 */
|
/** 奖金 */
|
||||||
@ApiModelProperty(value = "奖金",example = "0")
|
@Schema(description = "奖金",example = "0")
|
||||||
@Excel(name="奖金",type = 4,width=15)
|
@Excel(name="奖金",type = 4,width=15)
|
||||||
private java.lang.Double bonusMoney;
|
private java.lang.Double bonusMoney;
|
||||||
/** 性别 {男:1,女:2} */
|
/** 性别 {男:1,女:2} */
|
||||||
@ApiModelProperty(value = "性别")
|
@Schema(description = "性别")
|
||||||
@Excel(name = "性别", width = 15, dicCode = "sex")
|
@Excel(name = "性别", width = 15, dicCode = "sex")
|
||||||
private java.lang.String sex;
|
private java.lang.String sex;
|
||||||
/** 年龄 */
|
/** 年龄 */
|
||||||
@ApiModelProperty(value = "年龄",example = "0")
|
@Schema(description = "年龄",example = "0")
|
||||||
@Excel(name="年龄",type = 4,width=15)
|
@Excel(name="年龄",type = 4,width=15)
|
||||||
private java.lang.Integer age;
|
private java.lang.Integer age;
|
||||||
/** 生日 */
|
/** 生日 */
|
||||||
@ApiModelProperty(value = "生日")
|
@Schema(description = "生日")
|
||||||
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
|
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
|
||||||
@DateTimeFormat(pattern = "yyyy-MM-dd")
|
@DateTimeFormat(pattern = "yyyy-MM-dd")
|
||||||
@Excel(name="生日",format="yyyy-MM-dd")
|
@Excel(name="生日",format="yyyy-MM-dd")
|
||||||
private java.util.Date birthday;
|
private java.util.Date birthday;
|
||||||
/** 邮箱 */
|
/** 邮箱 */
|
||||||
@ApiModelProperty(value = "邮箱")
|
@Schema(description = "邮箱")
|
||||||
@Excel(name="邮箱",width=30)
|
@Excel(name="邮箱",width=30)
|
||||||
private java.lang.String email;
|
private java.lang.String email;
|
||||||
/** 个人简介 */
|
/** 个人简介 */
|
||||||
@ApiModelProperty(value = "个人简介")
|
@Schema(description = "个人简介")
|
||||||
private java.lang.String content;
|
private java.lang.String content;
|
||||||
/** 部门编码 */
|
/** 部门编码 */
|
||||||
@Excel(name="部门编码",width=25)
|
@Excel(name="部门编码",width=25)
|
||||||
@ApiModelProperty(value = "部门编码")
|
@Schema(description = "部门编码")
|
||||||
private java.lang.String sysOrgCode;
|
private java.lang.String sysOrgCode;
|
||||||
|
|
||||||
@ApiModelProperty(value = "租户ID")
|
// @Schema(description = "租户ID")
|
||||||
private java.lang.Integer tenantId;
|
private java.lang.Integer tenantId;
|
||||||
/** 乐观锁字段 */
|
/** 乐观锁字段 */
|
||||||
@Version
|
@Version
|
||||||
|
|||||||
@ -18,7 +18,7 @@ import org.jeecg.modules.demo.mock.vxe.websocket.VxeSocket;
|
|||||||
import org.jeecg.modules.dlglong.entity.MockEntity;
|
import org.jeecg.modules.dlglong.entity.MockEntity;
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.net.URLDecoder;
|
import java.net.URLDecoder;
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,370 @@
|
|||||||
|
{
|
||||||
|
"list": [
|
||||||
|
{
|
||||||
|
"key": "1717072932495_439966",
|
||||||
|
"type": "card",
|
||||||
|
"isAutoGrid": true,
|
||||||
|
"isContainer": true,
|
||||||
|
"list": [
|
||||||
|
{
|
||||||
|
"type": "input",
|
||||||
|
"name": "名称",
|
||||||
|
"className": "form-input",
|
||||||
|
"icon": "icon-input",
|
||||||
|
"hideTitle": false,
|
||||||
|
"options": {
|
||||||
|
"width": "100%",
|
||||||
|
"defaultValue": "",
|
||||||
|
"required": true,
|
||||||
|
"dataType": null,
|
||||||
|
"pattern": "",
|
||||||
|
"placeholder": "",
|
||||||
|
"clearable": false,
|
||||||
|
"readonly": false,
|
||||||
|
"disabled": false,
|
||||||
|
"fillRuleCode": "",
|
||||||
|
"showPassword": false,
|
||||||
|
"unique": false,
|
||||||
|
"hidden": false,
|
||||||
|
"hiddenOnAdd": false,
|
||||||
|
"fieldNote": "",
|
||||||
|
"autoWidth": 50
|
||||||
|
},
|
||||||
|
"advancedSetting": {
|
||||||
|
"defaultValue": {
|
||||||
|
"type": "compose",
|
||||||
|
"value": "",
|
||||||
|
"format": "string",
|
||||||
|
"allowFunc": true,
|
||||||
|
"valueSplit": "",
|
||||||
|
"customConfig": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"remoteAPI": {
|
||||||
|
"url": "",
|
||||||
|
"executed": false
|
||||||
|
},
|
||||||
|
"key": "1717072932495_556479",
|
||||||
|
"model": "input_1717072932495_556479",
|
||||||
|
"modelType": "main",
|
||||||
|
"rules": [
|
||||||
|
{
|
||||||
|
"required": true,
|
||||||
|
"message": "${title}必须填写"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"isSubItem": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "number",
|
||||||
|
"name": "数字",
|
||||||
|
"className": "form-number",
|
||||||
|
"icon": "icon-number",
|
||||||
|
"hideTitle": false,
|
||||||
|
"options": {
|
||||||
|
"width": "",
|
||||||
|
"required": false,
|
||||||
|
"defaultValue": 0,
|
||||||
|
"placeholder": "",
|
||||||
|
"controls": false,
|
||||||
|
"min": 0,
|
||||||
|
"minUnlimited": true,
|
||||||
|
"max": 100,
|
||||||
|
"maxUnlimited": true,
|
||||||
|
"step": 1,
|
||||||
|
"disabled": false,
|
||||||
|
"controlsPosition": "right",
|
||||||
|
"unitText": "",
|
||||||
|
"unitPosition": "suffix",
|
||||||
|
"showPercent": false,
|
||||||
|
"align": "left",
|
||||||
|
"hidden": false,
|
||||||
|
"hiddenOnAdd": false,
|
||||||
|
"fieldNote": "",
|
||||||
|
"autoWidth": 50
|
||||||
|
},
|
||||||
|
"advancedSetting": {
|
||||||
|
"defaultValue": {
|
||||||
|
"type": "compose",
|
||||||
|
"value": "",
|
||||||
|
"format": "number",
|
||||||
|
"allowFunc": true,
|
||||||
|
"valueSplit": "",
|
||||||
|
"customConfig": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"remoteAPI": {
|
||||||
|
"url": "",
|
||||||
|
"executed": false
|
||||||
|
},
|
||||||
|
"key": "1717072985868_606195",
|
||||||
|
"model": "number_1717072985868_606195",
|
||||||
|
"modelType": "main",
|
||||||
|
"rules": [],
|
||||||
|
"isSubItem": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"options": {
|
||||||
|
"required": false,
|
||||||
|
"hiddenOnAdd": false,
|
||||||
|
"hidden": false,
|
||||||
|
"fieldNote": ""
|
||||||
|
},
|
||||||
|
"model": "card_1717072932495_439966",
|
||||||
|
"hideTitle": false,
|
||||||
|
"modelType": "main"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "1717072988159_545097",
|
||||||
|
"type": "card",
|
||||||
|
"isAutoGrid": true,
|
||||||
|
"isContainer": true,
|
||||||
|
"list": [
|
||||||
|
{
|
||||||
|
"type": "money",
|
||||||
|
"name": "金额",
|
||||||
|
"className": "form-money",
|
||||||
|
"icon": "icon-money",
|
||||||
|
"hideTitle": false,
|
||||||
|
"options": {
|
||||||
|
"width": "180px",
|
||||||
|
"placeholder": "请输入金额",
|
||||||
|
"required": false,
|
||||||
|
"unitText": "元",
|
||||||
|
"unitPosition": "suffix",
|
||||||
|
"precision": 2,
|
||||||
|
"hidden": false,
|
||||||
|
"disabled": false,
|
||||||
|
"hiddenOnAdd": false,
|
||||||
|
"fieldNote": "",
|
||||||
|
"autoWidth": 50
|
||||||
|
},
|
||||||
|
"advancedSetting": {
|
||||||
|
"defaultValue": {
|
||||||
|
"type": "compose",
|
||||||
|
"value": "",
|
||||||
|
"format": "number",
|
||||||
|
"allowFunc": true,
|
||||||
|
"valueSplit": "",
|
||||||
|
"customConfig": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"remoteAPI": {
|
||||||
|
"url": "",
|
||||||
|
"executed": false
|
||||||
|
},
|
||||||
|
"key": "1717072988159_568693",
|
||||||
|
"model": "money_1717072988159_568693",
|
||||||
|
"modelType": "main",
|
||||||
|
"rules": [],
|
||||||
|
"isSubItem": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "select",
|
||||||
|
"name": "下拉选择框",
|
||||||
|
"className": "form-select",
|
||||||
|
"icon": "icon-select",
|
||||||
|
"hideTitle": false,
|
||||||
|
"options": {
|
||||||
|
"defaultValue": "",
|
||||||
|
"multiple": false,
|
||||||
|
"disabled": false,
|
||||||
|
"clearable": true,
|
||||||
|
"placeholder": "",
|
||||||
|
"required": false,
|
||||||
|
"showLabel": false,
|
||||||
|
"showType": "default",
|
||||||
|
"width": "",
|
||||||
|
"useColor": false,
|
||||||
|
"colorIteratorIndex": 3,
|
||||||
|
"options": [
|
||||||
|
{
|
||||||
|
"value": "下拉框1",
|
||||||
|
"itemColor": "#2196F3"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"value": "下拉框2",
|
||||||
|
"itemColor": "#08C9C9"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"value": "下拉框3",
|
||||||
|
"itemColor": "#00C345"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"remote": false,
|
||||||
|
"filterable": false,
|
||||||
|
"remoteOptions": [],
|
||||||
|
"props": {
|
||||||
|
"value": "value",
|
||||||
|
"label": "label"
|
||||||
|
},
|
||||||
|
"remoteFunc": "",
|
||||||
|
"hidden": false,
|
||||||
|
"hiddenOnAdd": false,
|
||||||
|
"fieldNote": "",
|
||||||
|
"autoWidth": 50
|
||||||
|
},
|
||||||
|
"advancedSetting": {
|
||||||
|
"defaultValue": {
|
||||||
|
"type": "compose",
|
||||||
|
"value": "",
|
||||||
|
"format": "string",
|
||||||
|
"allowFunc": true,
|
||||||
|
"valueSplit": ",",
|
||||||
|
"customConfig": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"remoteAPI": {
|
||||||
|
"url": "",
|
||||||
|
"executed": false
|
||||||
|
},
|
||||||
|
"key": "1717072991431_622198",
|
||||||
|
"model": "select_1717072991431_622198",
|
||||||
|
"modelType": "main",
|
||||||
|
"rules": [],
|
||||||
|
"isSubItem": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"options": {
|
||||||
|
"required": false,
|
||||||
|
"hiddenOnAdd": false,
|
||||||
|
"hidden": false,
|
||||||
|
"fieldNote": ""
|
||||||
|
},
|
||||||
|
"model": "card_1717072988159_545097",
|
||||||
|
"hideTitle": false,
|
||||||
|
"modelType": "main"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "1717072932495_382575",
|
||||||
|
"type": "card",
|
||||||
|
"isAutoGrid": true,
|
||||||
|
"isContainer": true,
|
||||||
|
"list": [
|
||||||
|
{
|
||||||
|
"type": "imgupload",
|
||||||
|
"name": "图片上传",
|
||||||
|
"className": "form-tupian",
|
||||||
|
"icon": "icon-tupian",
|
||||||
|
"hideTitle": false,
|
||||||
|
"options": {
|
||||||
|
"defaultValue": [],
|
||||||
|
"size": {
|
||||||
|
"width": 100,
|
||||||
|
"height": 100
|
||||||
|
},
|
||||||
|
"width": "",
|
||||||
|
"tokenFunc": "funcGetToken",
|
||||||
|
"token": "",
|
||||||
|
"domain": "http://img.h5huodong.com",
|
||||||
|
"disabled": false,
|
||||||
|
"length": 9,
|
||||||
|
"multiple": true,
|
||||||
|
"hidden": false,
|
||||||
|
"hiddenOnAdd": false,
|
||||||
|
"required": false,
|
||||||
|
"fieldNote": "",
|
||||||
|
"autoWidth": 50
|
||||||
|
},
|
||||||
|
"key": "1717072996509_795340",
|
||||||
|
"model": "imgupload_1717072996509_795340",
|
||||||
|
"modelType": "main",
|
||||||
|
"rules": [],
|
||||||
|
"isSubItem": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "file-upload",
|
||||||
|
"name": "附件",
|
||||||
|
"className": "form-file-upload",
|
||||||
|
"icon": "icon-shangchuan",
|
||||||
|
"hideTitle": false,
|
||||||
|
"options": {
|
||||||
|
"defaultValue": [],
|
||||||
|
"token": "",
|
||||||
|
"length": 1,
|
||||||
|
"drag": false,
|
||||||
|
"multiple": false,
|
||||||
|
"disabled": false,
|
||||||
|
"buttonText": "添加附件",
|
||||||
|
"tokenFunc": "funcGetToken",
|
||||||
|
"hidden": false,
|
||||||
|
"hiddenOnAdd": false,
|
||||||
|
"required": false,
|
||||||
|
"fieldNote": "",
|
||||||
|
"autoWidth": 50
|
||||||
|
},
|
||||||
|
"key": "1717072932495_669325",
|
||||||
|
"model": "file_upload_1717072932495_669325",
|
||||||
|
"modelType": "main",
|
||||||
|
"rules": [],
|
||||||
|
"isSubItem": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"options": {
|
||||||
|
"required": false,
|
||||||
|
"hiddenOnAdd": false,
|
||||||
|
"hidden": false,
|
||||||
|
"fieldNote": ""
|
||||||
|
},
|
||||||
|
"model": "card_1717072932495_382575",
|
||||||
|
"hideTitle": false,
|
||||||
|
"modelType": "main"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"config": {
|
||||||
|
"titleField": "input_1717072932495_556479",
|
||||||
|
"showHeaderTitle": true,
|
||||||
|
"labelWidth": 100,
|
||||||
|
"labelPosition": "top",
|
||||||
|
"size": "small",
|
||||||
|
"dialogOptions": {
|
||||||
|
"top": 20,
|
||||||
|
"width": 1000,
|
||||||
|
"padding": {
|
||||||
|
"top": 25,
|
||||||
|
"right": 25,
|
||||||
|
"bottom": 30,
|
||||||
|
"left": 25
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"disabledAutoGrid": false,
|
||||||
|
"designMobileView": false,
|
||||||
|
"enableComment": true,
|
||||||
|
"hasWidgets": [
|
||||||
|
"input",
|
||||||
|
"number",
|
||||||
|
"card",
|
||||||
|
"money",
|
||||||
|
"select",
|
||||||
|
"imgupload",
|
||||||
|
"file-upload"
|
||||||
|
],
|
||||||
|
"expand": {
|
||||||
|
"js": "",
|
||||||
|
"css": "",
|
||||||
|
"url": {
|
||||||
|
"js": "",
|
||||||
|
"css": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"transactional": true,
|
||||||
|
"customRequestURL": [
|
||||||
|
{
|
||||||
|
"url": ""
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"allowExternalLink": false,
|
||||||
|
"externalLinkShowData": false,
|
||||||
|
"headerImgUrl": "",
|
||||||
|
"externalTitle": "",
|
||||||
|
"enableNotice": false,
|
||||||
|
"noticeMode": "external",
|
||||||
|
"noticeType": "system",
|
||||||
|
"noticeReceiver": "",
|
||||||
|
"allowPrint": false,
|
||||||
|
"allowJmReport": false,
|
||||||
|
"jmReportURL": "",
|
||||||
|
"bizRuleConfig": [],
|
||||||
|
"bigDataMode": false
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,496 @@
|
|||||||
|
{
|
||||||
|
"list": [
|
||||||
|
{
|
||||||
|
"hideTitle": false,
|
||||||
|
"options": {
|
||||||
|
"hidden": false,
|
||||||
|
"hiddenOnAdd": false,
|
||||||
|
"fieldNote": "",
|
||||||
|
"required": false
|
||||||
|
},
|
||||||
|
"isContainer": true,
|
||||||
|
"model": "card_1717072902303_783177",
|
||||||
|
"modelType": "main",
|
||||||
|
"type": "card",
|
||||||
|
"isAutoGrid": true,
|
||||||
|
"list": [
|
||||||
|
{
|
||||||
|
"isSubItem": false,
|
||||||
|
"remoteAPI": {
|
||||||
|
"executed": false,
|
||||||
|
"url": ""
|
||||||
|
},
|
||||||
|
"icon": "icon-input",
|
||||||
|
"className": "form-input",
|
||||||
|
"rules": [
|
||||||
|
{
|
||||||
|
"required": true,
|
||||||
|
"message": "${title}必须填写"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"modelType": "main",
|
||||||
|
"type": "input",
|
||||||
|
"hideTitle": false,
|
||||||
|
"name": "名称",
|
||||||
|
"options": {
|
||||||
|
"clearable": false,
|
||||||
|
"hidden": false,
|
||||||
|
"defaultValue": "",
|
||||||
|
"pattern": "",
|
||||||
|
"fillRuleCode": "",
|
||||||
|
"fieldNote": "",
|
||||||
|
"required": true,
|
||||||
|
"readonly": false,
|
||||||
|
"unique": false,
|
||||||
|
"hiddenOnAdd": false,
|
||||||
|
"width": "100%",
|
||||||
|
"autoWidth": 100,
|
||||||
|
"showPassword": false,
|
||||||
|
"disabled": false,
|
||||||
|
"placeholder": ""
|
||||||
|
},
|
||||||
|
"model": "input_1717072902303_477529",
|
||||||
|
"advancedSetting": {
|
||||||
|
"defaultValue": {
|
||||||
|
"type": "compose",
|
||||||
|
"value": "",
|
||||||
|
"format": "string",
|
||||||
|
"allowFunc": true,
|
||||||
|
"valueSplit": "",
|
||||||
|
"customConfig": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"key": "1717072902303_477529"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"key": "1717072902303_783177"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"options": {
|
||||||
|
"required": false,
|
||||||
|
"hiddenOnAdd": false,
|
||||||
|
"hidden": false,
|
||||||
|
"fieldNote": ""
|
||||||
|
},
|
||||||
|
"isContainer": true,
|
||||||
|
"model": "card_1717073019436_526262",
|
||||||
|
"type": "card",
|
||||||
|
"isAutoGrid": true,
|
||||||
|
"list": [
|
||||||
|
{
|
||||||
|
"isSubItem": false,
|
||||||
|
"remoteAPI": {
|
||||||
|
"executed": false,
|
||||||
|
"url": ""
|
||||||
|
},
|
||||||
|
"icon": "icon-number",
|
||||||
|
"className": "form-number",
|
||||||
|
"rules": [],
|
||||||
|
"modelType": "main",
|
||||||
|
"type": "number",
|
||||||
|
"hideTitle": false,
|
||||||
|
"name": "数字",
|
||||||
|
"options": {
|
||||||
|
"controls": false,
|
||||||
|
"showPercent": false,
|
||||||
|
"hidden": false,
|
||||||
|
"max": 100,
|
||||||
|
"defaultValue": 0,
|
||||||
|
"unitPosition": "suffix",
|
||||||
|
"fieldNote": "",
|
||||||
|
"maxUnlimited": true,
|
||||||
|
"align": "left",
|
||||||
|
"required": false,
|
||||||
|
"min": 0,
|
||||||
|
"minUnlimited": true,
|
||||||
|
"hiddenOnAdd": false,
|
||||||
|
"width": "",
|
||||||
|
"autoWidth": 50,
|
||||||
|
"step": 1,
|
||||||
|
"disabled": false,
|
||||||
|
"placeholder": "",
|
||||||
|
"controlsPosition": "right",
|
||||||
|
"unitText": ""
|
||||||
|
},
|
||||||
|
"model": "number_1717073019436_586474",
|
||||||
|
"advancedSetting": {
|
||||||
|
"defaultValue": {
|
||||||
|
"type": "compose",
|
||||||
|
"value": "",
|
||||||
|
"format": "number",
|
||||||
|
"allowFunc": true,
|
||||||
|
"valueSplit": "",
|
||||||
|
"customConfig": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"key": "1717073019436_586474"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"isSubItem": false,
|
||||||
|
"remoteAPI": {
|
||||||
|
"executed": false,
|
||||||
|
"url": ""
|
||||||
|
},
|
||||||
|
"icon": "icon-money",
|
||||||
|
"className": "form-money",
|
||||||
|
"rules": [],
|
||||||
|
"modelType": "main",
|
||||||
|
"type": "money",
|
||||||
|
"hideTitle": false,
|
||||||
|
"name": "金额",
|
||||||
|
"options": {
|
||||||
|
"hidden": false,
|
||||||
|
"precision": 2,
|
||||||
|
"hiddenOnAdd": false,
|
||||||
|
"width": "180px",
|
||||||
|
"autoWidth": 50,
|
||||||
|
"unitPosition": "suffix",
|
||||||
|
"disabled": false,
|
||||||
|
"fieldNote": "",
|
||||||
|
"placeholder": "请输入金额",
|
||||||
|
"required": false,
|
||||||
|
"unitText": "元"
|
||||||
|
},
|
||||||
|
"model": "money_1717073021100_526660",
|
||||||
|
"advancedSetting": {
|
||||||
|
"defaultValue": {
|
||||||
|
"type": "compose",
|
||||||
|
"value": "",
|
||||||
|
"format": "number",
|
||||||
|
"allowFunc": true,
|
||||||
|
"valueSplit": "",
|
||||||
|
"customConfig": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"key": "1717073021100_526660"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"key": "1717073019436_526262",
|
||||||
|
"hideTitle": false,
|
||||||
|
"modelType": "main"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"hideTitle": false,
|
||||||
|
"options": {
|
||||||
|
"hidden": false,
|
||||||
|
"hiddenOnAdd": false,
|
||||||
|
"fieldNote": "",
|
||||||
|
"required": false
|
||||||
|
},
|
||||||
|
"isContainer": true,
|
||||||
|
"model": "card_1717072902303_118977",
|
||||||
|
"modelType": "main",
|
||||||
|
"type": "card",
|
||||||
|
"isAutoGrid": true,
|
||||||
|
"list": [
|
||||||
|
{
|
||||||
|
"isSubItem": false,
|
||||||
|
"remoteAPI": {
|
||||||
|
"executed": false,
|
||||||
|
"url": ""
|
||||||
|
},
|
||||||
|
"icon": "icon-select",
|
||||||
|
"className": "form-select",
|
||||||
|
"rules": [],
|
||||||
|
"modelType": "main",
|
||||||
|
"type": "select",
|
||||||
|
"hideTitle": false,
|
||||||
|
"name": "下拉选择框",
|
||||||
|
"options": {
|
||||||
|
"remoteFunc": "",
|
||||||
|
"filterable": false,
|
||||||
|
"clearable": true,
|
||||||
|
"hidden": false,
|
||||||
|
"defaultValue": "",
|
||||||
|
"remoteOptions": [],
|
||||||
|
"multiple": false,
|
||||||
|
"fieldNote": "",
|
||||||
|
"remote": false,
|
||||||
|
"required": false,
|
||||||
|
"showLabel": false,
|
||||||
|
"useColor": false,
|
||||||
|
"props": {
|
||||||
|
"label": "label",
|
||||||
|
"value": "value"
|
||||||
|
},
|
||||||
|
"colorIteratorIndex": 3,
|
||||||
|
"hiddenOnAdd": false,
|
||||||
|
"width": "",
|
||||||
|
"options": [
|
||||||
|
{
|
||||||
|
"itemColor": "#2196F3",
|
||||||
|
"value": "下拉框1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"itemColor": "#08C9C9",
|
||||||
|
"value": "下拉框2"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"itemColor": "#00C345",
|
||||||
|
"value": "下拉框3"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"autoWidth": 50,
|
||||||
|
"showType": "default",
|
||||||
|
"disabled": false,
|
||||||
|
"placeholder": ""
|
||||||
|
},
|
||||||
|
"model": "select_1717073033259_273399",
|
||||||
|
"advancedSetting": {
|
||||||
|
"defaultValue": {
|
||||||
|
"type": "compose",
|
||||||
|
"value": "",
|
||||||
|
"format": "string",
|
||||||
|
"allowFunc": true,
|
||||||
|
"valueSplit": ",",
|
||||||
|
"customConfig": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"key": "1717073033259_273399"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"isSubItem": false,
|
||||||
|
"remoteAPI": {
|
||||||
|
"executed": false,
|
||||||
|
"url": ""
|
||||||
|
},
|
||||||
|
"icon": "icon-textarea",
|
||||||
|
"className": "form-textarea",
|
||||||
|
"rules": [],
|
||||||
|
"modelType": "main",
|
||||||
|
"type": "textarea",
|
||||||
|
"hideTitle": false,
|
||||||
|
"name": "描述",
|
||||||
|
"options": {
|
||||||
|
"readonly": false,
|
||||||
|
"hidden": false,
|
||||||
|
"defaultValue": "",
|
||||||
|
"unique": false,
|
||||||
|
"hiddenOnAdd": false,
|
||||||
|
"width": "100%",
|
||||||
|
"pattern": "",
|
||||||
|
"autoWidth": 50,
|
||||||
|
"disabled": false,
|
||||||
|
"fieldNote": "",
|
||||||
|
"placeholder": "",
|
||||||
|
"required": false
|
||||||
|
},
|
||||||
|
"model": "textarea_1717072902303_129466",
|
||||||
|
"advancedSetting": {
|
||||||
|
"defaultValue": {
|
||||||
|
"type": "compose",
|
||||||
|
"value": "",
|
||||||
|
"format": "string",
|
||||||
|
"allowFunc": true,
|
||||||
|
"valueSplit": "",
|
||||||
|
"customConfig": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"key": "1717072902303_129466"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"key": "1717072902303_118977"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"hideTitle": false,
|
||||||
|
"options": {
|
||||||
|
"hidden": false,
|
||||||
|
"hiddenOnAdd": false,
|
||||||
|
"fieldNote": "",
|
||||||
|
"required": false
|
||||||
|
},
|
||||||
|
"isContainer": true,
|
||||||
|
"model": "card_1717072902304_736053",
|
||||||
|
"modelType": "main",
|
||||||
|
"type": "card",
|
||||||
|
"isAutoGrid": true,
|
||||||
|
"list": [
|
||||||
|
{
|
||||||
|
"hideTitle": false,
|
||||||
|
"isSubItem": false,
|
||||||
|
"name": "图片上传",
|
||||||
|
"icon": "icon-tupian",
|
||||||
|
"options": {
|
||||||
|
"hidden": false,
|
||||||
|
"defaultValue": [],
|
||||||
|
"length": 9,
|
||||||
|
"multiple": true,
|
||||||
|
"fieldNote": "",
|
||||||
|
"required": false,
|
||||||
|
"token": "",
|
||||||
|
"size": {
|
||||||
|
"width": 100,
|
||||||
|
"height": 100
|
||||||
|
},
|
||||||
|
"tokenFunc": "funcGetToken",
|
||||||
|
"domain": "http://img.h5huodong.com",
|
||||||
|
"hiddenOnAdd": false,
|
||||||
|
"width": "",
|
||||||
|
"autoWidth": 50,
|
||||||
|
"disabled": false
|
||||||
|
},
|
||||||
|
"className": "form-tupian",
|
||||||
|
"model": "imgupload_1717073025137_563739",
|
||||||
|
"rules": [],
|
||||||
|
"modelType": "main",
|
||||||
|
"type": "imgupload",
|
||||||
|
"key": "1717073025137_563739"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"hideTitle": false,
|
||||||
|
"isSubItem": false,
|
||||||
|
"name": "附件",
|
||||||
|
"icon": "icon-shangchuan",
|
||||||
|
"options": {
|
||||||
|
"buttonText": "添加附件",
|
||||||
|
"hidden": false,
|
||||||
|
"defaultValue": [],
|
||||||
|
"length": 1,
|
||||||
|
"multiple": false,
|
||||||
|
"fieldNote": "",
|
||||||
|
"required": false,
|
||||||
|
"token": "",
|
||||||
|
"tokenFunc": "funcGetToken",
|
||||||
|
"hiddenOnAdd": false,
|
||||||
|
"autoWidth": 50,
|
||||||
|
"disabled": false,
|
||||||
|
"drag": false
|
||||||
|
},
|
||||||
|
"className": "form-file-upload",
|
||||||
|
"model": "file_upload_1717072902304_442777",
|
||||||
|
"rules": [],
|
||||||
|
"modelType": "main",
|
||||||
|
"type": "file-upload",
|
||||||
|
"key": "1717072902304_442777"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"key": "1717072902304_736053"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"isSubItem": false,
|
||||||
|
"remoteAPI": {
|
||||||
|
"url": "",
|
||||||
|
"executed": false
|
||||||
|
},
|
||||||
|
"icon": "icon-link",
|
||||||
|
"className": "form-link-record",
|
||||||
|
"rules": [],
|
||||||
|
"modelType": "main",
|
||||||
|
"type": "link-record",
|
||||||
|
"hideTitle": false,
|
||||||
|
"name": "主表@表单控件",
|
||||||
|
"options": {
|
||||||
|
"sourceCode": "ai_control_main",
|
||||||
|
"showMode": "single",
|
||||||
|
"showType": "card",
|
||||||
|
"titleField": "wen_ben",
|
||||||
|
"showFields": [],
|
||||||
|
"allowView": true,
|
||||||
|
"allowEdit": true,
|
||||||
|
"allowAdd": true,
|
||||||
|
"allowSelect": true,
|
||||||
|
"buttonText": "添加记录",
|
||||||
|
"twoWayModel": "sub_table_design_1717137038626_791984",
|
||||||
|
"dataSelectAuth": "all",
|
||||||
|
"filters": [
|
||||||
|
{
|
||||||
|
"matchType": "AND",
|
||||||
|
"rules": []
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"search": {
|
||||||
|
"enabled": false,
|
||||||
|
"field": "",
|
||||||
|
"rule": "like",
|
||||||
|
"afterShow": false,
|
||||||
|
"fields": []
|
||||||
|
},
|
||||||
|
"createMode": {
|
||||||
|
"add": true,
|
||||||
|
"select": false,
|
||||||
|
"params": {
|
||||||
|
"selectLinkModel": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"width": "100%",
|
||||||
|
"defaultValue": "",
|
||||||
|
"defaultValType": "none",
|
||||||
|
"required": false,
|
||||||
|
"disabled": false,
|
||||||
|
"hidden": false,
|
||||||
|
"hiddenOnAdd": false,
|
||||||
|
"fieldNote": ""
|
||||||
|
},
|
||||||
|
"model": "link_record_1717137044235_306956",
|
||||||
|
"advancedSetting": {
|
||||||
|
"defaultValue": {
|
||||||
|
"type": "compose",
|
||||||
|
"value": "",
|
||||||
|
"format": "string",
|
||||||
|
"allowFunc": true,
|
||||||
|
"valueSplit": "",
|
||||||
|
"customConfig": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"key": "1717137044235_306956"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"config": {
|
||||||
|
"jmReportURL": "",
|
||||||
|
"enableComment": true,
|
||||||
|
"dialogOptions": {
|
||||||
|
"padding": {
|
||||||
|
"top": 25,
|
||||||
|
"left": 25,
|
||||||
|
"bottom": 30,
|
||||||
|
"right": 25
|
||||||
|
},
|
||||||
|
"top": 20,
|
||||||
|
"width": 1000
|
||||||
|
},
|
||||||
|
"allowJmReport": false,
|
||||||
|
"labelWidth": 100,
|
||||||
|
"headerImgUrl": "",
|
||||||
|
"noticeMode": "external",
|
||||||
|
"noticeReceiver": "",
|
||||||
|
"designMobileView": false,
|
||||||
|
"labelPosition": "top",
|
||||||
|
"allowPrint": false,
|
||||||
|
"enableNotice": false,
|
||||||
|
"bizRuleConfig": [],
|
||||||
|
"showHeaderTitle": true,
|
||||||
|
"bigDataMode": false,
|
||||||
|
"titleField": "input_1717072902303_477529",
|
||||||
|
"externalTitle": "",
|
||||||
|
"noticeType": "system",
|
||||||
|
"customRequestURL": [
|
||||||
|
{
|
||||||
|
"url": ""
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"hasWidgets": [
|
||||||
|
"input",
|
||||||
|
"card",
|
||||||
|
"number",
|
||||||
|
"money",
|
||||||
|
"select",
|
||||||
|
"textarea",
|
||||||
|
"imgupload",
|
||||||
|
"file-upload",
|
||||||
|
"link-record"
|
||||||
|
],
|
||||||
|
"expand": {
|
||||||
|
"css": "",
|
||||||
|
"js": "",
|
||||||
|
"url": {
|
||||||
|
"css": "",
|
||||||
|
"js": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"size": "small",
|
||||||
|
"disabledAutoGrid": false,
|
||||||
|
"allowExternalLink": false,
|
||||||
|
"externalLinkShowData": false,
|
||||||
|
"transactional": true
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>jeecg-system-api</artifactId>
|
<artifactId>jeecg-system-api</artifactId>
|
||||||
<groupId>org.jeecgframework.boot</groupId>
|
<groupId>org.jeecgframework.boot</groupId>
|
||||||
<version>3.7.1</version>
|
<version>3.7.3</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>jeecg-system-api</artifactId>
|
<artifactId>jeecg-system-api</artifactId>
|
||||||
<groupId>org.jeecgframework.boot</groupId>
|
<groupId>org.jeecgframework.boot</groupId>
|
||||||
<version>3.7.1</version>
|
<version>3.7.3</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>jeecg-module-system</artifactId>
|
<artifactId>jeecg-module-system</artifactId>
|
||||||
<groupId>org.jeecgframework.boot</groupId>
|
<groupId>org.jeecgframework.boot</groupId>
|
||||||
<version>3.7.1</version>
|
<version>3.7.3</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
@ -4,7 +4,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>org.jeecgframework.boot</groupId>
|
<groupId>org.jeecgframework.boot</groupId>
|
||||||
<artifactId>jeecg-module-system</artifactId>
|
<artifactId>jeecg-module-system</artifactId>
|
||||||
<version>3.7.1</version>
|
<version>3.7.3</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
@ -20,30 +20,29 @@
|
|||||||
<artifactId>hibernate-core</artifactId>
|
<artifactId>hibernate-core</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.jeecgframework.boot</groupId>
|
<groupId>org.jeecgframework.boot3</groupId>
|
||||||
<artifactId>hibernate-re</artifactId>
|
<artifactId>hibernate-re</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- 企业微信/钉钉 api -->
|
<!-- 企业微信/钉钉 api -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.jeecgframework</groupId>
|
<groupId>org.jeecgframework</groupId>
|
||||||
<artifactId>jeewx-api</artifactId>
|
<artifactId>weixin4j</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
<!-- 积木报表 -->
|
<!-- 积木报表 -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.jeecgframework.jimureport</groupId>
|
<groupId>org.jeecgframework.jimureport</groupId>
|
||||||
<artifactId>jimureport-spring-boot-starter</artifactId>
|
<artifactId>jimureport-spring-boot3-starter-fastjson2</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
<!-- 积木仪表盘 -->
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.jeecgframework.jimureport</groupId>
|
|
||||||
<artifactId>jimureport-dashboard-spring-boot-starter</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<!-- 积木报表 mongo redis 支持包
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.jeecgframework.jimureport</groupId>
|
<groupId>org.jeecgframework.jimureport</groupId>
|
||||||
<artifactId>jimureport-nosql-starter</artifactId>
|
<artifactId>jimureport-nosql-starter</artifactId>
|
||||||
</dependency>-->
|
</dependency>
|
||||||
|
<!-- 积木BI -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.jeecgframework.jimureport</groupId>
|
||||||
|
<artifactId>jimubi-spring-boot3-starter</artifactId>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
</project>
|
</project>
|
||||||
|
|||||||
@ -1,33 +1,33 @@
|
|||||||
package org.jeecg.config.init;
|
//package org.jeecg.config.init;
|
||||||
|
//
|
||||||
import org.apache.catalina.Context;
|
//import org.apache.catalina.Context;
|
||||||
import org.apache.tomcat.util.scan.StandardJarScanner;
|
//import org.apache.tomcat.util.scan.StandardJarScanner;
|
||||||
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
|
//import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
|
||||||
import org.springframework.context.annotation.Bean;
|
//import org.springframework.context.annotation.Bean;
|
||||||
import org.springframework.context.annotation.Configuration;
|
//import org.springframework.context.annotation.Configuration;
|
||||||
|
//
|
||||||
/**
|
///**
|
||||||
* @Description: TomcatFactoryConfig
|
// * @Description: TomcatFactoryConfig
|
||||||
* @author: scott
|
// * @author: scott
|
||||||
* @date: 2021年01月25日 11:40
|
// * @date: 2021年01月25日 11:40
|
||||||
*/
|
// */
|
||||||
@Configuration
|
//@Configuration
|
||||||
public class TomcatFactoryConfig {
|
//public class TomcatFactoryConfig {
|
||||||
/**
|
// /**
|
||||||
* tomcat-embed-jasper引用后提示jar找不到的问题
|
// * tomcat-embed-jasper引用后提示jar找不到的问题
|
||||||
*/
|
// */
|
||||||
@Bean
|
// @Bean
|
||||||
public TomcatServletWebServerFactory tomcatFactory() {
|
// public TomcatServletWebServerFactory tomcatFactory() {
|
||||||
TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory() {
|
// TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory() {
|
||||||
@Override
|
// @Override
|
||||||
protected void postProcessContext(Context context) {
|
// protected void postProcessContext(Context context) {
|
||||||
((StandardJarScanner) context.getJarScanner()).setScanManifest(false);
|
// ((StandardJarScanner) context.getJarScanner()).setScanManifest(false);
|
||||||
}
|
// }
|
||||||
};
|
// };
|
||||||
factory.addConnectorCustomizers(connector -> {
|
// factory.addConnectorCustomizers(connector -> {
|
||||||
connector.setProperty("relaxedPathChars", "[]{}");
|
// connector.setProperty("relaxedPathChars", "[]{}");
|
||||||
connector.setProperty("relaxedQueryChars", "[]{}");
|
// connector.setProperty("relaxedQueryChars", "[]{}");
|
||||||
});
|
// });
|
||||||
return factory;
|
// return factory;
|
||||||
}
|
// }
|
||||||
}
|
//}
|
||||||
|
|||||||
@ -12,7 +12,7 @@ import org.springframework.context.annotation.Lazy;
|
|||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
import org.springframework.util.CollectionUtils;
|
import org.springframework.util.CollectionUtils;
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
@ -36,11 +36,7 @@ public class JimuReportTokenService implements JmReportTokenServiceI {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getToken(HttpServletRequest request) {
|
public String getToken(HttpServletRequest request) {
|
||||||
try {
|
|
||||||
return TokenUtils.getTokenByRequest(request);
|
return TokenUtils.getTokenByRequest(request);
|
||||||
} catch (Exception e) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -82,4 +78,30 @@ public class JimuReportTokenService implements JmReportTokenServiceI {
|
|||||||
// 将所有信息存放至map 解析sql/api会根据map的键值解析
|
// 将所有信息存放至map 解析sql/api会根据map的键值解析
|
||||||
return map;
|
return map;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将jeecgboot平台的权限传递给积木报表
|
||||||
|
* @param token
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String[] getPermissions(String token) {
|
||||||
|
// 获取用户信息
|
||||||
|
String username = JwtUtil.getUsername(token);
|
||||||
|
SysUserCacheInfo userInfo = null;
|
||||||
|
try {
|
||||||
|
userInfo = sysBaseApi.getCacheUser(username);
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("获取用户信息异常:"+ e.getMessage());
|
||||||
|
}
|
||||||
|
if(userInfo == null){
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
// 查询权限
|
||||||
|
Set<String> userPermissions = sysBaseApi.getUserPermissionSet(userInfo.getSysUserId());
|
||||||
|
if(CollectionUtils.isEmpty(userPermissions)){
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return userPermissions.toArray(new String[0]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -15,7 +15,7 @@ import org.jeecg.modules.system.entity.SysTenantPack;
|
|||||||
import org.jeecg.modules.system.entity.SysTenantPackUser;
|
import org.jeecg.modules.system.entity.SysTenantPackUser;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
|
||||||
|
|||||||
@ -2,8 +2,8 @@ package org.jeecg.modules.cas.controller;
|
|||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import jakarta.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
import org.apache.commons.lang.StringUtils;
|
import org.apache.commons.lang.StringUtils;
|
||||||
import org.jeecg.common.api.vo.Result;
|
import org.jeecg.common.api.vo.Result;
|
||||||
|
|||||||
@ -2,8 +2,8 @@ package org.jeecg.modules.message.controller;
|
|||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import jakarta.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
import org.jeecg.common.api.vo.Result;
|
import org.jeecg.common.api.vo.Result;
|
||||||
import org.jeecg.common.system.base.controller.JeecgController;
|
import org.jeecg.common.system.base.controller.JeecgController;
|
||||||
|
|||||||
@ -3,8 +3,8 @@ package org.jeecg.modules.message.controller;
|
|||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import jakarta.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
import org.jeecg.common.api.dto.message.MessageDTO;
|
import org.jeecg.common.api.dto.message.MessageDTO;
|
||||||
import org.jeecg.common.api.vo.Result;
|
import org.jeecg.common.api.vo.Result;
|
||||||
|
|||||||
@ -5,12 +5,15 @@ import lombok.extern.slf4j.Slf4j;
|
|||||||
import org.apache.commons.lang3.ObjectUtils;
|
import org.apache.commons.lang3.ObjectUtils;
|
||||||
import org.jeecg.common.api.dto.message.MessageDTO;
|
import org.jeecg.common.api.dto.message.MessageDTO;
|
||||||
import org.jeecg.common.constant.CommonConstant;
|
import org.jeecg.common.constant.CommonConstant;
|
||||||
|
import org.jeecg.common.constant.enums.MessageTypeEnum;
|
||||||
import org.jeecg.common.system.util.JwtUtil;
|
import org.jeecg.common.system.util.JwtUtil;
|
||||||
import org.jeecg.common.util.RedisUtil;
|
import org.jeecg.common.util.RedisUtil;
|
||||||
import org.jeecg.common.util.SpringContextUtils;
|
import org.jeecg.common.util.SpringContextUtils;
|
||||||
import org.jeecg.common.util.oConvertUtils;
|
import org.jeecg.common.util.oConvertUtils;
|
||||||
import org.jeecg.config.StaticConfig;
|
import org.jeecg.config.StaticConfig;
|
||||||
|
import org.jeecg.modules.message.entity.SysMessage;
|
||||||
import org.jeecg.modules.message.handle.ISendMsgHandle;
|
import org.jeecg.modules.message.handle.ISendMsgHandle;
|
||||||
|
import org.jeecg.modules.message.mapper.SysMessageMapper;
|
||||||
import org.jeecg.modules.system.entity.SysUser;
|
import org.jeecg.modules.system.entity.SysUser;
|
||||||
import org.jeecg.modules.system.mapper.SysUserMapper;
|
import org.jeecg.modules.system.mapper.SysUserMapper;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
@ -18,8 +21,8 @@ import org.springframework.mail.javamail.JavaMailSender;
|
|||||||
import org.springframework.mail.javamail.MimeMessageHelper;
|
import org.springframework.mail.javamail.MimeMessageHelper;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
import javax.mail.MessagingException;
|
import jakarta.mail.MessagingException;
|
||||||
import javax.mail.internet.MimeMessage;
|
import jakarta.mail.internet.MimeMessage;
|
||||||
import java.io.UnsupportedEncodingException;
|
import java.io.UnsupportedEncodingException;
|
||||||
import java.net.URLEncoder;
|
import java.net.URLEncoder;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -44,6 +47,9 @@ public class EmailSendMsgHandle implements ISendMsgHandle {
|
|||||||
@Autowired
|
@Autowired
|
||||||
private RedisUtil redisUtil;
|
private RedisUtil redisUtil;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private SysMessageMapper sysMessageMapper;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 真实姓名变量
|
* 真实姓名变量
|
||||||
*/
|
*/
|
||||||
@ -78,6 +84,23 @@ public class EmailSendMsgHandle implements ISendMsgHandle {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void sendMessage(MessageDTO messageDTO) {
|
public void sendMessage(MessageDTO messageDTO) {
|
||||||
|
String content = messageDTO.getContent();
|
||||||
|
String title = messageDTO.getTitle();
|
||||||
|
//update-begin---author:wangshuai---date:2024-11-20---for:【QQYUN-8523】敲敲云发邮件通知,不稳定---
|
||||||
|
boolean timeJobSendEmail = this.isTimeJobSendEmail(messageDTO.getToUser(), title, content);
|
||||||
|
if(timeJobSendEmail){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
//update-end---author:wangshuai---date:2024-11-20---for:【QQYUN-8523】敲敲云发邮件通知,不稳定---
|
||||||
|
this.sendEmailMessage(messageDTO);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 直接发送邮件
|
||||||
|
*
|
||||||
|
* @param messageDTO
|
||||||
|
*/
|
||||||
|
public void sendEmailMessage(MessageDTO messageDTO) {
|
||||||
String[] arr = messageDTO.getToUser().split(",");
|
String[] arr = messageDTO.getToUser().split(",");
|
||||||
LambdaQueryWrapper<SysUser> query = new LambdaQueryWrapper<SysUser>().in(SysUser::getUsername, arr);
|
LambdaQueryWrapper<SysUser> query = new LambdaQueryWrapper<SysUser>().in(SysUser::getUsername, arr);
|
||||||
List<SysUser> list = sysUserMapper.selectList(query);
|
List<SysUser> list = sysUserMapper.selectList(query);
|
||||||
@ -213,4 +236,35 @@ public class EmailSendMsgHandle implements ISendMsgHandle {
|
|||||||
redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, JwtUtil.EXPIRE_TIME * 1 / 1000);
|
redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, JwtUtil.EXPIRE_TIME * 1 / 1000);
|
||||||
return token;
|
return token;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否定时发送邮箱
|
||||||
|
* @param toUser
|
||||||
|
* @param title
|
||||||
|
* @param content
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private boolean isTimeJobSendEmail(String toUser, String title, String content) {
|
||||||
|
StaticConfig staticConfig = SpringContextUtils.getBean(StaticConfig.class);
|
||||||
|
Boolean timeJobSend = staticConfig.getTimeJobSend();
|
||||||
|
if(null != timeJobSend && timeJobSend){
|
||||||
|
this.addSysSmsSend(toUser,title,content);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 保存到短信发送表
|
||||||
|
*/
|
||||||
|
private void addSysSmsSend(String toUser, String title, String content) {
|
||||||
|
SysMessage sysMessage = new SysMessage();
|
||||||
|
sysMessage.setEsTitle(title);
|
||||||
|
sysMessage.setEsContent(content);
|
||||||
|
sysMessage.setEsReceiver(toUser);
|
||||||
|
sysMessage.setEsSendStatus("0");
|
||||||
|
sysMessage.setEsSendNum(0);
|
||||||
|
sysMessage.setEsType(MessageTypeEnum.YJ.getType());
|
||||||
|
sysMessageMapper.insert(sysMessage);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -19,7 +19,7 @@ import org.jeecg.modules.system.mapper.SysAnnouncementSendMapper;
|
|||||||
import org.jeecg.modules.system.mapper.SysUserMapper;
|
import org.jeecg.modules.system.mapper.SysUserMapper;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
|
|||||||
@ -51,6 +51,9 @@ public class SendMsgJob implements Job {
|
|||||||
md.setToUser(sysMessage.getEsReceiver());
|
md.setToUser(sysMessage.getEsReceiver());
|
||||||
md.setType(sysMessage.getEsType());
|
md.setType(sysMessage.getEsType());
|
||||||
md.setToAll(false);
|
md.setToAll(false);
|
||||||
|
//update-begin---author:wangshuai---date:2024-11-12---for:【QQYUN-8523】敲敲云发邮件通知,不稳定---
|
||||||
|
md.setIsTimeJob(true);
|
||||||
|
//update-end---author:wangshuai---date:2024-11-12---for:【QQYUN-8523】敲敲云发邮件通知,不稳定---
|
||||||
sysBaseAPI.sendTemplateMessage(md);
|
sysBaseAPI.sendTemplateMessage(md);
|
||||||
//发送消息成功
|
//发送消息成功
|
||||||
sysMessage.setEsSendStatus(SendMsgStatusEnum.SUCCESS.getCode());
|
sysMessage.setEsSendStatus(SendMsgStatusEnum.SUCCESS.getCode());
|
||||||
|
|||||||
@ -2,9 +2,9 @@ package org.jeecg.modules.message.websocket;
|
|||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import javax.websocket.*;
|
import jakarta.websocket.*;
|
||||||
import javax.websocket.server.PathParam;
|
import jakarta.websocket.server.PathParam;
|
||||||
import javax.websocket.server.ServerEndpoint;
|
import jakarta.websocket.server.ServerEndpoint;
|
||||||
|
|
||||||
import com.alibaba.fastjson.JSONObject;
|
import com.alibaba.fastjson.JSONObject;
|
||||||
import org.jeecg.common.base.BaseMap;
|
import org.jeecg.common.base.BaseMap;
|
||||||
|
|||||||
@ -1,9 +1,9 @@
|
|||||||
package org.jeecg.modules.monitor.actuator;
|
package org.jeecg.modules.monitor.actuator;
|
||||||
|
|
||||||
import org.jeecg.modules.monitor.actuator.httptrace.CustomInMemoryHttpTraceRepository;
|
import org.jeecg.modules.monitor.actuator.httptrace.CustomInMemoryHttpTraceRepository;
|
||||||
import org.springframework.boot.actuate.autoconfigure.trace.http.HttpTraceAutoConfiguration;
|
import org.springframework.boot.actuate.autoconfigure.web.exchanges.HttpExchangesAutoConfiguration;
|
||||||
import org.springframework.boot.actuate.autoconfigure.trace.http.HttpTraceProperties;
|
import org.springframework.boot.actuate.autoconfigure.web.exchanges.HttpExchangesProperties;
|
||||||
import org.springframework.boot.actuate.trace.http.HttpTraceRepository;
|
import org.springframework.boot.actuate.web.exchanges.HttpExchangeRepository;
|
||||||
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
|
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
|
||||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
|
||||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||||
@ -18,8 +18,8 @@ import org.springframework.context.annotation.Configuration;
|
|||||||
* @Date: 2024/5/13 17:20
|
* @Date: 2024/5/13 17:20
|
||||||
*/
|
*/
|
||||||
@Configuration
|
@Configuration
|
||||||
@EnableConfigurationProperties(HttpTraceProperties.class)
|
@EnableConfigurationProperties(HttpExchangesProperties.class)
|
||||||
@AutoConfigureBefore(HttpTraceAutoConfiguration.class)
|
@AutoConfigureBefore(HttpExchangesAutoConfiguration.class)
|
||||||
public class CustomActuatorConfig {
|
public class CustomActuatorConfig {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -30,7 +30,7 @@ public class CustomActuatorConfig {
|
|||||||
*/
|
*/
|
||||||
@Bean
|
@Bean
|
||||||
@ConditionalOnProperty(prefix = "management.trace.http", name = "enabled", matchIfMissing = true)
|
@ConditionalOnProperty(prefix = "management.trace.http", name = "enabled", matchIfMissing = true)
|
||||||
@ConditionalOnMissingBean(HttpTraceRepository.class)
|
@ConditionalOnMissingBean(HttpExchangeRepository.class)
|
||||||
public CustomInMemoryHttpTraceRepository traceRepository() {
|
public CustomInMemoryHttpTraceRepository traceRepository() {
|
||||||
return new CustomInMemoryHttpTraceRepository();
|
return new CustomInMemoryHttpTraceRepository();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -4,7 +4,7 @@ import lombok.Getter;
|
|||||||
import org.springframework.boot.actuate.endpoint.annotation.Endpoint;
|
import org.springframework.boot.actuate.endpoint.annotation.Endpoint;
|
||||||
import org.springframework.boot.actuate.endpoint.annotation.ReadOperation;
|
import org.springframework.boot.actuate.endpoint.annotation.ReadOperation;
|
||||||
import org.springframework.boot.actuate.endpoint.annotation.Selector;
|
import org.springframework.boot.actuate.endpoint.annotation.Selector;
|
||||||
import org.springframework.boot.actuate.trace.http.HttpTrace;
|
import org.springframework.boot.actuate.web.exchanges.HttpExchange;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
import org.springframework.util.Assert;
|
import org.springframework.util.Assert;
|
||||||
|
|
||||||
@ -18,7 +18,7 @@ import static org.springframework.boot.actuate.endpoint.annotation.Selector.Matc
|
|||||||
* @Date: 2024/5/13 17:02
|
* @Date: 2024/5/13 17:02
|
||||||
*/
|
*/
|
||||||
@Component
|
@Component
|
||||||
@Endpoint(id = "httptrace-new")
|
@Endpoint(id = "jeecghttptrace")
|
||||||
public class CustomHttpTraceEndpoint{
|
public class CustomHttpTraceEndpoint{
|
||||||
private final CustomInMemoryHttpTraceRepository repository;
|
private final CustomInMemoryHttpTraceRepository repository;
|
||||||
|
|
||||||
@ -29,14 +29,14 @@ public class CustomHttpTraceEndpoint{
|
|||||||
|
|
||||||
@ReadOperation
|
@ReadOperation
|
||||||
public HttpTraceDescriptor traces(@Selector(match = ALL_REMAINING) String query) {
|
public HttpTraceDescriptor traces(@Selector(match = ALL_REMAINING) String query) {
|
||||||
return new CustomHttpTraceEndpoint.HttpTraceDescriptor(this.repository.findAll(query));
|
return new HttpTraceDescriptor(this.repository.findAll(query));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
public static final class HttpTraceDescriptor {
|
public static final class HttpTraceDescriptor {
|
||||||
private final List<HttpTrace> traces;
|
private final List<HttpExchange> traces;
|
||||||
|
|
||||||
private HttpTraceDescriptor(List<HttpTrace> traces) {
|
private HttpTraceDescriptor(List<HttpExchange> traces) {
|
||||||
this.traces = traces;
|
this.traces = traces;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
package org.jeecg.modules.monitor.actuator.httptrace;
|
package org.jeecg.modules.monitor.actuator.httptrace;
|
||||||
|
|
||||||
import org.springframework.boot.actuate.trace.http.HttpTrace;
|
import org.springframework.boot.actuate.web.exchanges.HttpExchange;
|
||||||
import org.springframework.boot.actuate.trace.http.InMemoryHttpTraceRepository;
|
import org.springframework.boot.actuate.web.exchanges.InMemoryHttpExchangeRepository;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
@ -12,17 +12,17 @@ import java.util.stream.Stream;
|
|||||||
* @Author: chenrui
|
* @Author: chenrui
|
||||||
* @Date: 2024/5/13 17:02
|
* @Date: 2024/5/13 17:02
|
||||||
*/
|
*/
|
||||||
public class CustomInMemoryHttpTraceRepository extends InMemoryHttpTraceRepository {
|
public class CustomInMemoryHttpTraceRepository extends InMemoryHttpExchangeRepository {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<HttpTrace> findAll() {
|
public List<HttpExchange> findAll() {
|
||||||
return super.findAll();
|
return super.findAll();
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<HttpTrace> findAll(String query) {
|
public List<HttpExchange> findAll(String query) {
|
||||||
List<HttpTrace> allTrace = super.findAll();
|
List<HttpExchange> allTrace = super.findAll();
|
||||||
if (null != allTrace && !allTrace.isEmpty()) {
|
if (null != allTrace && !allTrace.isEmpty()) {
|
||||||
Stream<HttpTrace> stream = allTrace.stream();
|
Stream<HttpExchange> stream = allTrace.stream();
|
||||||
String[] params = query.split(",");
|
String[] params = query.split(",");
|
||||||
stream = filter(params, stream);
|
stream = filter(params, stream);
|
||||||
stream = sort(params, stream);
|
stream = sort(params, stream);
|
||||||
@ -31,7 +31,7 @@ public class CustomInMemoryHttpTraceRepository extends InMemoryHttpTraceReposito
|
|||||||
return allTrace;
|
return allTrace;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Stream<HttpTrace> sort(String[] params, Stream<HttpTrace> stream) {
|
private Stream<HttpExchange> sort(String[] params, Stream<HttpExchange> stream) {
|
||||||
if (params.length < 2) {
|
if (params.length < 2) {
|
||||||
return stream;
|
return stream;
|
||||||
}
|
}
|
||||||
@ -56,7 +56,7 @@ public class CustomInMemoryHttpTraceRepository extends InMemoryHttpTraceReposito
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Stream<HttpTrace> filter(String[] params, Stream<HttpTrace> stream) {
|
private static Stream<HttpExchange> filter(String[] params, Stream<HttpExchange> stream) {
|
||||||
if (params.length == 0) {
|
if (params.length == 0) {
|
||||||
return stream;
|
return stream;
|
||||||
}
|
}
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user