Compare commits

...

29 Commits

Author SHA1 Message Date
thinkgem
3d0455192c 5.13.1 2025-09-22 21:47:04 +08:00
thinkgem
1c51398e60 新增 -Dspring.config.additional-location 方式读取配置文件 2025-09-22 09:54:12 +08:00
thinkgem
20ff2cebfe 启动脚本 startup.bat(sh) 支持接受参数 2025-09-22 09:35:36 +08:00
thinkgem
d714d70b69 更新 docker 部署 2025-09-20 19:19:17 +08:00
thinkgem
23c65b6e8e update docker plugin 2025-09-20 19:11:22 +08:00
thinkgem
bfe0f7536d 移除用不到的文件h5fix.min.js 2025-09-18 21:57:23 +08:00
thinkgem
cb4640cbb7 驼峰命名法工具优化,使用下划线开头的时候忽略它 2025-09-18 21:47:28 +08:00
thinkgem
23ea3e5020 update yml 2025-09-18 13:40:35 +08:00
thinkgem
63a6d5c762 5.13.1 2025-09-15 08:48:32 +08:00
thinkgem
c06f2e4ff1 解决 ExcelImport 数值类型为负数的时候小数问题 2025-09-13 16:01:37 +08:00
thinkgem
69011d80a4 新增 QueryType.BETWEEN、QueryType.NOT_BETWEEN 查询类型 2025-09-12 09:50:45 +08:00
thinkgem
4a5a279cd5 update 2025-09-10 23:22:59 +08:00
thinkgem
8c749eae52 IpAddrFilter重命名为GlobalFilter全局过滤器,并将MDC移动到进来 2025-09-08 11:22:05 +08:00
thinkgem
104e59349d 候还是后,稍后:说明后面还需有动作,需再进行尝试;稍候:说明只需等待就可以了 2025-09-05 10:47:33 +08:00
thinkgem
9a40ab254d poi 5.4.1 2025-09-03 10:19:01 +08:00
thinkgem
d409e73324 update upbw 2025-09-02 10:08:21 +08:00
thinkgem
fcf9229849 没有生成导入功能时,缺少 ref 导入 2025-09-02 10:07:54 +08:00
thinkgem
a4ff87a6c1 update application.yml 2025-08-29 20:52:13 +08:00
thinkgem
6267e3c74e 更新名称 生成模块代码(Maven) 2025-08-29 20:51:49 +08:00
thinkgem
26563cd80a TestData 子表增加图片上传组件 2025-08-27 23:51:49 +08:00
thinkgem
c74d5823dc 代码优化 2025-08-27 23:51:33 +08:00
thinkgem
4ff2e23780 @Idempotent 幂等注解,支持 key 指定多个,使用逗号分隔 2025-08-26 15:45:50 +08:00
thinkgem
1e156116ee 更新vue实例菜单 2025-08-25 15:08:46 +08:00
thinkgem
cd07b1a3c8 改进单元测试类配置 2025-08-25 10:37:59 +08:00
thinkgem
c47be09f51 update 2025-08-22 19:14:46 +08:00
thinkgem
ed8e08da05 代码优化 2025-08-22 18:41:03 +08:00
thinkgem
2ab09e38e5 Merge branch 'v5.springboot3' into v5.springboot3.temp 2025-08-22 18:39:15 +08:00
thinkgem
4a881825e9 Merge branch 'v5.springboot3' into v5.springboot3.temp 2025-08-18 17:14:14 +08:00
thinkgem
35b0411198 5.13.0 2025-08-18 11:45:25 +08:00
67 changed files with 282 additions and 267 deletions

View File

@@ -101,7 +101,7 @@
* 持久层Apache MyBatis 3.5、Hibernate Validator 8、Alibaba Druid 1.2
* 分离版Node.js、TypeScript、Vue3、Vite、Ant Design Vue、Vue Vben Admin
* 经典版Beetl 3.10HTML、jQuery 3.7、Bootstrap 3.3、AdminLTE 2.4
* 分离版:支持所有现代浏览器,如:谷歌 Chrome 86+、微软 Edge、火狐、国产浏览器 等
* 分离版:支持所有现代浏览器,如:谷歌 Chrome 87+、微软 Edge、火狐、国产浏览器 等
* 经典版:支持 IE10 和以上版本,以及其他所有现代浏览器,如:谷歌、火狐、国产浏览器 等
* 工作流引擎Flowable 7.1、符合 BPMN 规范、在线流程设计器、中国式流程、退回、撤回、自由流
* 技术选型(详细)已支持数据库:<http://jeesite.com/docs/technology/>
@@ -140,6 +140,17 @@
1. 分离版地址:<https://vue.jeesite.com>
2. 经典版地址:<https://demo.jeesite.com>
### 快速运行
1. 免安装数据库,使用内嵌 H2 DB、包含 Vue 和 全栈双版本
2. 环境准备:`JDK 17 或更高版本``Maven 3.8+`、无需准备数据库
3. 下载源码:<https://gitee.com/thinkgem/jeesite5/repository/archive/v5.springboot3.zip> 并解压
4. 执行脚本:`/web-fast/bin/run-tomcat.bat(sh)` 启动服务即可(无需手动建库,自动初始化数据库)
5. Vue分离版本地址<http://127.0.0.1:8980/vue/login>
6. 全栈版本地址:<http://127.0.0.1:8980/a/login>
7. 初始登录账号超级管理员system 密码admin
8. 部署常见问题:<https://jeesite.com/docs/faq/>
### 本地运行
1. 环境准备:`JDK 17+``Maven 3.8+`、使用 `MySQL 8.0+` 数据库、[其它数据库](https://jeesite.com/docs/technology/#_8、已支持数据库)
@@ -152,27 +163,21 @@
8. 分离端安装:<https://jeesite.com/docs/vue-install-deploy/>
9. 分离端常见问题:<https://jeesite.com/docs/vue-faq/>
### 快速运行
1. 环境准备:`JDK 17+``Maven 3.8+`、无需准备数据库(使用内嵌 H2 DB、包含 Vue 和 全栈双版本)
2. 下载源码:<https://gitee.com/thinkgem/jeesite5/repository/archive/v5.springboot3.zip> 并解压
3. 执行脚本:`/web-fast/bin/run-tomcat.bat(sh)` 启动服务即可(无需手动建库,自动初始化数据库)
4. Vue分离版本地址<http://127.0.0.1:8980/vue/login>
5. 全栈版本地址:<http://127.0.0.1:8980/a/login>
6. 初始登录账号超级管理员system 密码admin
7. 部署常见问题:<https://jeesite.com/docs/faq/>
### 容器运行
- 拉取 Docker 镜像JeeSite版本不是最新
```sh
docker pull thinkgem/jeesite-web
docker pull crpi-u3zm0t8trv68xpyx.cn-qingdao.personal.cr.aliyuncs.com/thinkgem/jeesite:latest
```
- 启动脚本
- 启动镜像
```sh
docker run --name jeesite-web -p 8980:8980 -d --restart unless-stopped \
-v ~/:/data thinkgem/jeesite-web && docker logs -f jeesite-web
docker run --name js5 -p 8980:8980 -d crpi-u3zm0t8trv68xpyx.cn-qingdao.personal.cr.aliyuncs.com/thinkgem/jeesite:latest
```
- 查看日志:
```sh
docker logs -f js5
```
- 浏览器访问:<http://127.0.0.1:8980/js/> 账号 system 密码 admin
### 开发环境

View File

@@ -6,7 +6,7 @@
<parent>
<groupId>com.jeesite</groupId>
<artifactId>jeesite-parent</artifactId>
<version>5.13.0.springboot3-SNAPSHOT</version>
<version>5.13.1.springboot3-SNAPSHOT</version>
<relativePath>../parent/pom.xml</relativePath>
</parent>

View File

@@ -64,8 +64,11 @@ public class PropertiesUtils {
// 获取全局设置默认的配置文件(以下是支持环境配置的属性文件)
Set<String> set = SetUtils.newLinkedHashSet();
set.addAll(Arrays.asList(DEFAULT_CONFIG_FILE));
// 获取 spring.config.location 外部自定义的配置文件
// 获取 spring.config.location、spring.config.additional-location 外部自定义的配置文件
String customConfigs = System.getProperty("spring.config.location");
if (StringUtils.isBlank(customConfigs)){
customConfigs = System.getProperty("spring.config.additional-location");
}
if (StringUtils.isNotBlank(customConfigs)){
for (String customConfig : StringUtils.splitComma(customConfigs)){
if (!customConfig.contains("$")){

View File

@@ -270,7 +270,7 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils {
}
/**
* 驼峰命名法工具
* 转换为驼峰命名法
* @return
* camelCase("hello_world") == "helloWorld"
* capCamelCase("hello_world") == "HelloWorld"
@@ -283,37 +283,35 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils {
s = s.toLowerCase();
StringBuilder sb = new StringBuilder(s.length());
boolean upperCase = false;
for (int i = 0; i < s.length(); i++) {
for (int i = 0, j = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c == UNDERLINE.charAt(0) || c == MINUS.charAt(0)) {
upperCase = i != 1; // 不允许第二个字符是大写
upperCase = j > 1; // 不允许第二个字符是大写
} else if (upperCase) {
sb.append(Character.toUpperCase(c));
upperCase = false;
j++;
} else {
sb.append(c);
j++;
}
}
return sb.toString();
}
/**
* 驼峰命名法工具
* 转换为驼峰命名法(首字母大写)
* @return
* camelCase("hello_world") == "helloWorld"
* capCamelCase("hello_world") == "HelloWorld"
* uncamelCase("helloWorld") = "hello_world"
*/
public static String capCamelCase(String s) {
if (s == null) {
return null;
}
s = camelCase(s);
return s.substring(0, 1).toUpperCase() + s.substring(1);
return cap(camelCase(s));
}
/**
* 驼峰命名法工具
* 取消驼峰命名
* @return
* camelCase("hello_world") == "helloWorld"
* capCamelCase("hello_world") == "HelloWorld"

View File

@@ -305,7 +305,7 @@ public class ExcelImport implements Closeable {
if (DateUtil.isCellDateFormatted(cell)) {
val = DateUtil.getJavaDate((Double) val); // POI Excel 日期格式转换
}else{
if ((Double) val % 1 > 0){
if (Math.abs((double)val % 1) > 1E-10){
val = new DecimalFormat("0.00").format(val);
}else{
val = new DecimalFormat("0").format(val);

View File

@@ -1,7 +0,0 @@
/*! Respond.js v1.4.2: min/max-width media query polyfill Copyright 2014 Scott Jehl Licensed under MIT http://j.mp/respondjs */
//https://oss.maxcdn.com/respond/1.4.2/respond.min.js
!function(a){"use strict";a.matchMedia=a.matchMedia||function(a){var b,c=a.documentElement,d=c.firstElementChild||c.firstChild,e=a.createElement("body"),f=a.createElement("div");return f.id="mq-test-1",f.style.cssText="position:absolute;top:-100em",e.style.background="none",e.appendChild(f),function(a){return f.innerHTML='&shy;<style media="'+a+'"> #mq-test-1 { width: 42px; }</style>',c.insertBefore(e,d),b=42===f.offsetWidth,c.removeChild(e),{matches:b,media:a}}}(a.document)}(this),function(a){"use strict";function b(){v(!0)}var c={};a.respond=c,c.update=function(){};var d=[],e=function(){var b=!1;try{b=new a.XMLHttpRequest}catch(c){b=new a.ActiveXObject("Microsoft.XMLHTTP")}return function(){return b}}(),f=function(a,b){var c=e();c&&(c.open("GET",a,!0),c.onreadystatechange=function(){4!==c.readyState||200!==c.status&&304!==c.status||b(c.responseText)},4!==c.readyState&&c.send(null))},g=function(a){return a.replace(c.regex.minmaxwh,"").match(c.regex.other)};if(c.ajax=f,c.queue=d,c.unsupportedmq=g,c.regex={media:/@media[^\{]+\{([^\{\}]*\{[^\}\{]*\})+/gi,keyframes:/@(?:\-(?:o|moz|webkit)\-)?keyframes[^\{]+\{(?:[^\{\}]*\{[^\}\{]*\})+[^\}]*\}/gi,comments:/\/\*[^*]*\*+([^/][^*]*\*+)*\//gi,urls:/(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g,findStyles:/@media *([^\{]+)\{([\S\s]+?)$/,only:/(only\s+)?([a-zA-Z]+)\s?/,minw:/\(\s*min\-width\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/,maxw:/\(\s*max\-width\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/,minmaxwh:/\(\s*m(in|ax)\-(height|width)\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/gi,other:/\([^\)]*\)/g},c.mediaQueriesSupported=a.matchMedia&&null!==a.matchMedia("only all")&&a.matchMedia("only all").matches,!c.mediaQueriesSupported){var h,i,j,k=a.document,l=k.documentElement,m=[],n=[],o=[],p={},q=30,r=k.getElementsByTagName("head")[0]||l,s=k.getElementsByTagName("base")[0],t=r.getElementsByTagName("link"),u=function(){var a,b=k.createElement("div"),c=k.body,d=l.style.fontSize,e=c&&c.style.fontSize,f=!1;return b.style.cssText="position:absolute;font-size:1em;width:1em",c||(c=f=k.createElement("body"),c.style.background="none"),l.style.fontSize="100%",c.style.fontSize="100%",c.appendChild(b),f&&l.insertBefore(c,l.firstChild),a=b.offsetWidth,f?l.removeChild(c):c.removeChild(b),l.style.fontSize=d,e&&(c.style.fontSize=e),a=j=parseFloat(a)},v=function(b){var c="clientWidth",d=l[c],e="CSS1Compat"===k.compatMode&&d||k.body[c]||d,f={},g=t[t.length-1],p=(new Date).getTime();if(b&&h&&q>p-h)return a.clearTimeout(i),i=a.setTimeout(v,q),void 0;h=p;for(var s in m)if(m.hasOwnProperty(s)){var w=m[s],x=w.minw,y=w.maxw,z=null===x,A=null===y,B="em";x&&(x=parseFloat(x)*(x.indexOf(B)>-1?j||u():1)),y&&(y=parseFloat(y)*(y.indexOf(B)>-1?j||u():1)),w.hasquery&&(z&&A||!(z||e>=x)||!(A||y>=e))||(f[w.media]||(f[w.media]=[]),f[w.media].push(n[w.rules]))}for(var C in o)o.hasOwnProperty(C)&&o[C]&&o[C].parentNode===r&&r.removeChild(o[C]);o.length=0;for(var D in f)if(f.hasOwnProperty(D)){var E=k.createElement("style"),F=f[D].join("\n");E.type="text/css",E.media=D,r.insertBefore(E,g.nextSibling),E.styleSheet?E.styleSheet.cssText=F:E.appendChild(k.createTextNode(F)),o.push(E)}},w=function(a,b,d){var e=a.replace(c.regex.comments,"").replace(c.regex.keyframes,"").match(c.regex.media),f=e&&e.length||0;b=b.substring(0,b.lastIndexOf("/"));var h=function(a){return a.replace(c.regex.urls,"$1"+b+"$2$3")},i=!f&&d;b.length&&(b+="/"),i&&(f=1);for(var j=0;f>j;j++){var k,l,o,p;i?(k=d,n.push(h(a))):(k=e[j].match(c.regex.findStyles)&&RegExp.$1,n.push(RegExp.$2&&h(RegExp.$2))),o=k.split(","),p=o.length;for(var q=0;p>q;q++)l=o[q],g(l)||m.push({media:l.split("(")[0].match(c.regex.only)&&RegExp.$2||"all",rules:n.length-1,hasquery:l.indexOf("(")>-1,minw:l.match(c.regex.minw)&&parseFloat(RegExp.$1)+(RegExp.$2||""),maxw:l.match(c.regex.maxw)&&parseFloat(RegExp.$1)+(RegExp.$2||"")})}v()},x=function(){if(d.length){var b=d.shift();f(b.href,function(c){w(c,b.href,b.media),p[b.href]=!0,a.setTimeout(function(){x()},0)})}},y=function(){for(var b=0;b<t.length;b++){var c=t[b],e=c.href,f=c.media,g=c.rel&&"stylesheet"===c.rel.toLowerCase();e&&g&&!p[e]&&(c.styleSheet&&c.styleSheet.rawCssText?(w(c.styleSheet.rawCssText,e,f),p[e]=!0):(!/^([a-zA-Z:]*\/\/)/.test(e)&&!s||e.replace(RegExp.$1,"").split("/")[0]===a.location.host)&&("//"===e.substring(0,2)&&(e=a.location.protocol+e),d.push({href:e,media:f})))}x()};y(),c.update=y,c.getEmValue=u,a.addEventListener?a.addEventListener("resize",b,!1):a.attachEvent&&a.attachEvent("onresize",b)}}(this);
/*! @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed */
//https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js
!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x<style>"+b+"</style>",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="<xyz></xyz>",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document);

View File

@@ -16,8 +16,8 @@ span{display:block;font-size:12px;line-height:12px;}
.clean{clear:both;}
</style></head><body>
<h1>浏览器版本过低,是时候升级您的浏览器了</h1>
<p>本系统 <a href="http://jeesite.com">JeeSite</a> 支持 IE9 及以上版本及其他所有现代浏览器,如:谷歌浏览器、火狐浏览器、国产浏览器 等。</p>
<p>您正在使用 Internet Explorer 的过期版本IE6、IE7、IE8 内核的浏览器)。这意味着在升级浏览器前,您将无法继续访问。</p>
<p>本系统 <a href="http://jeesite.com">JeeSite</a> 支持 IE10 及以上版本及其他所有现代浏览器,如:谷歌浏览器、火狐浏览器、国产浏览器 等。</p>
<p>您正在使用 Internet Explorer 的过期版本IE6、IE7、IE8、IE9 内核的浏览器)。这意味着在升级浏览器前,您将无法继续访问。</p>
<hr>
<h2>为什么会出现这个页面?</h2>
<p>如果您不知道升级浏览器是什么意思请请教一些熟练电脑操作的朋友。如果您使用的不是Internet Explorer而是360、QQ、搜狗等双核浏览器出现这个页面可能是您切换到了兼容模式<strong style="color:#f00;">切换到极速模式</strong>下,如果还不行请升级至最新版浏览器。</p>
@@ -29,10 +29,10 @@ span{display:block;font-size:12px;line-height:12px;}
<h2>您可以选择更先进的浏览器</h2>
<p>推荐使用以下浏览器的最新版本。如果您的电脑已有以下浏览器的最新版本则直接使用该浏览器访问 <b id="url"></b>即可。</p>
<div class="browser"><ul>
<li><img src="img/chrome360.jpg"><a href="http://chrome.360.cn/"> 360极速浏览器<span>360 Chrome</span></a></li>
<li><img src="img/chrome.jpg"><a href="http://www.google.cn/intl/zh-CN/chrome/browser/desktop/index.html"> 谷歌浏览器<span>Google Chrome</span></a></li>
<li><img src="img/firefox.jpg"><a href="http://www.firefox.com.cn/download/"> 火狐浏览器<span>Mozilla Firefox</span></a></li>
<li><img src="img/edge.png"><a href="https://www.microsoft.com/zh-cn/edge"> Edge 浏览器<span>Microsoft Edge</span></a></li>
<li><img src="img/chrome.jpg"><a href="http://www.google.cn/intl/zh-CN/chrome/browser/desktop/index.html"> 谷歌浏览器<span>Google Chrome</span></a></li>
<li><img src="img/chrome360.jpg"><a href="http://chrome.360.cn/"> 360极速浏览器<span>360 Chrome</span></a></li>
<li><img src="img/firefox.jpg"><a href="https://www.firefox.com/zh-CN/"> 火狐浏览器<span>Mozilla Firefox</span></a></li>
</ul><div class="clean"></div></div>
<hr><br/>
<script>

View File

@@ -0,0 +1,32 @@
/**
* Copyright (c) 2013-Now http://jeesite.com All rights reserved.
* No deletion without permission, or be held responsible to law.
*/
package com.jeesite.test.lang;
import com.jeesite.common.lang.StringUtils;
import java.text.ParseException;
/**
* 字符串工具测试类
* @author ThinkGem
* @version 2025-09-18
*/
public class StringUtilsTest {
public static void main(String[] args) throws ParseException {
System.out.println(StringUtils.camelCase("id_name") + " = idName");
System.out.println(StringUtils.camelCase("_id_name") + " = idName");
System.out.println(StringUtils.camelCase("__id_name") + " = idName");
System.out.println(StringUtils.camelCase("a_id") + " = aid");
System.out.println(StringUtils.camelCase("a_b_id") + " = abId");
System.out.println(StringUtils.camelCase("__a_id") + " = aid");
System.out.println(StringUtils.camelCase("__a_b_id") + " = abId");
System.out.println(StringUtils.capCamelCase("id_name") + " = IdName");
System.out.println(StringUtils.capCamelCase("a_b_id_name") + " = AbIdName");
System.out.println(StringUtils.uncamelCase("abIdName") + " = ab_id_name");
System.out.println(StringUtils.uncamelCase("AbIdName") + " = ab_id_name");
}
}

View File

@@ -6,7 +6,7 @@
<parent>
<groupId>com.jeesite</groupId>
<artifactId>jeesite-parent</artifactId>
<version>5.13.0.springboot3-SNAPSHOT</version>
<version>5.13.1.springboot3-SNAPSHOT</version>
<relativePath>../../parent/pom.xml</relativePath>
</parent>

View File

@@ -29,4 +29,5 @@
5.11.1
5.12.0
5.12.1
5.13.0
5.13.0
5.13.1

View File

@@ -6,7 +6,7 @@
<parent>
<groupId>com.jeesite</groupId>
<artifactId>jeesite-parent</artifactId>
<version>5.13.0.springboot3-SNAPSHOT</version>
<version>5.13.1.springboot3-SNAPSHOT</version>
<relativePath>../../parent/pom.xml</relativePath>
</parent>

View File

@@ -1,16 +1,7 @@
# 产品或项目名称、软件开发公司名称
productName: JeeSite Demo
companyName: ThinkGem
# 产品版本、版权年份
productVersion: V5.13
copyrightYear: 2025
# 数据库连接
jdbc:
jdbc:
# Mysql 数据库配置
type: mysql
driver: com.mysql.cj.jdbc.Driver
@@ -18,11 +9,7 @@ jdbc:
username: root
password: 123456
testSql: SELECT 1
# 日志配置
logging:
config: classpath:logback-test.xml
# 消息推送
msg:
enabled: true

View File

@@ -6,7 +6,7 @@
<parent>
<groupId>com.jeesite</groupId>
<artifactId>jeesite-parent</artifactId>
<version>5.13.0.springboot3-SNAPSHOT</version>
<version>5.13.1.springboot3-SNAPSHOT</version>
<relativePath>../../parent/pom.xml</relativePath>
</parent>

View File

@@ -37,4 +37,5 @@
5.11.1
5.12.0
5.12.1
5.13.0
5.13.0
5.13.1

View File

@@ -5,27 +5,6 @@
<title>Bootswatch: Cosmo</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="./bootstrap.css" media="screen">
<link rel="stylesheet" href="../css/custom.min.css">
<!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
<!--[if lt IE 9]>
<script src="../bower_components/html5shiv/dist/html5shiv.js"></script>
<script src="../bower_components/respond/dest/respond.min.js"></script>
<![endif]-->
<script>
// var _gaq = _gaq || [];
// _gaq.push(['_setAccount', 'UA-23019901-1']);
// _gaq.push(['_setDomainName', "bootswatch.com"]);
// _gaq.push(['_setAllowLinker', true]);
// _gaq.push(['_trackPageview']);
// (function() {
// var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
// ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
// var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
// })();
</script>
</head>
<body>
<div class="navbar navbar-default navbar-fixed-top">
@@ -105,9 +84,6 @@
<p class="lead">An ode to Metro</p>
</div>
<div class="col-lg-4 col-md-5 col-sm-6">
<div class="sponsor">
<script async type="text/javascript" src="//cdn.carbonads.com/carbon.js?zoneid=1673&serve=C6AILKT&placement=bootswatchcom" id="_carbonads_js"></script>
</div>
</div>
</div>
<div class="row">
@@ -1287,10 +1263,8 @@
</footer>
</div>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script src="../js/bootstrap.min.js"></script>
<script src="../js/custom.js"></script>

View File

@@ -6,7 +6,7 @@
<parent>
<groupId>com.jeesite</groupId>
<artifactId>jeesite-parent</artifactId>
<version>5.13.0.springboot3-SNAPSHOT</version>
<version>5.13.1.springboot3-SNAPSHOT</version>
<relativePath>../../parent/pom.xml</relativePath>
</parent>

View File

@@ -5,6 +5,7 @@
package com.jeesite.modules.config.web;
import com.jeesite.common.config.Global;
import com.jeesite.common.idgen.IdGen;
import com.jeesite.common.lang.StringUtils;
import com.jeesite.common.utils.LocaleUtils;
import com.jeesite.common.web.http.ServletUtils;
@@ -12,6 +13,7 @@ import jakarta.servlet.Filter;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import jakarta.servlet.http.HttpServletResponse;
import org.slf4j.MDC;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@@ -19,21 +21,28 @@ import org.springframework.core.Ordered;
import org.springframework.web.servlet.LocaleContextResolver;
/**
* IP地址黑白名单过滤器配置
* 全局过滤器
* 1IP地址黑白名单过滤器配置
* 2本地化时区上下文设置
* 3Slf4j MDC 标识设置
*/
@Configuration(proxyBeanMethods = false)
public class IpAddrFilterConfig {
public class GlobalFilterConfig {
private static final String TRACE_ID = "TRACE_ID";
private static long clearCacheTime;
private static String[] allowPrefixes;
private static String[] denyPrefixes;
@Bean
public FilterRegistrationBean<Filter> ipAddrFilter(LocaleContextResolver localeResolver) {
public FilterRegistrationBean<Filter> jeesiteGlobalFilter(LocaleContextResolver localeResolver) {
FilterRegistrationBean<Filter> bean = new FilterRegistrationBean<>();
bean.setName("ipAddrFilter");
bean.setName("jeesiteGlobalFilter");
bean.setOrder(Ordered.HIGHEST_PRECEDENCE + 10);
bean.setFilter((servletRequest, servletResponse, chain) -> {
if (StringUtils.isBlank(MDC.get(TRACE_ID))) {
MDC.put(TRACE_ID, IdGen.randomShortString());
}
if (isAccessAllowed(servletRequest, servletResponse)) {
chain.doFilter(servletRequest, servletResponse);
} else {
@@ -42,6 +51,7 @@ public class IpAddrFilterConfig {
ServletUtils.renderString(response, Global.getText("访问拒绝"));
}
LocaleUtils.removeTimeZoneAwareLocaleContext();
MDC.remove(TRACE_ID);
});
LocaleUtils.setLocaleResolver(localeResolver);
bean.addUrlPatterns("/*");
@@ -77,9 +87,6 @@ public class IpAddrFilterConfig {
break;
}
}
if (result) {
return true;
}
return false;
return result;
}
}

View File

@@ -4,22 +4,17 @@
*/
package com.jeesite.modules.sys.interceptor;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.slf4j.MDC;
import org.springframework.core.NamedThreadLocal;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import com.jeesite.common.idgen.IdGen;
import com.jeesite.common.lang.ByteUtils;
import com.jeesite.common.lang.StringUtils;
import com.jeesite.common.lang.TimeUtils;
import com.jeesite.common.network.IpUtils;
import com.jeesite.common.service.BaseService;
import com.jeesite.modules.sys.utils.LogUtils;
import com.jeesite.modules.sys.utils.UserUtils;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.core.NamedThreadLocal;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
/**
* 日志拦截器
@@ -28,16 +23,12 @@ import com.jeesite.modules.sys.utils.UserUtils;
*/
public class LogInterceptor extends BaseService implements HandlerInterceptor {
private static final String TRACE_ID = "TRACE_ID";
private static final ThreadLocal<Long> startTimeThreadLocal =
new NamedThreadLocal<Long>("LogInterceptor StartTime");
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object handler) throws Exception {
if (StringUtils.isBlank(MDC.get(TRACE_ID))) {
MDC.put(TRACE_ID, IdGen.randomShortString());
}
long beginTime = System.currentTimeMillis();// 1、开始时间
startTimeThreadLocal.set(beginTime); // 线程绑定变量(该数据只有当前请求的线程可见)
if (logger.isDebugEnabled()){
@@ -82,7 +73,6 @@ public class LogInterceptor extends BaseService implements HandlerInterceptor {
TimeUtils.formatTime(executeTime), ByteUtils.formatByteSize(totalMemory),
ByteUtils.formatByteSize(totalMemory-(totalMemory-runtime.freeMemory())));
}
MDC.remove(TRACE_ID);
}
}

View File

@@ -181,7 +181,7 @@ public class EmpUserServiceSupport extends CrudService<EmpUserDao, EmpUser>
EmployeeOffice employeeOfficeWhere = new EmployeeOffice();
employeeOfficeWhere.setEmpCode(employee.getEmpCode());
employeeOfficeDao.deleteByEntity(employeeOfficeWhere);
if (employee.getEmployeeOfficeList().size() > 0){
if (!employee.getEmployeeOfficeList().isEmpty()){
employee.getEmployeeOfficeList().forEach(employeeOffice -> {
employeeOffice.setId(IdGen.nextId());
employeeOffice.setEmpCode(employee.getEmpCode());

View File

@@ -157,14 +157,12 @@ public class OnlineController extends BaseController{
onlineTickOutMap = MapUtils.newConcurrentMap();
}
Object pc = session.getAttribute(DefaultSubjectContext.PRINCIPALS_SESSION_KEY);
if (pc != null && pc instanceof PrincipalCollection){
if (pc instanceof PrincipalCollection){
Object pp = ((PrincipalCollection)pc).getPrimaryPrincipal();
if (pp != null) {
if (pp instanceof LoginInfo){
LoginInfo loginInfo = ((LoginInfo)pp);
String key = loginInfo.getId()+"_"+loginInfo.getParam("deviceType", "pc");
onlineTickOutMap.put(key, StringUtils.EMPTY);
}
if (pp instanceof LoginInfo){
LoginInfo loginInfo = ((LoginInfo)pp);
String key = loginInfo.getId()+"_"+loginInfo.getParam("deviceType", "pc");
onlineTickOutMap.put(key, StringUtils.EMPTY);
}
}
SysCacheUtils.put("onlineTickOutMap", onlineTickOutMap);

View File

@@ -178,6 +178,7 @@ public class EmpUserController extends BaseController {
@RequiresPermissions(value={"sys:empUser:edit","sys:empUser:authRole"}, logical=Logical.OR)
@PostMapping(value = "save")
@ResponseBody
//@Idempotent // 幂等示例默认规则10秒内相同的会话和相同的提交内容会提示“请不要频繁操作”
public String save(@Validated EmpUser empUser, @Parameter(description = "操作类型") String op, HttpServletRequest request) {
if (!EmpUser.USER_TYPE_EMPLOYEE.equals(empUser.getUserType())){
return renderResult(Global.FALSE, "非法操作,不能够操作此用户!");

View File

@@ -1,5 +1,13 @@
# 温馨提示不建议直接修改此文件为了平台升级方便建议将需要修改的参数值复制到application.yml里进行覆盖该参数值。
# 产品或项目名称、软件开发公司名称
productName: JeeSite Demo
companyName: ThinkGem
# 产品版本、版权年份
productVersion: V5.13
copyrightYear: 2025
#======================================#
#========== Database sttings ==========#
#======================================#
@@ -471,8 +479,8 @@ shiro:
# 记住我密钥设置,你可以通过 com.jeesite.test.RememberMeKeyGen 类快速生成一个秘钥。
# 若不设置,则每次启动系统后自动生成一个新秘钥,这样会导致每次重启后,客户端记录的用户信息将失效。
rememberMe:
secretKey: ~
#rememberMe:
# secretKey: ~
# 指定获取客户端IP的Header名称防止IP伪造。指定为空则使用原生方法获取IP。
remoteAddrHeaderName: X-Forwarded-For

View File

@@ -5,7 +5,7 @@ sys.login.notLongIn=您的登录信息已过期,请重新登录。
sys.login.success=登录成功!
sys.login.getInfo=获取信息成功!
sys.login.failure=账号或密码错误,请重试。
sys.login.error=对不起,系统遇见了点问题,请稍再试!
sys.login.error=对不起,系统遇见了点问题,请稍再试!
sys.logout.success=退出成功!
# =========== 账号登录相关 ===========

View File

@@ -257,7 +257,7 @@
</gridRowCol>
<!-- 模块生成模板分类 -->
<moduleTplCategory>
<category value="module" label="生成模块代码">
<category value="module" label="生成模块代码Maven">
<template>module/bin/deploy.bat.xml</template>
<template>module/bin/deploy.sh.xml</template>
<template>module/bin/package.bat.xml</template>
@@ -270,6 +270,14 @@
<template>module/src/main/resources/application-assistant.xml</template>
<template>module/pom.xml</template>
</category>
<category value="module_vue" label="生成前端模块代码Vue">
<template>module_vue/api/api.xml</template>
<template>module_vue/views/views.xml</template>
<template>module_vue/index.ts.xml</template>
<template>module_vue/package.json.xml</template>
<template>module_vue/README.md.xml</template>
<template>module_vue/tsconfig.json.xml</template>
</category>
<category value="module_cloud" label="生成微服务模块代码Cloud">
<template>module_cloud/client/bin/deploy.bat.xml</template>
<template>module_cloud/client/bin/deploy.sh.xml</template>
@@ -301,13 +309,5 @@
<template>module_cloud/web/pom.xml</template>
<template>module_cloud/pom.xml</template>
</category>
<category value="module_vue" label="生成前端模块代码Vue">
<template>module_vue/api/api.xml</template>
<template>module_vue/views/views.xml</template>
<template>module_vue/index.ts.xml</template>
<template>module_vue/package.json.xml</template>
<template>module_vue/README.md.xml</template>
<template>module_vue/tsconfig.json.xml</template>
</category>
</moduleTplCategory>
</config>

View File

@@ -80,7 +80,7 @@
function onUploadProgress(progressEvent: AxiosProgressEvent) {
const complete = ((progressEvent.loaded / (progressEvent.total || 1)) * 100) | 0;
if (complete != 100) {
uploadInfo.value = t('正在导入,请稍') + ' ' + complete + '%...';
uploadInfo.value = t('正在导入,请稍') + ' ' + complete + '%...';
} else {
uploadInfo.value = '';
}

View File

@@ -94,7 +94,7 @@ if(table.isTreeEntity){
</div>
</template>
<script lang="ts" setup name="${compNamePrefix}List">
import { onMounted<% if(toBoolean(table.optionMap['isImportExport'])){ %>, ref<% } %>, unref<% if(table.isTreeEntity || isNotBlank(table.optionMap['leftTreeRightTableFk'])){ %>, watch<% }
import { onMounted, ref, unref<% if(table.isTreeEntity || isNotBlank(table.optionMap['leftTreeRightTableFk'])){ %>, watch<% }
%><% if(table.isTreeEntity){ %>, nextTick<% } %> } from 'vue';
<% if(@StringUtils.contains(table.tplCategory, '_route')) { %>
import { useEmitter } from '@jeesite/core/store/modules/user';

View File

@@ -9,7 +9,6 @@
<script src="${ctxPath}/global.min.js?ctx=${ctx}"></script>
<script src="${ctxStatic}/jquery/jquery-3.7.0.min.js"></script>
<script src="${ctxStatic}/jquery/jquery-migrate-3.4.0.min.js"></script>
<!--[if lt IE 9]><script src="${ctxStatic}/common/h5fix.min.js"></script><![endif]-->
<% if(parameter.__layer! == 'true'){ if(parameter.__layer_title! == 'false'){ %>
<style>.main-content>.box-main>.box-header{padding-right:45px;}</style>
<% }else{ %>

View File

@@ -67,8 +67,8 @@
<span class="required hide">*</span> ${text('电子邮箱')}<i class="fa icon-question hide"></i></label>
<div class="col-sm-8">
<div class="input-group">
<span class="input-group-addon"><i class="fa fa-fw fa-envelope"></i></span>
<#form:input path="email" maxlength="300" class="form-control email"/>
<span class="input-group-addon"><i class="fa fa-fw fa-envelope"></i></span>
</div>
</div>
</div>
@@ -79,8 +79,8 @@
<span class="required hide">*</span> ${text('手机号码')}<i class="fa icon-question hide"></i></label>
<div class="col-sm-8">
<div class="input-group">
<span class="input-group-addon"><i class="fa fa-fw fa-mobile"></i></span>
<#form:input path="mobile" maxlength="100" class="form-control mobile"/>
<span class="input-group-addon"><i class="fa fa-fw fa-mobile"></i></span>
</div>
</div>
</div>
@@ -93,8 +93,8 @@
<span class="required hide">*</span> ${text('办公电话')}<i class="fa icon-question hide"></i></label>
<div class="col-sm-8">
<div class="input-group">
<span class="input-group-addon"><i class="fa fa-fw fa-phone"></i></span>
<#form:input path="phone" maxlength="100" class="form-control phone"/>
<span class="input-group-addon"><i class="fa fa-fw fa-phone"></i></span>
</div>
</div>
</div>

View File

@@ -9,6 +9,7 @@ import com.jeesite.common.collect.SetUtils;
import com.jeesite.common.entity.DataScope;
import com.jeesite.common.entity.Page;
import com.jeesite.common.idgen.IdGen;
import com.jeesite.common.lang.DateUtils;
import com.jeesite.common.mybatis.mapper.query.QueryType;
import com.jeesite.common.tests.BaseSpringContextTests;
import com.jeesite.modules.file.dao.FileUploadDao;
@@ -166,6 +167,7 @@ public class DaoMapperTest extends BaseSpringContextTests {
company.setCompanyName("a");
company.setCreateDate_gte(new Date());
company.setCreateDate_lte(new Date());
company.setUpdateDate_between("2025-09-11 ~ 2025-09-12");
company.setArea(areaList.get(0));
company.getArea().setCreateDate_gte(company.getCreateDate_gte());
company.getArea().setCreateDate_lte(company.getCreateDate_gte());
@@ -302,6 +304,18 @@ public class DaoMapperTest extends BaseSpringContextTests {
b = "a.`status` != #{STATUS_DELETE} AND a.`post_code` = #{sqlMap.where#post_code#EQ1}";
System.out.println("a >> "+a);System.out.println("b >> "+b);Assert.assertEquals(b, a);
System.out.println("============ BETWEEN、NOT BETWEEN 测试 ============");
Date[] ds = DateUtils.parseDateBetweenString("2025-09-11 ~ 2025-09-12");
a = new Post("1").sqlMap().getWhere()
.and("create_date", QueryType.BETWEEN, ds)
.and("update_date", QueryType.NOT_BETWEEN, ds).toSql();
b = "a.`status` != #{STATUS_DELETE} AND a.`post_code` = #{sqlMap.where#post_code#EQ1}" +
" AND a.create_date BETWEEN #{sqlMap.where.create_date#BETWEEN1.val[0]}" +
" AND #{sqlMap.where.create_date#BETWEEN1.val[1]}" +
" AND a.update_date NOT BETWEEN #{sqlMap.where.update_date#NOT_BETWEEN1.val[0]}" +
" AND #{sqlMap.where.update_date#NOT_BETWEEN1.val[1]}";
System.out.println("a >> "+a);System.out.println("b >> "+b);Assert.assertEquals(b, a);
System.out.println("============ 带括号测试 ============");
a = new Post("1").sqlMap().getWhere()
.andBracket("name", QueryType.EQ, "abc", 1)

View File

@@ -37,7 +37,7 @@ import java.util.List;
* @version 2018-5-11
*/
@ActiveProfiles("test")
@SpringBootTest(classes = ApplicationTest.class)
@SpringBootTest(classes = ApplicationTest.class, properties = {"msg.enabled=true"})
@Rollback(false)
public class MsgPushTest extends BaseSpringContextTests {

View File

@@ -1,15 +1,7 @@
# 产品或项目名称、软件开发公司名称
productName: JeeSite Demo
companyName: ThinkGem
# 产品版本、版权年份
productVersion: V5.13
copyrightYear: 2025
# 数据库连接
jdbc:
jdbc:
# Mysql 数据库配置
type: mysql
driver: com.mysql.cj.jdbc.Driver
@@ -17,12 +9,7 @@ jdbc:
username: root
password: 123456
testSql: SELECT 1
# 日志配置
logging:
config: classpath:logback-test.xml
# 消息推送
msg:
enabled: true

View File

@@ -5,7 +5,7 @@
<groupId>com.jeesite</groupId>
<artifactId>jeesite-modules</artifactId>
<version>5.13.0.springboot3-SNAPSHOT</version>
<version>5.13.1.springboot3-SNAPSHOT</version>
<packaging>pom</packaging>
<name>JeeSite Modules</name>

View File

@@ -6,7 +6,7 @@
<parent>
<groupId>com.jeesite</groupId>
<artifactId>jeesite-parent</artifactId>
<version>5.13.0.springboot3-SNAPSHOT</version>
<version>5.13.1.springboot3-SNAPSHOT</version>
<relativePath>../../parent/pom.xml</relativePath>
</parent>

View File

@@ -6,7 +6,7 @@
<parent>
<groupId>com.jeesite</groupId>
<artifactId>jeesite-parent</artifactId>
<version>5.13.0.springboot3-SNAPSHOT</version>
<version>5.13.1.springboot3-SNAPSHOT</version>
<relativePath>../../parent/pom.xml</relativePath>
</parent>

View File

@@ -111,6 +111,9 @@ public class TestDataService extends CrudService<TestDataDao, TestData> {
}else{
testDataChildDao.delete(testDataChild);
}
// 保存上传图片
FileUploadUtils.saveFileUpload(testDataChild, testDataChild.getId(),
"testDataChildList["+index+"].testDataChild_image");
// 保存上传附件
FileUploadUtils.saveFileUpload(testDataChild, testDataChild.getId(),
"testDataChildList["+index+"].testDataChild_file");

View File

@@ -0,0 +1,24 @@
/**
* Copyright (c) 2013-Now http://jeesite.com All rights reserved.
* No deletion without permission, or be held responsible to law.
*/
package com.jeesite.test;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.test.context.ActiveProfiles;
/**
* JeeSite Web
* @author ThinkGem
* @version 2018-1-8
*/
@ActiveProfiles("test")
@SpringBootApplication
public class ApplicationTest {
public static void main(String[] args) {
SpringApplication.run(ApplicationTest.class, args);
}
}

View File

@@ -6,7 +6,6 @@ package com.jeesite.test;
import com.jeesite.common.collect.ListUtils;
import com.jeesite.common.tests.BaseSpringContextTests;
import com.jeesite.modules.Application;
import com.jeesite.modules.test.dao.TestDataDao;
import com.jeesite.modules.test.entity.TestData;
import org.junit.Test;
@@ -22,7 +21,7 @@ import java.util.List;
* @version 2019年10月28日
*/
@ActiveProfiles("test")
@SpringBootTest(classes = Application.class)
@SpringBootTest(classes = ApplicationTest.class)
public class InsertBatchTest extends BaseSpringContextTests {
@Autowired

View File

@@ -4,23 +4,21 @@
*/
package com.jeesite.test;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import com.jeesite.common.collect.ListUtils;
import com.jeesite.common.idgen.IdGen;
import com.jeesite.common.tests.BaseSpringContextTests;
import com.jeesite.modules.test.entity.TestData;
import com.jeesite.modules.test.entity.TestDataChild;
import com.jeesite.modules.test.service.TestDataService;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;
import com.jeesite.common.collect.ListUtils;
import com.jeesite.common.idgen.IdGen;
import com.jeesite.common.tests.BaseSpringContextTests;
import com.jeesite.modules.Application;
import com.jeesite.modules.test.entity.TestData;
import com.jeesite.modules.test.entity.TestDataChild;
import com.jeesite.modules.test.service.TestDataService;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* 多数据源并发测试<br>
@@ -31,7 +29,7 @@ import com.jeesite.modules.test.service.TestDataService;
* @version 2019-6-26
*/
@ActiveProfiles("test")
@SpringBootTest(classes = Application.class)
@SpringBootTest(classes = ApplicationTest.class)
public class MultiDataSourceTest extends BaseSpringContextTests {
@Autowired

View File

@@ -0,0 +1,15 @@
# 数据库连接
jdbc:
# Mysql 数据库配置
type: mysql
driver: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/jeesite_v5?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=CONVERT_TO_NULL&serverTimezone=Asia/Shanghai
username: root
password: 123456
testSql: SELECT 1
# 日志配置
logging:
config: classpath:logback-test.xml

View File

@@ -12,7 +12,7 @@
<groupId>com.jeesite</groupId>
<artifactId>jeesite-parent</artifactId>
<version>5.13.0.springboot3-SNAPSHOT</version>
<version>5.13.1.springboot3-SNAPSHOT</version>
<packaging>pom</packaging>
<name>JeeSite Parent</name>
@@ -33,7 +33,7 @@
<jmimemagic.version>0.1.5</jmimemagic.version>
<zxing.version>3.5.3</zxing.version>
<poi.version>5.2.3</poi.version>
<poi.version>5.4.1</poi.version>
<fury.version>0.10.2</fury.version>
<bcprov.version>1.78.1</bcprov.version>
<pinyin4j.version>2.5.1</pinyin4j.version>
@@ -80,7 +80,6 @@
<!-- docker setting -->
<docker.dockerHost>http://docker.local:2375</docker.dockerHost>
<docker.imageName>thinkgem/${project.artifactId}:latest</docker.imageName>
<docker.platform>linux/amd64</docker.platform>
<docker.run.port>8980:8980</docker.run.port>
</properties>
@@ -356,7 +355,7 @@
<plugin>
<groupId>io.fabric8</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.43.4</version>
<version>0.46.0</version>
<configuration>
<dockerHost>${docker.dockerHost}</dockerHost>
<verbose>true</verbose>
@@ -366,9 +365,6 @@
<alias>${project.artifactId}</alias>
<build>
<dockerFile>${project.basedir}/bin/docker/Dockerfile</dockerFile>
<buildOptions>
<platform>${docker.platform}</platform>
</buildOptions>
<assembly>
<descriptorRef>artifact</descriptorRef>
</assembly>

View File

@@ -5,7 +5,7 @@
<groupId>com.jeesite</groupId>
<artifactId>jeesite</artifactId>
<version>5.13.0.springboot3-SNAPSHOT</version>
<version>5.13.1.springboot3-SNAPSHOT</version>
<packaging>pom</packaging>
<name>JeeSite</name>

View File

@@ -5,7 +5,7 @@
<groupId>com.jeesite</groupId>
<artifactId>jeesite-root</artifactId>
<version>5.13.0.springboot3-SNAPSHOT</version>
<version>5.13.1.springboot3-SNAPSHOT</version>
<packaging>pom</packaging>
<name>JeeSite Root</name>

View File

@@ -6,7 +6,7 @@
<parent>
<groupId>com.jeesite</groupId>
<artifactId>jeesite-parent</artifactId>
<version>5.13.0.springboot3-SNAPSHOT</version>
<version>5.13.1.springboot3-SNAPSHOT</version>
<relativePath>../parent/pom.xml</relativePath>
</parent>
@@ -63,7 +63,7 @@
<dependency>
<groupId>com.jeesite</groupId>
<artifactId>jeesite-vue-dist</artifactId>
<version>5.13.0-SNAPSHOT</version>
<version>5.13.1-SNAPSHOT</version>
</dependency>
<!-- 热部署工具

View File

@@ -32,6 +32,10 @@ server:
uri-encoding: UTF-8
# 表单请求数据的最大大小
max-http-form-post-size: 20MB
# # 客户端发送请求参数个数限制
# max-parameter-count: 10000
# # 文件上传的表单请求参数个数限制
# max-part-count: 50
# # 进程的最大连接数
# max-connections: 8192
# # 连接数满后的排队个数
@@ -125,8 +129,9 @@ adminPath: /a
# 前端基础路径
frontPath: /f
# Vue 资源文件路径,与 VITE_PUBLIC_PATH 一致。
# 映射到 src/main/resources/{vuePath} 文件夹
# Vue 资源文件访问路径,映射到 src/main/resources/{vuePath} 文件夹
# 如果设置的是 /vue则映射目录为src/main/resources/vue 文件夹
# 该资源映射功能,会自动处理 Vue 的 history 路由模式
vuePath: /vue
# 用户相关

View File

@@ -44,7 +44,7 @@ set "RUN_JAVA=%JAVA_HOME%\bin\java"
goto runJava
:runJava
call "%RUN_JAVA%" -cp %CLASS_PATH% %JAVA_OPTS% org.springframework.boot.loader.launch.WarLauncher
call "%RUN_JAVA%" -cp %CLASS_PATH% %JAVA_OPTS% org.springframework.boot.loader.launch.WarLauncher %*
goto end
:end

View File

@@ -32,4 +32,4 @@ else
RUN_JAVA="$JAVA_HOME"/bin/java
fi
exec "$RUN_JAVA" -cp $CLASS_PATH $JAVA_OPTS org.springframework.boot.loader.launch.WarLauncher
exec "$RUN_JAVA" -cp $CLASS_PATH $JAVA_OPTS org.springframework.boot.loader.launch.WarLauncher $@

View File

@@ -6,7 +6,7 @@
<parent>
<groupId>com.jeesite</groupId>
<artifactId>jeesite-parent</artifactId>
<version>5.13.0.springboot3-SNAPSHOT</version>
<version>5.13.1.springboot3-SNAPSHOT</version>
<relativePath>../parent/pom.xml</relativePath>
</parent>

View File

@@ -32,6 +32,10 @@ server:
uri-encoding: UTF-8
# 表单请求数据的最大大小
max-http-form-post-size: 20MB
# # 客户端发送请求参数个数限制
# max-parameter-count: 10000
# # 文件上传的表单请求参数个数限制
# max-part-count: 50
# # 进程的最大连接数
# max-connections: 8192
# # 连接数满后的排队个数

View File

@@ -44,7 +44,7 @@ set "RUN_JAVA=%JAVA_HOME%\bin\java"
goto runJava
:runJava
call "%RUN_JAVA%" -cp %CLASS_PATH% %JAVA_OPTS% org.springframework.boot.loader.launch.WarLauncher
call "%RUN_JAVA%" -cp %CLASS_PATH% %JAVA_OPTS% org.springframework.boot.loader.launch.WarLauncher %*
goto end
:end

View File

@@ -32,4 +32,4 @@ else
RUN_JAVA="$JAVA_HOME"/bin/java
fi
exec "$RUN_JAVA" -cp $CLASS_PATH $JAVA_OPTS org.springframework.boot.loader.launch.WarLauncher
exec "$RUN_JAVA" -cp $CLASS_PATH $JAVA_OPTS org.springframework.boot.loader.launch.WarLauncher $@

View File

@@ -1,20 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false" scan="false">
<!-- Logger level setting -->
<include resource="org/springframework/boot/logging/logback/defaults.xml" />
<include resource="config/logger-core.xml"/>
<!-- Console log output -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} %clr(%-5p) %clr([%-39logger{39}]){cyan} - %m%n%wEx</pattern>
</encoder>
</appender>
<!-- Level: FATAL 0 ERROR 3 WARN 4 INFO 6 DEBUG 7 -->
<root level="WARN">
<appender-ref ref="console" />
</root>
</configuration>

View File

@@ -6,7 +6,7 @@
<parent>
<groupId>com.jeesite</groupId>
<artifactId>jeesite-parent</artifactId>
<version>5.13.0.springboot3-SNAPSHOT</version>
<version>5.13.1.springboot3-SNAPSHOT</version>
<relativePath>../parent/pom.xml</relativePath>
</parent>
@@ -26,11 +26,11 @@
<!-- docker setting -->
<docker.dockerHost>unix:///var/run/docker.sock</docker.dockerHost>
<docker.imageName>thinkgem/jeesite-web:latest</docker.imageName>
<!-- <docker.imageName>thinkgem/jeesite-web:amd64</docker.imageName>-->
<!-- <docker.platform>linux/amd64</docker.platform>-->
<!-- <docker.imageName>thinkgem/jeesite-web:arm64</docker.imageName>-->
<!-- <docker.platform>linux/arm64</docker.platform>-->
<docker.imageName>thinkgem/jeesite-web-fast:latest</docker.imageName>
<!-- <docker.imageName>crpi-u3zm0t8trv68xpyx.cn-qingdao.personal.cr.aliyuncs.com/thinkgem/jeesite:amd64</docker.imageName>-->
<!-- <docker.platforms>linux/amd64</docker.platforms>-->
<!-- <docker.imageName>crpi-u3zm0t8trv68xpyx.cn-qingdao.personal.cr.aliyuncs.com/thinkgem/jeesite:arm64</docker.imageName>-->
<!-- <docker.platforms>linux/arm64</docker.platforms>-->
<docker.run.port>8980:8980</docker.run.port>
</properties>
@@ -97,7 +97,7 @@
<dependency>
<groupId>com.jeesite</groupId>
<artifactId>jeesite-vue-dist</artifactId>
<version>5.13.0-SNAPSHOT</version>
<version>5.13.1-SNAPSHOT</version>
</dependency>
</dependencies>
@@ -133,6 +133,26 @@
<wtpContextName>${finalName}</wtpContextName>
</configuration>
</plugin>
<!-- Docker 插件 https://github.com/fabric8io/docker-maven-plugin - https://dmp.fabric8.io
<plugin>
<groupId>io.fabric8</groupId>
<artifactId>docker-maven-plugin</artifactId>
<configuration>
<images>
<image>
<build>
<buildx>
<builderName>maven</builderName>
<platforms>
<platform>${docker.platforms}</platform>
</platforms>
</buildx>
</build>
</image>
</images>
</configuration>
</plugin> -->
</plugins>
</build>

View File

@@ -32,6 +32,10 @@ server:
uri-encoding: UTF-8
# 表单请求数据的最大大小
max-http-form-post-size: 20MB
# # 客户端发送请求参数个数限制
# max-parameter-count: 10000
# # 文件上传的表单请求参数个数限制
# max-part-count: 50
# # 进程的最大连接数
# max-connections: 8192
# # 连接数满后的排队个数
@@ -125,8 +129,9 @@ adminPath: /a
# 前端基础路径
frontPath: /f
# Vue 资源文件路径,与 VITE_PUBLIC_PATH 一致。
# 映射到 src/main/resources/{vuePath} 文件夹
# Vue 资源文件访问路径,映射到 src/main/resources/{vuePath} 文件夹
# 如果设置的是 /vue则映射目录为src/main/resources/vue 文件夹
# 该资源映射功能,会自动处理 Vue 的 history 路由模式
vuePath: /vue
# 用户相关

View File

@@ -44,7 +44,7 @@ set "RUN_JAVA=%JAVA_HOME%\bin\java"
goto runJava
:runJava
call "%RUN_JAVA%" -cp %CLASS_PATH% %JAVA_OPTS% org.springframework.boot.loader.launch.WarLauncher
call "%RUN_JAVA%" -cp %CLASS_PATH% %JAVA_OPTS% org.springframework.boot.loader.launch.WarLauncher %*
goto end
:end

View File

@@ -32,4 +32,4 @@ else
RUN_JAVA="$JAVA_HOME"/bin/java
fi
exec "$RUN_JAVA" -cp $CLASS_PATH $JAVA_OPTS org.springframework.boot.loader.launch.WarLauncher
exec "$RUN_JAVA" -cp $CLASS_PATH $JAVA_OPTS org.springframework.boot.loader.launch.WarLauncher $@

View File

@@ -1,20 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false" scan="false">
<!-- Logger level setting -->
<include resource="org/springframework/boot/logging/logback/defaults.xml" />
<include resource="config/logger-core.xml"/>
<!-- Console log output -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} %clr(%-5p) %clr([%-39logger{39}]){cyan} - %m%n%wEx</pattern>
</encoder>
</appender>
<!-- Level: FATAL 0 ERROR 3 WARN 4 INFO 6 DEBUG 7 -->
<root level="WARN">
<appender-ref ref="console" />
</root>
</configuration>

View File

@@ -6,7 +6,7 @@
<parent>
<groupId>com.jeesite</groupId>
<artifactId>jeesite-parent</artifactId>
<version>5.13.0.springboot3-SNAPSHOT</version>
<version>5.13.1.springboot3-SNAPSHOT</version>
<relativePath>../parent/pom.xml</relativePath>
</parent>

View File

@@ -32,6 +32,10 @@ server:
uri-encoding: UTF-8
# 表单请求数据的最大大小
max-http-form-post-size: 20MB
# # 客户端发送请求参数个数限制
# max-parameter-count: 10000
# # 文件上传的表单请求参数个数限制
# max-part-count: 50
# # 进程的最大连接数
# max-connections: 8192
# # 连接数满后的排队个数

View File

@@ -44,7 +44,7 @@ set "RUN_JAVA=%JAVA_HOME%\bin\java"
goto runJava
:runJava
call "%RUN_JAVA%" -cp %CLASS_PATH% %JAVA_OPTS% org.springframework.boot.loader.launch.WarLauncher
call "%RUN_JAVA%" -cp %CLASS_PATH% %JAVA_OPTS% org.springframework.boot.loader.launch.WarLauncher %*
goto end
:end

View File

@@ -32,4 +32,4 @@ else
RUN_JAVA="$JAVA_HOME"/bin/java
fi
exec "$RUN_JAVA" -cp $CLASS_PATH $JAVA_OPTS org.springframework.boot.loader.launch.WarLauncher
exec "$RUN_JAVA" -cp $CLASS_PATH $JAVA_OPTS org.springframework.boot.loader.launch.WarLauncher $@

View File

@@ -6,7 +6,7 @@
<parent>
<groupId>com.jeesite</groupId>
<artifactId>jeesite-parent</artifactId>
<version>5.13.0.springboot3-SNAPSHOT</version>
<version>5.13.1.springboot3-SNAPSHOT</version>
<relativePath>../parent/pom.xml</relativePath>
</parent>

View File

@@ -32,6 +32,10 @@ server:
uri-encoding: UTF-8
# 表单请求数据的最大大小
max-http-form-post-size: 20MB
# # 客户端发送请求参数个数限制
# max-parameter-count: 10000
# # 文件上传的表单请求参数个数限制
# max-part-count: 50
# # 进程的最大连接数
# max-connections: 8192
# # 连接数满后的排队个数

View File

@@ -44,7 +44,7 @@ set "RUN_JAVA=%JAVA_HOME%\bin\java"
goto runJava
:runJava
call "%RUN_JAVA%" -cp %CLASS_PATH% %JAVA_OPTS% org.springframework.boot.loader.launch.WarLauncher
call "%RUN_JAVA%" -cp %CLASS_PATH% %JAVA_OPTS% org.springframework.boot.loader.launch.WarLauncher %*
goto end
:end

View File

@@ -32,4 +32,4 @@ else
RUN_JAVA="$JAVA_HOME"/bin/java
fi
exec "$RUN_JAVA" -cp $CLASS_PATH $JAVA_OPTS org.springframework.boot.loader.launch.WarLauncher
exec "$RUN_JAVA" -cp $CLASS_PATH $JAVA_OPTS org.springframework.boot.loader.launch.WarLauncher $@

View File

@@ -1,20 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false" scan="false">
<!-- Logger level setting -->
<include resource="org/springframework/boot/logging/logback/defaults.xml" />
<include resource="config/logger-core.xml"/>
<!-- Console log output -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} %clr(%-5p) %clr([%-39logger{39}]){cyan} - %m%n%wEx</pattern>
</encoder>
</appender>
<!-- Level: FATAL 0 ERROR 3 WARN 4 INFO 6 DEBUG 7 -->
<root level="WARN">
<appender-ref ref="console" />
</root>
</configuration>