Compare commits

..

25 Commits

Author SHA1 Message Date
thinkgem
97e318725a 5.11.0 2025-03-24 14:42:12 +08:00
thinkgem
48801a5596 新增 sys.office.notAllowDeleteIfUserExists 和 sys.company.notAllowDeleteIfUserExists 参数,增加删除机构和公司数据的时候校验是否有用户 2025-03-24 14:03:51 +08:00
thinkgem
d127c2dc32 清理组织和公司下的用户缓存,包含子机构 2025-03-24 14:02:54 +08:00
thinkgem
4befea3e6f update productVersion 2025-03-24 13:59:26 +08:00
thinkgem
96a07e886d update 2025-03-22 18:52:01 +08:00
thinkgem
2f2b508225 网站优化一些基础样式 2025-03-22 18:48:57 +08:00
thinkgem
fbac25ef38 文章按权重排序修复 2025-03-22 18:48:12 +08:00
thinkgem
3aff37f35a add job init remarks 2025-03-17 15:41:47 +08:00
thinkgem
a1beed5b5e 属性获取工具,支持从系统环境变量中获取参数 2025-03-11 15:23:02 +08:00
thinkgem
fee4848ae2 update README.md 2025-03-11 15:22:26 +08:00
thinkgem
84d59dea96 jeesite-*.yml模块配置文件,增加IDEA提示助手 2025-03-08 10:11:37 +08:00
thinkgem
688797ae40 update 2025-03-04 13:03:34 +08:00
thinkgem
0132eb2a9e 修正安全管理器限制的本地调用 2025-03-04 09:51:14 +08:00
thinkgem
7eeae69a63 账号找回密码增加租户参数 2025-03-02 21:03:15 +08:00
thinkgem
6a83a0f8f2 登录界面租户框调整到上面 2025-02-28 16:55:15 +08:00
thinkgem
9c5dd7d7bb update config 2025-02-28 13:35:11 +08:00
thinkgem
14d772cf6d 个人中心代码优化 2025-02-26 14:21:31 +08:00
thinkgem
ee6715de0a next 2025-02-24 09:24:54 +08:00
thinkgem
52f3b0d2bf 新增字段权限接口,过滤 select 返回值,update 和 insert 字段值 2025-02-21 15:52:13 +08:00
thinkgem
f27dc31fb8 增加更严格的权限控制,对单条数据进行数据权限过滤 2025-02-21 15:47:17 +08:00
thinkgem
74b806ca1b AppComment合并更新状态方法 2025-02-21 15:45:05 +08:00
thinkgem
29f3c6894c 优化 编辑公司时,清理公司下的用户缓存 2025-02-20 17:50:06 +08:00
thinkgem
f9bcba6994 优化 编辑机构时,清理机构下的用户缓存 2025-02-20 17:49:44 +08:00
thinkgem
ed40654d6a 新增 findUserListByCompanyCodes 方法,根据公司编码获取用户编码和名称 2025-02-20 17:49:06 +08:00
thinkgem
208ba4a86e fileupload bizType参数为空时,readonly不生效问题 2025-02-20 17:47:42 +08:00
58 changed files with 455 additions and 328 deletions

View File

@@ -37,7 +37,7 @@
* QQ 群:`127515876``209330483``223507718``709534275``730390092``1373527``183903863(外包)`
* 微信群:如果二维码过期,请尝试刷新图片,或者添加客服微信 jeesitex 邀请您进群
<p style="padding-left:40px"><a href="https://jeesite.com/assets/images/wxg_cur.png" target="_blank">
<p style="padding-left:40px"><a href="https://jeesite.com/assets/images/wxg_cur.png" target="_blank">  
<img alt="JeeSite微信群" src="https://jeesite.com/assets/images/wxg_cur.png" width="200"/></a>
</p>
@@ -246,6 +246,7 @@ docker run --name jeesite-web -p 8980:8980 -d --restart unless-stopped \
## 技术支持与服务
* 本软件免费,我们也提供了相应的收费服务,因为:
* 没有资金的支撑就很难得到发展,特别是一个好的产品,如果 JeeSite 帮助了您,请为我们点赞。支持我们,您可以获得更多回馈,我们会把公益事业做的更好,开放更多资源,回报社区和社会。请给我们一些动力吧,在此非常感谢已支持我们的朋友!
* **联系我们**:请访问技术支持与服务页面:<http://s.jeesite.com>

View File

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

View File

@@ -174,7 +174,7 @@ public class PropertiesUtils {
private static final Pattern p1 = Pattern.compile("\\$\\{.*?\\}");
/**
* 获取属性值取不到从System.getProperty()获取都取不到返回null
* 获取属性值取不到从System.getProperty和System.getenv获取都取不到返回null
*/
public String getProperty(String key) {
if (environment != null){
@@ -196,9 +196,10 @@ public class PropertiesUtils {
String systemProperty = System.getProperty(key);
if (systemProperty != null) {
return systemProperty;
}else{
return System.getenv(key);
}
}
return null;
}
/**

View File

@@ -50,7 +50,7 @@ public class JsonMapper extends ObjectMapper {
private static final class JsonMapperHolder {
private static final JsonMapper INSTANCE = new JsonMapper();
}
public JsonMapper() {
// Spring ObjectMapper 初始化配置,支持 @JsonView
new Jackson2ObjectMapperBuilder().configure(this);
@@ -182,8 +182,8 @@ public class JsonMapper extends ObjectMapper {
* 反序列化POJO或简单Collection如List<String>.
* 如果JSON字符串为Null或"null"字符串, 返回Null.
* 如果JSON字符串为"[]", 返回空集合.
* 如需反序列化复杂Collection如List<MyBean>, 请使用fromJson(String,JavaType)
* @see #fromJson(String, JavaType)
* 如需反序列化复杂Collection如List<MyBean>, 请使用fromJson(String, Class)
* @see #fromJson(String, Class)
*/
public <T> T fromJsonString(String jsonString, Class<T> clazz) {
if (StringUtils.isEmpty(jsonString) || "<CLOB>".equals(jsonString)) {

View File

@@ -1,170 +0,0 @@
=ZTree v3.x (JQuery Tree插件) 更新日志=
<font color="red">为了更好的优化及扩展zTree, 因此决定升级为v3.x并且对之前的v2.x不兼容会有很多结构上的修改对此深感无奈与抱歉请大家谅解。</font>
<font color="red">
具体修改内容可参考:
* [http://www.ztree.me/v3/api.php zTree v3.0 API 文档]
* [http://www.ztree.me/v3/demo.php#_101 zTree v3.0 Demo 演示]
* [http://www.ztree.me/v3/faq.php#_101 zTree v3.0 常见问题]
</font>
<font color=#041594>
*2013.03.11* v3.5.12
* 【修改】由于 jquery 1.9 中移除 event.srcElement 导致的 js 报错的bug。
* 【修改】在异步加载模式下,使用 moveNode 方法,且 moveType != "inner" 时,也会导致 targetNode 自动加载子节点的 bug
* 【修改】对已经显示的节点(nochecked=true)使用 showNodes 或 showNode 方法后导致勾选框出现的bug。
* 【修改】对已经隐藏的节点(nochecked=false)使用 hideNodes 或 hideNode 方法后导致勾选框消失的bug。
* 【修改】getNodesByParamFuzzy 支持 大小写模糊。
* 【修改】className 结构,提取 _consts.className.BUTTON / LEVEL / ICO_LOADING / SWITCH便于快速修改 css 冲突。
例如:与 WordPress 产生冲突后,直接修改 core 中的 "button" 和 "level" 即可。 Issue: https://github.com/zTree/zTree_v3/issues/2
*2013.01.28* v3.5.02
* 【增加】setting.check.chkDisabledInherit 属性,用于设置 chkDisabled 在初始化时子节点是否可以继承父节点的 chkDisabled 属性
* 【删除】内部 noSel 方法,使用 selectstart事件 和 "-moz-user-select"样式 处理禁止 节点文字被选择的功能
* 【修改】不兼容 jQuery 1.9 的bug
* 【修改】onDrop 的触发规则,保证异步加载模式下,可以在延迟加载结束后触发,避免 onDrop 中被拖拽的节点是已经更新后的数据。
* 【修改】setChkDisabled 方法,增加 inheritParent, inheritChildren 参数设置是否让父子节点继承 disabled
* 【修改】异步加载时 拼接参数的方法,由 string 修改为 json 对象
* 【修正】1-2-3 3级节点时如果 2级节点 全部设置为 nocheck 或 chkDisabled后勾选3级节点时1级节点的半勾选状态错误的 bug
* 【修改】Demo: checkbox_nocheck.html & checkbox_chkDisabled.html;
* 【修改】Demo: edit_super.html增加 showRenameBtn & showRemoveBtn 的演示
* 【修改】Demo: asyncForAll, 将 post 修改为 get为了避免由于 IE10 的 bug 造成的客户端 以及 服务端崩溃
IE10 ajax Post 无法提交参数的bug (http://bugs.jquery.com/ticket/12790)
*2012.12.21* v3.5.01
* 【优化】clone 方法
* 【修正】对于初始化无 children 属性的父节点进行 reAsyncChildNodes 操作时出错的 bug
* 【修正】beforeRename 回调中使用 cancelEditName 方法后,再 return false 导致无法重新进行编辑的 bug
* 【修正】exedit 扩展包让 setting.data.key.url 失效的 bug
* 【修正】setting.check.autoCheckTrigger 设置为 true 时onCheck 回调缺少 event 参数的 bug
* 【修正】singlepath.html Demo 中的 bug
*2012.11.20* v3.5
* 【优化】原先的 clone 方法 (特别感谢:愚人码头)
* 【修改】隐藏父节点后,使用 expandAll 方法导致 父节点展开的 bug
* 【修改】使用 jQuery v1.7 以上时,设置 zTree 容器 ul 隐藏visibility: hidden;)后, 调用 selectNode 导致 IE 浏览器报错 Can't move focus 的 bug
* 【修改】正在异步加载时,执行 destory 或 init 方法后,异步加载的节点影响新树的 bug
* 【修改】方法 reAsyncChildNodes 在 refresh 的时候未清空内部 cache 导致内存泄露 的 bug
* 【修改】批量节点拖拽到其他父节点内inner导致顺序反转 的 bug
* 【修改】对于 使用 html格式的 节点无法触发 双击事件 的 bug
* 【修改】onCheck 回调中的 event ,保证与触发事件中的 event 一致
* 【修改】异步加载时,在 onNodeCreated 中执行 selectNode 后,导致节点折叠的 bug
* 【修改】API 中 dataFilter 的参数名称 childNodes -> responseData
* 【修改】API 中 iconSkin 的 举例内容
* 【修改】API 中 chkDisabled 的说明
* 【修改】Demo 中 index.html 内的 loadReady 重复绑定问题
*2012.09.03* v3.4
* 【增加】 Demo —— OutLook 样式的左侧菜单
* 【增加】清空 zTree 的方法 $.fn.zTree.destory(treeId) & zTree.destory()
* 【修改】core核心文件内 _eventProxy 方法中获取 tId 的方法,提高 DOM 的灵活性
* 【修改】初始化时 多层父节点的 checkbox 半选状态计算错误的 bug
* 【修改】同时选中父、子节点后,利用 getSelectedNodes 获取选中节点并利用 removeNode 删除时报错的 bug
* 【修改】treeNode.chkDisabled / nocheck 属性,支持字符串格式的 "false"/"true"
* 【修改】异步加载模式下无法利用 server 返回 xml 并且 在 dataFilter 中继续处理的 bug
* 【修改】title 只允许设置为 string 类型值的问题。 修正后允许设置为 number 类型的值
* 【修改】zId 计数规则 & Cache 保存,减少 IE9 的 bug 造成的内存泄漏
* 【修改】API 页面搜索功能导致 IE 崩溃的 bug
*2012.07.16* v3.3
* 【增加】扩展库 exhide -- 节点隐藏功能
* 【修改】getNodesByFilter 方法,添加 invokeParam 自定义参数
* 【修改】拖拽中测试代码未删除,导致出现黄颜色的 iframe 遮罩层的 bug
* 【修改】延迟加载方法 对于使用 expandAll 进行全部展开时,导致 onNodeCreated 回调 和 addDiyDom 方法触发过早的 bug
* 【修改】使用 moveNode 移动尚未生成 DOM 的节点时,视图会出现异常的 bug
* 【修改】删除节点后,相关节点的 isFirstNode 属性未重置的 bug
* 【修改】getPreNode(),getNextNode() 方法在对于特殊情况时计算错误的 bug
* 【修改】设置 title 之后,如果重新将 title 内容设置为空后,会导致无法更新 title 的 bug
* 【修改】针对 setting.check.chkStyle=="radio" && setting.check.radioType=="all" 的情况时getTreeCheckedNodes方法优化找到一个结果就 break
* 【修改】zTreeObj.getCheckedNodes(false) 在 radioType = "all" 时计算错误的 bug
* 【修改】完善 API 中 beforeDrop / onDrop 的关于 treeId 的说明
*2012.05.13* v3.2
* 【增加】setting.data.key.url 允许修改 treeNode.url 属性
* 【增加】getNodesByFilter(filter, isSingle) 方法
* 【增加】"与其他 DOM 拖拽互动" 的 Demo (http://www.ztree.me/v3/demo.php#_511)
* 【增加】"异步加载模式下全部展开" 的 Demo (http://www.ztree.me/v3/demo.php#_512)
* 【修改】代码结构,将 addNodes、removeNode、removeChildNodes 方法 和 beforeRemove、onRemove 回调 转移到 core 内
* 【修改】IE7的环境下无子节点的父节点反复展开出现多余空行的 bug
* 【修改】异步加载时,如果出现网络异常等,会导致 图标显示错误的 bug
* 【修改】dataFilter中 return null 导致异常 的 bug
* 【修改】removeChildNodes 方法清空子节点后,无法正常添加节点的 bug
* 【修改】moveNode 后节点中的自定义元素的事件丢失的 bug
* 【修改】moveNode 方法中设置 isSilent = true 时,如果移动到已展开的 父节点后,出现异常的 bug
* 【修改】onClick/onDrag/onDrop 回调中 event 不是原始 event 的 bug
* 【修改】onDrop 回调中 当拖拽无效时,无法获得 treeNodes 的 bug
* 【修改】onDrop 无法判断拖拽是 移动还是复制的问题
* 【修改】未开启异步加载模式时,拖拽节点到子节点为空的父节点内时 出现异常 的 bug
* 【修改】拖拽过程中,反复在 父节点图标上划动时,会出现停顿的 bug
(需要css 结构—— button -> span.button)
* 【修改】拖拽操作时箭头 与 targetNode 背景之间的细节现实问题,便于用户拖拽时更容易区分 prev、next 和 inner 操作
* 【修改】拖拽操作时IE6/7 下 在 节点<a> 右侧 10px 内会导致 targetNode = root 的 bug
* 【修改】编辑模式下 默认的编辑按钮、删除按钮点击后,如果相应的 before 回调 return false 时会触发 onClick 回调的 bug
*2012.02.14* v3.1
* 【增加】ajax 的参数 setting.async.contentType ,让提交参数适用于 json 数据提交 (主要适用于 .Net 的开发)。
* 【增加】setting.edit.editNameSelectAll, 用于设定编辑节点名称时初次显示 input 后 text 内容为全选
* 【修改】异步加载 规则,不再仅仅依靠父节点的子节点数来判定,增加内部属性 zAsync保证默认状态下父节点及时无子节点也只能异步加载一次除非使用 reAsyncChildNodes 方法强行控制异步加载。
* 【修改】放大浏览器后导致 界面出现多余连接线的bug 需要更新icon 图标和 css
* 【修改】在编辑状态如果节点名超过编辑框宽度左右键在框内不起作用的bugIE 6 7 8 出现)
CSS 中 filter:alpha(opacity=80) 造成的,应该是 ie 的 bug需要更新 css 文件
* 【修改】title 设置后,如果属性不存在,则默认为 title 为空,便于数据容错和用户灵活使用
* 【修改】editName 方法如果针对尚未展开的 父节点,会导致该父节点自动展开的 bug
* 【修改】title 中存在标签时导致 title 显示异常的bug例如蓝色字22%"'`<input/>`
*2012.01.10* v3.0
* 【增加】setting.check.autoCheckTrigger 默认值 false可以设置联动选中时是否触发事件回调函数
* 【增加】setting.callback.beforeEditName 回调函数,以保证用户可以捕获点击编辑按钮的事件
* 【增加】treeNode.chkDisabled 属性,显示 checkbox 但是用户无法修改 checkbox 状态,并且该 checkbox 会影响父节点的 checkbox 的半选状态
* 【增加】setting.check.nocheckInherit 属性,用户设置子节点继承 nocheck 属性,用于批量初始化节点,不适用于已经显示的节点
* 【增加】setting.edit.drag.autoExpandTrigger 默认值 false可以设置自动展开、折叠操作时是否触发事件回调函数
* 【增加】setting.view.nameIsHTML 默认值 false允许用户对 name 设置 DOM 对象
* 【增加】treeNode.click 属性的说明文档
* 【增加】treeObj.setChkDisabled 方法用于设置 checkbox / radio disabled 状态
* 【增加】treeNode.halfCheck 属性,用于强制设定节点的半选状态
* 【修改】异步加载 & 编辑功能 共存时,拖拽节点 或 增加节点 导致 ie 上报错的 bug apply 方法引起)
* 【修改】zTreeStyle 样式冲突
* 【修改】setting.data.key.title 默认值设置为 "",初始化时自动赋值为 setting.data.key.name 这样可避免希望 title 与 name 一致的用户反复设置参数
* 【修改】点击叶子节点的连接线会触发 expand 事件的 bug
* 【修改】IE 下 点击叶子节点连线会出现虚线框的 bug
* 【修改】updateNode 导致 checkbox 半选状态错误的 bug
* 【修改】checkNode 方法实现 toggle 操作, 取消 expandAll 方法的 toggle 操作
* 【修改】zTree 内鼠标移动会抢页面上 input 内的焦点的 bug
* 【修改】beforeRename / onRename 的触发方式——即使名称内容未改变也会触发,便于用户配合 beforeEditName 捕获编辑状态的结束,赋予用户更多调整规则的权利
* 【修改】与 easyUI 共存时无法拖拽的bug
* 【修改】beforeRename 在 Firefox 下如果利用 alert会触发两次的 bug
* 【修改】checkNode/expandNode/removeNode 方法,默认不触发回调函数,恢复 v2.6 的默认状态,同时增加 callbackFlag 参数,设置为 true 时,可以触发回调函数
* 【修改】IE9下“根据参数查找节点”的Demo 报错行14 重新声明常量属性(Demo 自身的问题定义了history变量)
* 【修改】初始化 zTree 时 onNodeCreated 事件回调函数中无法 用 getZTreeObj 获取 zTree 对象的 bug
* 【修改】setting.edit.drag.prev / next / inner 参数,增加被拖拽的节点集合
* 【修改】异步加载模式下otherParam 使用Array数组会出错的 bug。例如 ["id", "1", "name", "test"]
* 【修改】FireFox 下多棵树拖拽异常的 bug
* 【修改】exedit 中调用 excheck库的方法时没有进行容错处理导致如果只加入 exedit 而没有 excheck的时候会出现 js 错误
* 【修改】显示 checkbox 的 zTree 在编辑模式下,移动节点不会更新父节点半选状态的 bug
* 【修改】treeNode.childs --> children; treeObject.removeChilds --> removeChildNodes; setting.data.key.childs --> children英文不好惹的祸抱歉了
* 【修改】onRemove 回调中得到的 treeNode 还可以查找 preNode、nextNode 的bug。 修正后getPreNode 和 getNextNode 都返回 null 为了便于查找父节点getParentNode 仍保留
* 【修改】简单数据模式下,如果 id 与 pId 的值相同会导致该节点无法正常加载的 bug
* 【修改】移动或删除中间节点会导致最后一个节点连接线图标变小的 bug
*2011.09.05* v3.0 beta
* 【修改】zTree 的 js 代码架构全面修改,并且拆分
* 【修改】zTree 的 css 样式全面修改对浏览器可以更好地兼容同时解决了以前1个像素差的问题
* 【优化】采用延迟加载技术,一次性加载大数据量的节点性能飞速提升
* 【增加】支持多节点同时选中、拖拽
* 【增加】checkNode、checkAllNodes 等多种方法
* 【增加】IE6 自动取消动画展开、折叠的功能
* 【修正】异步加载 & 编辑模式 能够更完美的共存
* 【修正】setting 配置更加合理,并且增加了若干项配置参数
* 【修正】treeNode 节点数据的属性更加合理,并且增加了一些方法
* 【修正】拖拽操作更加灵活方便,更容易制定自己的规则
* 【修正】其他若干修改,详细对比请参考 url[http://www.ztree.me/v3/faq.php#_101 zTree v3.0 常见问题]

View File

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

View File

@@ -24,13 +24,14 @@ import java.util.Date;
@Column(name="category", attrName="category", label="问题分类"),
@Column(name="content", attrName="content", label="问题和意见"),
@Column(name="contact", attrName="contact", label="联系方式"),
@Column(includeEntity=DataEntity.class),
@Column(name="create_by_name", attrName="createByName", label="提问人员姓名", queryType=QueryType.LIKE),
@Column(name="device_info", attrName="deviceInfo", label="设备信息"),
@Column(name="reply_date", attrName="replyDate", label="回复时间"),
@Column(name="reply_content", attrName="replyContent", label="回复意见"),
@Column(name="reply_user_code", attrName="replyUserCode", label="回复人员"),
@Column(name="reply_user_name", attrName="replyUserName", label="回复人员姓名", queryType=QueryType.LIKE),
@Column(name="status", attrName="status", label="状态", isUpdate=true), // save时允许更新status字段
@Column(includeEntity=DataEntity.class),
}, orderBy="a.create_date DESC"
)
public class AppComment extends DataEntity<AppComment> {

View File

@@ -4,11 +4,11 @@
*/
package com.jeesite.modules.app.web;
import java.util.Date;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.jeesite.common.config.Global;
import com.jeesite.common.entity.Page;
import com.jeesite.common.web.BaseController;
import com.jeesite.modules.app.entity.AppComment;
import com.jeesite.modules.app.service.AppCommentService;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
@@ -20,11 +20,9 @@ import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.jeesite.common.config.Global;
import com.jeesite.common.entity.Page;
import com.jeesite.common.web.BaseController;
import com.jeesite.modules.app.entity.AppComment;
import com.jeesite.modules.app.service.AppCommentService;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Date;
/**
* APP意见反馈Controller
@@ -97,7 +95,6 @@ public class AppCommentController extends BaseController {
}
}
appCommentService.save(appComment);
appCommentService.updateStatus(appComment);
return renderResult(Global.TRUE, text("保存意见成功!"));
}

View File

@@ -24,4 +24,5 @@
5.9.1
5.9.2
5.10.0
5.10.1
5.10.1
5.11.0

View File

@@ -6,7 +6,7 @@
<parent>
<groupId>com.jeesite</groupId>
<artifactId>jeesite-parent</artifactId>
<version>5.10.1-SNAPSHOT</version>
<version>5.11.0-SNAPSHOT</version>
<relativePath>../../parent/pom.xml</relativePath>
</parent>
@@ -24,6 +24,12 @@
<artifactId>jeesite-module-core</artifactId>
<version>${project.parent.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
</dependencies>

View File

@@ -61,7 +61,7 @@ import java.util.Date;
@Column(name = "site_code"),
@Column(name = "site_name"),
})
}, extWhereKeys = "dsfCategory", orderBy = "a.update_date DESC"
}, extWhereKeys = "dsfCategory", orderBy = "a.weight DESC, a.update_date DESC"
)
public class Article extends DataEntity<Article> {

View File

@@ -0,0 +1,81 @@
/**
* Copyright (c) 2013-Now http://jeesite.com All rights reserved.
* No deletion without permission, or be held responsible to law.
*/
package com.jeesite.modules.cms.properties.properties;
import org.springframework.boot.context.properties.ConfigurationProperties;
/**
* CmsProperties
* @author ThinkGem
* @version 2022-4-10
*/
@ConfigurationProperties(prefix = "cms")
public class CmsProperties {
private PageCache pageCache = new PageCache();
public static class PageCache {
/**
* 是否开启页面静态化缓存
*/
private Boolean enabled = false;
/**
* 缓存名称标识
*/
private String cacheName = "cmsPageCache";
/**
* 拦截的网页地址
*/
private String urlPatterns = "${frontPath}/*";
/**
* 只静态化 .html 后缀的网页
*/
private String urlSuffixes = ".html";
public Boolean getEnabled() {
return enabled;
}
public void setEnabled(Boolean enabled) {
this.enabled = enabled;
}
public String getCacheName() {
return cacheName;
}
public void setCacheName(String cacheName) {
this.cacheName = cacheName;
}
public String getUrlPatterns() {
return urlPatterns;
}
public void setUrlPatterns(String urlPatterns) {
this.urlPatterns = urlPatterns;
}
public String getUrlSuffixes() {
return urlSuffixes;
}
public void setUrlSuffixes(String urlSuffixes) {
this.urlSuffixes = urlSuffixes;
}
}
public PageCache getPageCache() {
return pageCache;
}
public void setPageCache(PageCache pageCache) {
this.pageCache = pageCache;
}
}

View File

@@ -0,0 +1,12 @@
## 重要提示Tip
## 请勿在该配置文件中添加其它任何配置(添加也不会生效)。
## 该文件,仅仅是为了让 jeesite-cms.yml 文件,
## 在 IDEA 中有一个自动完成及帮助提示,并无其它用意。
## 参数配置请在 jeesite-cms.yml 文件中添加。
spring:
config:
import:
- classpath:config/jeesite-cms.yml

View File

@@ -3,7 +3,7 @@
cms:
pageCache:
# 是否开启页面静态化缓存
#enabled: true
enabled: false
# 缓存名称标识
cacheName: cmsPageCache
# 拦截的网页地址

View File

@@ -32,4 +32,5 @@
5.9.1
5.9.2
5.10.0
5.10.1
5.10.1
5.11.0

View File

@@ -4,6 +4,10 @@ body>.navbar{-webkit-transition:background-color .3s ease-in;transition:backgrou
body>.navbar-transparent{background-color:transparent}
body>.navbar-transparent .navbar-nav>.open>a{background-color:transparent!important}
}
h1,.h1{font-size:26px}
h2,.h2{font-size:24px}
h3,.h3{font-size:22px}
p{margin:5px 0 10px;line-height:1.75;}
#home{padding-top:0}
#home .navbar-brand{padding:13.5px 15px 12.5px}
#home .navbar-brand>img{display:inline;margin:0 10px;height:100%}
@@ -80,7 +84,7 @@ footer p{clear:left;margin-bottom:0}
.article-title {color:#333;font-size:30px;text-align:center;border-bottom:1px solid #ddd;padding:15px 20px 20px 20px;margin-bottom:30px;}
.article-info {border-top:1px solid #ddd;padding:10px;margin:30px 0 0;}
.article-desc {padding:8px 10px 8px;margin:10px 20px 20px 35px;font-size:14px;}
.article-content {padding-top:20px;}
.article-content {padding-top:10px;}
.pagination {margin:8px 0;display:block;/* text-align:center; */font-size:13px;} /* .pagination .controls a{border:0;} */
.pagination>li>a, .pagination>li>span {min-width:37px;text-align:center;padding:6px;border:1px solid #ddd;background:transparent;/* border-radius:3px; */}

View File

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

View File

@@ -37,6 +37,11 @@ public interface EmpUserDao extends CrudDao<EmpUser> {
* 根据部门编码查询用户,仅返回基本信息
*/
List<EmpUser> findUserListByOfficeCodes(EmpUser empUser);
/**
* 根据公司编码查询用户,仅返回基本信息
*/
List<EmpUser> findUserListByCompanyCodes(EmpUser empUser);
/**
* 根据角色编码查询用户,仅返回基本信息

View File

@@ -338,6 +338,7 @@ public class InitCoreData extends BaseInitDataTests {
job.setConcurrent(Global.NO);
job.setMisfireInstruction(CronTrigger.MISFIRE_INSTRUCTION_DO_NOTHING);
job.setStatus(JobEntity.STATUS_PAUSED);
job.setRemarks("实时推送和设定计划推送时间的定时推送消息。");
jobDao.insert(job);
job = new JobEntity(MsgLocalMergePushTask.class.getSimpleName(), "SYSTEM");
job.setDescription("消息推送服务 (合并推送)");
@@ -346,6 +347,19 @@ public class InitCoreData extends BaseInitDataTests {
job.setConcurrent(Global.NO);
job.setMisfireInstruction(CronTrigger.MISFIRE_INSTRUCTION_DO_NOTHING);
job.setStatus(JobEntity.STATUS_PAUSED);
job.setRemarks("不重要的通知进行汇总30分钟或更长执行一次将多条消息合并为一条消息延迟推送给用户。");
jobDao.insert(job);
job = new JobEntity("DeleteLogBefore", "SYSTEM");
job.setDescription("清理访问日志 (3个月前)");
job.setInvokeTarget("logService.deleteLogBefore(0, 3, 0)");
job.setCronExpression("0 0 0 1 1/1 ? *");
job.setConcurrent(Global.NO);
job.setMisfireInstruction(CronTrigger.MISFIRE_INSTRUCTION_DO_NOTHING);
job.setStatus(JobEntity.STATUS_PAUSED);
job.setRemarks("1、清理1年前的所有日志logService.deleteLogBefore(1, 0, 0)\n" +
"2、清理6个月前的所有日志logService.deleteLogBefore(0, 6, 0)\n" +
"3、清理7天前的所有日志logService.deleteLogBefore(0, 0, 7)\n" +
"4、清理1年6个月前的所有日志logService.deleteLogBefore(1, 6, 0)");
jobDao.insert(job);
}

View File

@@ -47,6 +47,11 @@ public interface EmpUserService extends CrudServiceApi<EmpUser> {
* 根据部门编码查询用户,仅返回基本信息
*/
List<EmpUser> findUserListByOfficeCodes(EmpUser empUser);
/**
* 根据公司编码查询用户,仅返回基本信息
*/
List<EmpUser> findUserListByCompanyCodes(EmpUser empUser);
/**
* 根据角色编码查询用户,仅返回基本信息

View File

@@ -5,15 +5,19 @@
package com.jeesite.modules.sys.service.support;
import com.jeesite.common.collect.ListUtils;
import com.jeesite.common.lang.StringUtils;
import com.jeesite.common.service.TreeService;
import com.jeesite.common.utils.PageUtils;
import com.jeesite.modules.sys.dao.CompanyDao;
import com.jeesite.modules.sys.dao.CompanyOfficeDao;
import com.jeesite.modules.sys.entity.Company;
import com.jeesite.modules.sys.entity.CompanyOffice;
import com.jeesite.modules.sys.entity.EmpUser;
import com.jeesite.modules.sys.service.CompanyService;
import com.jeesite.modules.sys.service.DataScopeService;
import com.jeesite.modules.sys.service.EmpUserService;
import com.jeesite.modules.sys.utils.EmpUtils;
import org.apache.commons.lang3.StringUtils;
import com.jeesite.modules.sys.utils.UserUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
@@ -29,9 +33,10 @@ public class CompanyServiceSupport extends TreeService<CompanyDao, Company>
@Autowired
private CompanyOfficeDao companyOfficeDao;
@Autowired
private DataScopeService dataScopeService;
@Autowired
private EmpUserService empUserService;
/**
* 获取单条数据
@@ -86,7 +91,7 @@ public class CompanyServiceSupport extends TreeService<CompanyDao, Company>
companyOfficeDao.insertBatch(list, null);
}
// 清理公司相关缓存
clearCompanyCache();
clearCompanyCache(company);
}
/**
@@ -95,9 +100,10 @@ public class CompanyServiceSupport extends TreeService<CompanyDao, Company>
@Override
@Transactional
public void delete(Company company) {
company.sqlMap().markIdDelete();
super.delete(company);
// 清理公司相关缓存
clearCompanyCache();
clearCompanyCache(company);
}
/**
@@ -108,15 +114,37 @@ public class CompanyServiceSupport extends TreeService<CompanyDao, Company>
public void updateStatus(Company company) {
dao.updateStatus(company);
// 清理公司相关缓存
clearCompanyCache();
clearCompanyCache(company);
}
/**
* 清理公司相关缓存
*/
private void clearCompanyCache(){
// EmpUtils.removeCache(EmpUtils.CACHE_COMPANY_LIST);
private void clearCompanyCache(Company company){
EmpUtils.removeCache(EmpUtils.CACHE_COMPANY_ALL_LIST);
// 清理公司下的用户缓存,包含子公司
if (company == null || StringUtils.isBlank(company.getCompanyCode())){
return;
}
if (StringUtils.isBlank(company.getParentCode())){
company = get(company);
if (company == null){
return;
}
}
Company where = new Company();
where.setStatus(Company.STATUS_NORMAL);
where.setParentCodes(company.getParentCodes() + company.getCompanyCode() + ",%");
EmpUser empUserWhere = new EmpUser();
empUserWhere.setCodes(this.findByParentCodesLike(where).stream().map(Company::getCompanyCode).toArray(String[]::new));
if (empUserWhere.getCodes().length == 0) {
return;
}
PageUtils.findList(empUserWhere, null, e -> {
List<EmpUser> empUserList = empUserService.findUserListByCompanyCodes((EmpUser)e);
empUserList.forEach(UserUtils::clearCache);
return !empUserList.isEmpty();
});
}
}

View File

@@ -115,6 +115,13 @@ public class EmpUserServiceSupport extends CrudService<EmpUserDao, EmpUser>
public List<EmpUser> findUserListByOfficeCodes(EmpUser empUser){
return dao.findUserListByOfficeCodes(empUser);
}
/**
* 根据公司编码查询用户,仅返回基本信息
*/
@Override
public List<EmpUser> findUserListByCompanyCodes(EmpUser empUser){
return dao.findUserListByCompanyCodes(empUser);
}
/**
* 根据角色编码查询用户,仅返回基本信息

View File

@@ -5,15 +5,20 @@
package com.jeesite.modules.sys.service.support;
import com.jeesite.common.config.Global;
import com.jeesite.common.lang.StringUtils;
import com.jeesite.common.service.ServiceException;
import com.jeesite.common.service.TreeService;
import com.jeesite.common.utils.PageUtils;
import com.jeesite.common.utils.excel.ExcelImport;
import com.jeesite.common.validator.ValidatorUtils;
import com.jeesite.modules.sys.dao.OfficeDao;
import com.jeesite.modules.sys.entity.EmpUser;
import com.jeesite.modules.sys.entity.Office;
import com.jeesite.modules.sys.service.DataScopeService;
import com.jeesite.modules.sys.service.EmpUserService;
import com.jeesite.modules.sys.service.OfficeService;
import com.jeesite.modules.sys.utils.EmpUtils;
import com.jeesite.modules.sys.utils.UserUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
@@ -32,6 +37,8 @@ public class OfficeServiceSupport extends TreeService<OfficeDao, Office>
@Autowired
private DataScopeService dataScopeService;
@Autowired
private EmpUserService empUserService;
/**
* 获取单条数据
@@ -74,7 +81,7 @@ public class OfficeServiceSupport extends TreeService<OfficeDao, Office>
}
super.save(office);
// 清理部门相关缓存
clearOfficeCache();
clearOfficeCache(office);
}
/**
@@ -149,7 +156,7 @@ public class OfficeServiceSupport extends TreeService<OfficeDao, Office>
public void updateStatus(Office office) {
super.updateStatus(office);
// 清理部门相关缓存
clearOfficeCache();
clearOfficeCache(office);
}
/**
@@ -161,15 +168,37 @@ public class OfficeServiceSupport extends TreeService<OfficeDao, Office>
office.sqlMap().markIdDelete();
super.delete(office);
// 清理部门相关缓存
clearOfficeCache();
clearOfficeCache(office);
}
/**
* 清理部门相关缓存
*/
private void clearOfficeCache(){
// EmpUtils.removeCache(EmpUtils.CACHE_OFFICE_LIST);
private void clearOfficeCache(Office office){
EmpUtils.removeCache(EmpUtils.CACHE_OFFICE_ALL_LIST);
// 清理组织下的用户缓存,包含子机构
if (office == null || StringUtils.isBlank(office.getOfficeCode())){
return;
}
if (StringUtils.isBlank(office.getParentCode())){
office = get(office);
if (office == null){
return;
}
}
Office where = new Office();
where.setStatus(Office.STATUS_NORMAL);
where.setParentCodes(office.getParentCodes() + office.getOfficeCode() + ",%");
EmpUser empUserWhere = new EmpUser();
empUserWhere.setCodes(this.findByParentCodesLike(where).stream().map(Office::getOfficeCode).toArray(String[]::new));
if (empUserWhere.getCodes().length == 0) {
return;
}
PageUtils.findList(empUserWhere, null, e -> {
List<EmpUser> empUserList = empUserService.findUserListByOfficeCodes((EmpUser)e);
empUserList.forEach(UserUtils::clearCache);
return !empUserList.isEmpty();
});
}
}

View File

@@ -20,10 +20,7 @@ import com.jeesite.modules.sys.service.UserService;
import com.jeesite.modules.sys.utils.PwdUtils;
import com.jeesite.modules.sys.utils.UserUtils;
import com.jeesite.modules.sys.utils.ValidCodeUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.*;
import org.apache.shiro.authc.AuthenticationException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
@@ -69,9 +66,10 @@ public class AccountController extends BaseController{
@ApiImplicitParams({
@ApiImplicitParam(name = "mobile", value = "登录手机号", required = true, paramType="query", type="String"),
@ApiImplicitParam(name = "validCode", value = "图片验证码,防止重复机器人", required = true),
@ApiImplicitParam(name = "corpCode", value = "所属租户"),
})
public String getLoginValidCode(String mobile, String validCode, HttpServletRequest request) {
return getValidCode("login", mobile, validCode, "mobile", request, "登录验证码");
public String getLoginValidCode(String mobile, String validCode, String corpCode, HttpServletRequest request) {
return getValidCode("login", mobile, validCode, "mobile", corpCode, request, "登录验证码");
}
/**
@@ -139,9 +137,10 @@ public class AccountController extends BaseController{
@ApiImplicitParam(name = "loginCode", value = "登录账号", required = true, paramType="query", type="String"),
@ApiImplicitParam(name = "validCode", value = "图片验证码,防止重复机器人", required = true),
@ApiImplicitParam(name = "validType", value = "验证方式mobile、email", required = true),
@ApiImplicitParam(name = "corpCode", value = "所属租户"),
})
public String getFpValidCode(User user, String validCode, String validType, HttpServletRequest request) {
return getValidCode("fp", user.getLoginCode(), validCode, validType, request, "找回密码");
public String getFpValidCode(User user, String validCode, String validType, String corpCode, HttpServletRequest request) {
return getValidCode("fp", user.getLoginCode(), validCode, validType, corpCode, request, "找回密码");
}
/**
@@ -180,7 +179,7 @@ public class AccountController extends BaseController{
* 获取验证码
* @author ThinkGem
*/
private String getValidCode(String type, String loginCode, String validCode, String validType, HttpServletRequest request, String msgTitle) {
private String getValidCode(String type, String loginCode, String validCode, String validType, String corpCode, HttpServletRequest request, String msgTitle) {
// 校验图片验证码,防止重复机器人。
if (!ValidCodeUtils.validate(request, validCode)){
return renderResult(Global.FALSE, text("图片验证码不正确或已失效,请点击图片刷新!"));
@@ -193,6 +192,7 @@ public class AccountController extends BaseController{
if ("login".equals(type)){
User where = new User();
where.setMobile(loginCode);
where.setCorpCode_(corpCode);
where.setStatus(User.STATUS_NORMAL);
List<User> userList = userService.findListByMobile(where);
if (!userList.isEmpty()){
@@ -212,7 +212,7 @@ public class AccountController extends BaseController{
return renderResult(Global.FALSE, text("手机号不正确!"));
}
} else {
u = UserUtils.getByLoginCode(loginCode);
u = UserUtils.getByLoginCode(loginCode, corpCode);
if(u == null){
return renderResult(Global.FALSE, text("登录账号不正确!"));
}
@@ -287,14 +287,15 @@ public class AccountController extends BaseController{
@ApiImplicitParams({
@ApiImplicitParam(name = "loginCode", value = "登录账号", required = true, paramType="query", type="String"),
@ApiImplicitParam(name = "validCode", value = "图片验证码,防止重复机器人", required = true),
@ApiImplicitParam(name = "corpCode", value = "所属租户"),
})
public String getPwdQuestion(String loginCode, String validCode, HttpServletRequest request) {
public String getPwdQuestion(String loginCode, String validCode, String corpCode, HttpServletRequest request) {
// 校验图片验证码,防止重复机器人。
if (!ValidCodeUtils.validate(request, validCode)){
return renderResult(Global.FALSE, text("图片验证码不正确或已失效,请点击图片刷新!"));
}
// 账号是否存在验证
User u = UserUtils.getByLoginCode(loginCode);
User u = UserUtils.getByLoginCode(loginCode, corpCode);
if (u == null){
return renderResult(Global.FALSE, text("登录账号不正确!"));
}
@@ -340,7 +341,7 @@ public class AccountController extends BaseController{
public String savePwdByPwdQuestion(User user, HttpServletRequest request) {
String userCode = UserUtils.getCache("fpUserCode");
String loginCode = UserUtils.getCache("fpLoginCode");
// 一同验证保存的用户名和验证码是否正确(如果只校验验证码,不验证用户名,则会有获取验证码后修改用户名的漏洞)
if (!(userCode != null && loginCode != null && loginCode.equals(user.getLoginCode()))){
return renderResult(Global.FALSE, text("请重新获取保密问题!"));
@@ -355,7 +356,7 @@ public class AccountController extends BaseController{
}
// 验证三个密保问题是否正确。
User u = UserUtils.getByLoginCode(user.getLoginCode());
User u = UserUtils.get(userCode);
if (!(u != null && loginCode.equals(user.getLoginCode())
&& PwdUtils.validatePassword(user.getPwdQuestionAnswer(), u.getPwdQuestionAnswer())
&& PwdUtils.validatePassword(user.getPwdQuestionAnswer2(), u.getPwdQuestionAnswer2())

View File

@@ -11,8 +11,10 @@ import com.jeesite.common.idgen.IdGen;
import com.jeesite.common.lang.StringUtils;
import com.jeesite.common.web.BaseController;
import com.jeesite.modules.sys.entity.Company;
import com.jeesite.modules.sys.entity.EmpUser;
import com.jeesite.modules.sys.entity.Office;
import com.jeesite.modules.sys.service.CompanyService;
import com.jeesite.modules.sys.service.EmpUserService;
import com.jeesite.modules.sys.service.OfficeService;
import io.swagger.annotations.Api;
import org.apache.shiro.authz.annotation.RequiresPermissions;
@@ -43,9 +45,10 @@ public class CompanyController extends BaseController {
@Autowired
private CompanyService companyService;
@Autowired
private OfficeService officeService;
@Autowired
private EmpUserService empUserService;
/**
* 获取公司
@@ -208,6 +211,14 @@ public class CompanyController extends BaseController {
@RequestMapping(value = "delete")
@ResponseBody
public String delete(Company company) {
if (Global.getConfigToBoolean("sys.company.notAllowDeleteIfUserExists", "false")) {
EmpUser empUserWhere = new EmpUser();
empUserWhere.getEmployee().getCompany().setIsQueryChildren(true);
empUserWhere.getEmployee().getCompany().setCompanyCode(company.getCompanyCode());
if (empUserService.findCount(empUserWhere) > 0) {
return renderResult(Global.FALSE, text("不允许删除包含用户的公司"));
}
}
companyService.delete(company);
return renderResult(Global.TRUE, text("删除公司''{0}''成功", company.getCompanyName()));
}

View File

@@ -13,7 +13,9 @@ import com.jeesite.common.lang.StringUtils;
import com.jeesite.common.utils.excel.ExcelExport;
import com.jeesite.common.utils.excel.annotation.ExcelField.Type;
import com.jeesite.common.web.BaseController;
import com.jeesite.modules.sys.entity.EmpUser;
import com.jeesite.modules.sys.entity.Office;
import com.jeesite.modules.sys.service.EmpUserService;
import com.jeesite.modules.sys.service.OfficeService;
import com.jeesite.modules.sys.web.user.EmpUserController;
import io.swagger.annotations.Api;
@@ -46,7 +48,8 @@ public class OfficeController extends BaseController {
@Autowired
private OfficeService officeService;
@Autowired
private EmpUserService empUserService;
@Autowired
private EmpUserController empUserController;
@@ -260,6 +263,14 @@ public class OfficeController extends BaseController {
@RequestMapping(value = "delete")
@ResponseBody
public String delete(Office office) {
if (Global.getConfigToBoolean("sys.office.notAllowDeleteIfUserExists", "false")) {
EmpUser empUserWhere = new EmpUser();
empUserWhere.getEmployee().getOffice().setIsQueryChildren(true);
empUserWhere.getEmployee().getOffice().setOfficeCode(office.getOfficeCode());
if (empUserService.findCount(empUserWhere) > 0) {
return renderResult(Global.FALSE, text("不允许删除包含用户的机构"));
}
}
officeService.delete(office);
return renderResult(Global.TRUE, text("删除机构''{0}''成功", office.getOfficeName()));
}

View File

@@ -69,8 +69,15 @@ public class EmpUserController extends BaseController {
private RoleService roleService;
@ModelAttribute
public EmpUser get(String userCode, boolean isNewRecord) {
return empUserService.get(userCode, isNewRecord);
public EmpUser get(String userCode, boolean isNewRecord, Boolean isAll, String ctrlPermi) {
EmpUser empUser = new EmpUser();
empUser.setUserCode(userCode);
empUser.setIsNewRecord(isNewRecord);
// 更严格的权限控制对单条数据进行数据权限过滤isAll 是一个开关,正常不需要添加)
if (StringUtils.isNotBlank(userCode) && !(isAll != null && isAll) || Global.isStrictMode()) {
empUserService.addDataScopeFilter(empUser, ctrlPermi);
}
return empUserService.getAndValid(empUser);
}
@RequiresPermissions("sys:empUser:view")
@@ -107,6 +114,12 @@ public class EmpUserController extends BaseController {
empUserService.addDataScopeFilter(empUser, ctrlPermi);
}
empUser.setPage(new Page<>(request, response));
// // 定义字段权限属性名(可根据权限配置库查询出来)排除和包含同时存在时,排除优先级高于包含
// Set<String> attrNames = SetUtils.newHashSet("userCode", "employee.office.officeCode");
// // 查询 SQL 结果集中,不包含 userCode、employee.office.officeCode 值返回
// empUser.sqlMap().getColumn().setExcludeAttrNames(attrNames);
// // 查询 SQL 结果集中,仅包含 userCode、employee.office.officeCode 值返回
// empUser.sqlMap().getColumn().setIncludeAttrNames(attrNames);
Page<EmpUser> page = empUserService.findPage(empUser);
return page;
}

View File

@@ -4,18 +4,6 @@
*/
package com.jeesite.modules.sys.web.user;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.alibaba.fastjson.JSONValidator;
import com.jeesite.common.codec.DesUtils;
import com.jeesite.common.codec.EncodeUtils;
@@ -28,9 +16,20 @@ import com.jeesite.modules.sys.entity.User;
import com.jeesite.modules.sys.service.UserService;
import com.jeesite.modules.sys.utils.PwdUtils;
import com.jeesite.modules.sys.utils.UserUtils;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import springfox.documentation.annotations.ApiIgnore;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 用户Controller
* @author ThinkGem
@@ -78,12 +77,18 @@ public class UserController extends BaseController {
*/
@RequiresPermissions("user")
@RequestMapping(value = "info")
public String info(User user, String op, Model model) {
public String info(String op, Model model) {
if (StringUtils.isBlank(op)){
op = "base";
}
User u = UserUtils.getUser();
model.addAttribute("op", op);
model.addAttribute("user", UserUtils.getUser());
model.addAttribute("user", u);
if (StringUtils.equals(op, "pqa")){
model.addAttribute("pwdQuestion", u.getPwdQuestion());
model.addAttribute("pwdQuestion2", u.getPwdQuestion2());
model.addAttribute("pwdQuestion3", u.getPwdQuestion3());
}
return "modules/sys/user/userInfo";
}
@@ -93,7 +98,7 @@ public class UserController extends BaseController {
@RequiresPermissions("user")
@PostMapping(value = "infoSaveBase")
@ResponseBody
public String infoSaveBase(User user, HttpServletRequest request) {
public String infoSaveBase(User user) {
if (StringUtils.isBlank(user.getUserName())){
return renderResult(Global.FALSE, text("sys.user.userNameNotBlank"));
}
@@ -116,8 +121,7 @@ public class UserController extends BaseController {
@RequiresPermissions("user")
@PostMapping(value = "infoSavePwd")
@ResponseBody
public String infoSavePwd(User user, String oldPassword, String newPassword,
String confirmNewPassword) {
public String infoSavePwd(String oldPassword, String newPassword, String confirmNewPassword) {
User currentUser = UserUtils.getUser();
// 登录密码解密(解决密码明文传输安全问题)
String secretKey = Global.getProperty("shiro.loginSubmit.secretKey");

View File

@@ -0,0 +1,12 @@
## 重要提示Tip
## 请勿在该配置文件中添加其它任何配置(添加也不会生效)。
## 该文件,仅仅是为了让 jeesite-core.yml 文件,
## 在 IDEA 中有一个自动完成及帮助提示,并无其它用意。
## 参数配置请在 jeesite-core.yml 文件中添加。
spring:
config:
import:
- classpath:config/jeesite-core.yml

View File

@@ -626,6 +626,7 @@ j2cache:
# active -> 主动清除,二级缓存过期主动通知各节点清除,优点在于所有节点可以同时收到缓存清除,存储模式需要设置为 generic
# blend -> 两种模式一起运作,对于各个节点缓存准确以及及时性要求高的可以使用,正常用前两种模式中一个就可
cache_clean_mode: passive
# Web 相关
web:
@@ -802,10 +803,6 @@ video:
# 将mp4视频的元数据信息转到视频第一帧
qtFaststartFile: d:/tools/video/qt-faststart/qt-faststart.exe
# 文件管理是否启用租户模式
filemanager:
useCorpModel: false
#======================================#
#========== Message settings ==========#
#======================================#

View File

@@ -5,7 +5,6 @@
<logger name="org.springframework.boot.web.embedded" level="INFO" />
<logger name="org.apache.catalina.core.StandardEngine" level="INFO" />
<logger name="net.oschina.j2cache.caffeine.CaffeineProvider" level="ERROR" />
<logger name="ShardingSphere-SQL" level="DEBUG" />
<!-- <logger name="org.apache.ibatis" level="DEBUG" /> -->
<!-- <logger name="org.mybatis.spring" level="DEBUG" /> -->

View File

@@ -8,7 +8,7 @@
typeHandler="com.jeesite.common.mybatis.type.AesTypeHandler"/>
</resultMap> -->
<!-- 查询数据
<!-- 查询数据
<select id="findList" resultMap="empUserResult"> -->
<select id="findList" resultType="EmpUser">
SELECT ${sqlMap.column.toSql()}
@@ -54,50 +54,71 @@
<!-- 查询全部用户,仅返回基本信息 -->
<select id="findUserList" resultType="EmpUser">
SELECT
<include refid="userColumns"/>
<include refid="userColumns"/>
FROM ${_prefix}sys_user a
WHERE a.status = #{STATUS_NORMAL}
AND a.user_type = #{USER_TYPE_EMPLOYEE}
<if test="global.useCorpModel">
AND a.corp_code = #{corpCode}
</if>
AND a.corp_code = #{corpCode}
</if>
ORDER BY a.user_code
</select>
<!-- 根据部门编码查询用户,仅返回基本信息 -->
<select id="findUserListByOfficeCodes" resultType="EmpUser">
SELECT
<include refid="userColumns"/>
<include refid="userColumns"/>
FROM ${_prefix}sys_user a
JOIN ${_prefix}sys_employee e ON e.emp_code = a.ref_code
JOIN ${_prefix}sys_office o ON o.office_code = e.office_code
WHERE a.status = #{STATUS_NORMAL}
AND a.user_type = #{USER_TYPE_EMPLOYEE}
<if test="global.useCorpModel">
AND a.corp_code = #{corpCode}
</if>
AND e.status = #{STATUS_NORMAL}
AND o.status = #{STATUS_NORMAL}
AND a.corp_code = #{corpCode}
</if>
AND e.status = #{STATUS_NORMAL}
AND o.status = #{STATUS_NORMAL}
AND o.office_code IN
<foreach item="code" index="index" collection="codes" open="(" separator="," close=")">
#{code}
</foreach>
ORDER BY a.user_code
</select>
<!-- 根据公司编码查询用户,仅返回基本信息 -->
<select id="findUserListByCompanyCodes" resultType="EmpUser">
SELECT
<include refid="userColumns"/>
FROM ${_prefix}sys_user a
JOIN ${_prefix}sys_employee e ON e.emp_code = a.ref_code
JOIN ${_prefix}sys_company o ON o.company_code = e.company_code
WHERE a.status = #{STATUS_NORMAL}
AND a.user_type = #{USER_TYPE_EMPLOYEE}
<if test="global.useCorpModel">
AND a.corp_code = #{corpCode}
</if>
AND e.status = #{STATUS_NORMAL}
AND o.status = #{STATUS_NORMAL}
AND o.company_code IN
<foreach item="code" index="index" collection="codes" open="(" separator="," close=")">
#{code}
</foreach>
ORDER BY a.user_code
</select>
<!-- 根据角色编码查询用户,仅返回基本信息 -->
<select id="findUserListByRoleCodes" resultType="EmpUser">
SELECT
<include refid="userColumns"/>
<include refid="userColumns"/>
FROM ${_prefix}sys_user a
JOIN ${_prefix}sys_user_role ur2 ON ur2.user_code = a.user_code
JOIN ${_prefix}sys_role r ON r.role_code = ur2.role_code
WHERE a.status = #{STATUS_NORMAL}
AND a.user_type = #{USER_TYPE_EMPLOYEE}
<if test="global.useCorpModel">
AND a.corp_code = #{corpCode}
</if>
AND r.status = #{STATUS_NORMAL}
AND a.corp_code = #{corpCode}
</if>
AND r.status = #{STATUS_NORMAL}
AND r.role_code IN
<foreach item="code" index="index" collection="codes" open="(" separator="," close=")">
#{code}
@@ -108,7 +129,7 @@
<!-- 根据岗位编码查询用户,仅返回基本信息 -->
<select id="findUserListByPostCodes" resultType="EmpUser">
SELECT
<include refid="userColumns"/>
<include refid="userColumns"/>
FROM ${_prefix}sys_user a
JOIN ${_prefix}sys_employee e ON e.emp_code = a.ref_code
JOIN ${_prefix}sys_employee_post ep ON ep.emp_code = e.emp_code
@@ -116,10 +137,10 @@
WHERE a.status = #{STATUS_NORMAL}
AND a.user_type = #{USER_TYPE_EMPLOYEE}
<if test="global.useCorpModel">
AND a.corp_code = #{corpCode}
</if>
AND e.status = #{STATUS_NORMAL}
AND p.status = #{STATUS_NORMAL}
AND a.corp_code = #{corpCode}
</if>
AND e.status = #{STATUS_NORMAL}
AND p.status = #{STATUS_NORMAL}
AND p.post_code IN
<foreach item="code" index="index" collection="codes" open="(" separator="," close=")">
#{code}

View File

@@ -7,8 +7,8 @@ var message = @ObjectUtils.toString(@request.getAttribute('message'));
if (isBlank(message)){
var ex = @ExceptionUtils.getThrowable(request);
if (ex != null){
if(@StringUtils.startsWith(@ex.getMessage(), 'msg:')){
message = @StringUtils.replace(@ex.getMessage(), 'msg:', '');
if(@StringUtils.startsWith(ex.message, 'msg:')){
message = @StringUtils.replace(ex.message, 'msg:', '');
}else if (type.fullName(ex) == 'org.springframework.validation.BindException'
|| type.fullName(ex) == 'org.springframework.web.bind.MethodArgumentNotValidException'){
for (var e in ex.globalErrors){

View File

@@ -80,10 +80,8 @@ if (p.dataMap){
%>
<div id="${p.id}_wup" class="wup_container ${p.isMini?'mini':''}">
<% if(isNotBlank(p.bizType)){ %>
<input id="${p.id}" name="${p.name}" value="" autocomplete="off" class="wup_input ${p.uploadType} ${p.class}" data-msg-required="${p.dataMsgRequired}"/>
<input id="${p.id}__del" name="${p.nameDel}" value="" type="hidden"/>
<% } %>
<div class="area">
<% if(p.uploadType == 'image'){ %>
<div id="${p.id}Uploader" class="wup_img">

View File

@@ -18,6 +18,16 @@
<option value="question">使用保密问题找回您的密码</option>
</select>
</div>
<% if(@Global.isUseCorpModel()){ %>
<div class="form-group has-feedback">
<#form:treeselect id="fa_corp" title="${text('选择租户')}" allowClear="true"
name="corpCode" value="${@CorpUtils.getCurrentCorpCode()}" labelName="corpName"
labelValue="(${@CorpUtils.getCurrentCorpCode()}) ${@CorpUtils.getCurrentCorpName()}"
url="${ctx}/sys/corpAdmin/treeData?isShowCode=true"
class="required" data-msg-required="请选择所属租户."
placeholder="${text('所属租户')}"/>
</div>
<% } %>
<div class="form-group has-feedback">
<span class="fa fa-user form-control-feedback"></span>
<input type="text" id="fp_loginCode" name="loginCode" class="form-control required" data-msg-required="请填写登录账号." placeholder="登录账号" />

View File

@@ -20,7 +20,8 @@
<% if(@Global.isUseCorpModel()){ %>
<div class="form-group has-feedback">
<#form:treeselect id="reg_corp" title="${text('选择租户')}" allowClear="true"
name="corpCode" value="0" labelName="corpName" labelValue="JeeSite"
name="corpCode" value="${@CorpUtils.getCurrentCorpCode()}" labelName="corpName"
labelValue="(${@CorpUtils.getCurrentCorpCode()}) ${@CorpUtils.getCurrentCorpName()}"
url="${ctx}/sys/corpAdmin/treeData?isShowCode=true"
class="required" data-msg-required="请选择所属租户."
placeholder="${text('所属租户')}"/>

View File

@@ -34,6 +34,14 @@
<% }else if(isNotBlank(message!)){ %>
<h4 class="login-box-msg text-red">${message}</h4>
<% } %>
<% if(@Global.getConfigToBoolean('user.loginCodeCorpUnique', 'false')){ %>
<div class="form-group has-feedback">
<#form:treeselect id="switchCorpSelect" title="${text('登录租户')}" allowClear="false"
name="param_corpCode" value="${@CorpUtils.getCurrentCorpCode()}"
labelValue="(${@CorpUtils.getCurrentCorpCode()}) ${@CorpUtils.getCurrentCorpName()}"
url="${ctxAdmin}/sys/corpAdmin/treeData?isShowCode=true" placeholder="${text('登录租户')}"/>
</div>
<% } %>
<div class="form-group has-feedback tab-pane tab-1 tab-3 active">
<span class="icon-user form-control-feedback" title="${text('登录账号')}"></span>
<#form:input type="text" name="username" class="form-control required"
@@ -53,14 +61,6 @@
<#form:input type="password" name="password" class="form-control required"
data-msg-required="${text('请填写登录密码.')}" placeholder="${text('登录密码')}" autocomplete="off"/>
</div>
<% if(@Global.getConfigToBoolean('user.loginCodeCorpUnique', 'false')){ %>
<div class="form-group has-feedback">
<#form:treeselect id="switchCorpSelect" title="${text('登录租户')}" allowClear="false"
name="param_corpCode" value="${@CorpUtils.getCurrentCorpCode()}"
labelValue="(${@CorpUtils.getCurrentCorpCode()}) ${@CorpUtils.getCurrentCorpName()}"
url="${ctxAdmin}/sys/corpAdmin/treeData?isShowCode=true" placeholder="${text('登录租户')}"/>
</div>
<% } %>
<div class="form-group has-feedback" id="isValidCodeLogin" style="display:${isValidCodeLogin?'blank':'none'}">
<#form:validcode name="validCode" isRequired="true" isRemote="true" isLazy="${!isValidCodeLogin}"/>
</div>

View File

@@ -157,8 +157,8 @@
</div>
</div>
<div class="box-footer">
<div class="row">
<div class="col-sm-offset-3 col-sm-10">
<div class="row mr20 pr20">
<div class="text-center mr20 pr20">
<button type="submit" class="btn btn-sm btn-primary"><i class="fa fa-check"></i> ${text('保 存')}</button>&nbsp;
<button type="button" class="btn btn-sm btn-default" onclick="js.closeCurrentTabPage()"><i class="fa fa-reply-all"></i> ${text('关 闭')}</button>
</div>
@@ -177,8 +177,8 @@
<div class="row">
<div class="col-xs-12">
<div class="form-group">
<label class="control-label col-sm-3">${text('登录密码')}</label>
<div class="col-sm-8">
<label class="control-label col-sm-2">${text('登录密码')}</label>
<div class="col-sm-10">
<input id="validPassword" name="validPassword" type="password" autocomplete="new-password" value="" maxlength="50" minlength="3" class="form-control required"/>
</div>
</div>
@@ -187,39 +187,49 @@
<% }else{ %>
<div class="form-unit">${text('旧的密保问题及答案')}</div>
<div class="row">
<div class="col-xs-12">
<div class="col-xs-6">
<div class="form-group">
<label class="control-label col-sm-3">${text('旧密保问题')}1</label>
<label class="control-label col-sm-4">${text('旧密保问题')}1</label>
<div class="col-sm-8">
<input id="oldPwdQuestion" name="oldPwdQuestion" type="text" value="${user.pwdQuestion}" maxlength="50" minlength="3" readonly="readonly" class="form-control required"/>
</div>
</div>
</div>
<div class="col-xs-6">
<div class="form-group">
<label class="control-label col-sm-3">${text('旧密保问题答案')}1</label>
<label class="control-label col-sm-4">${text('旧密保问题答案')}1</label>
<div class="col-sm-8">
<input id="oldPwdQuestionAnswer" name="oldPwdQuestionAnswer" type="text" value="" maxlength="50" minlength="1" class="form-control required"/>
</div>
</div>
</div>
<div class="col-xs-6">
<div class="form-group">
<label class="control-label col-sm-3">${text('旧密保问题')}2</label>
<label class="control-label col-sm-4">${text('旧密保问题')}2</label>
<div class="col-sm-8">
<input id="oldPwdQuestion2" name="oldPwdQuestion2" type="text" value="${user.pwdQuestion2}" maxlength="50" minlength="3" readonly="readonly" class="form-control required"/>
</div>
</div>
</div>
<div class="col-xs-6">
<div class="form-group">
<label class="control-label col-sm-3">${text('旧密保问题答案')}2</label>
<label class="control-label col-sm-4">${text('旧密保问题答案')}2</label>
<div class="col-sm-8">
<input id="oldPwdQuestionAnswer2" name="oldPwdQuestionAnswer2" type="text" value="" maxlength="50" minlength="1" class="form-control required"/>
</div>
</div>
</div>
<div class="col-xs-6">
<div class="form-group">
<label class="control-label col-sm-3">${text('旧密保问题')}3</label>
<label class="control-label col-sm-4">${text('旧密保问题')}3</label>
<div class="col-sm-8">
<input id="oldPwdQuestion3" name="oldPwdQuestion3" type="text" value="${user.pwdQuestion3}" maxlength="50" minlength="3" readonly="readonly" class="form-control required"/>
</div>
</div>
</div>
<div class="col-xs-6">
<div class="form-group">
<label class="control-label col-sm-3">${text('旧密保问题答案')}3</label>
<label class="control-label col-sm-4">${text('旧密保问题答案')}3</label>
<div class="col-sm-8">
<input id="oldPwdQuestionAnswer3" name="oldPwdQuestionAnswer3" type="text" value="" maxlength="50" minlength="1" class="form-control required"/>
</div>
@@ -229,39 +239,49 @@
<% } %>
<div class="form-unit">${text('新的密保问题及答案')}</div>
<div class="row">
<div class="col-xs-12">
<div class="col-xs-6">
<div class="form-group">
<label class="control-label col-sm-3">${text('新密保问题')}1</label>
<label class="control-label col-sm-4">${text('新密保问题')}1</label>
<div class="col-sm-8">
<input id="pwdQuestion" name="pwdQuestion" type="text" value="${user.pwdQuestion}" maxlength="50" minlength="3" class="form-control required"/>
</div>
</div>
</div>
<div class="col-xs-6">
<div class="form-group">
<label class="control-label col-sm-3">${text('新密保问题答案')}1</label>
<label class="control-label col-sm-4">${text('新密保问题答案')}1</label>
<div class="col-sm-8">
<input id="pwdQuestionAnswer" name="pwdQuestionAnswer" type="text" value="" maxlength="50" minlength="1" class="form-control required"/>
</div>
</div>
</div>
<div class="col-xs-6">
<div class="form-group">
<label class="control-label col-sm-3">${text('新密保问题')}2</label>
<label class="control-label col-sm-4">${text('新密保问题')}2</label>
<div class="col-sm-8">
<input id="pwdQuestion2" name="pwdQuestion2" type="text" value="${user.pwdQuestion2}" maxlength="50" minlength="3" class="form-control required"/>
</div>
</div>
</div>
<div class="col-xs-6">
<div class="form-group">
<label class="control-label col-sm-3">${text('新密保问题答案')}2</label>
<label class="control-label col-sm-4">${text('新密保问题答案')}2</label>
<div class="col-sm-8">
<input id="pwdQuestionAnswer2" name="pwdQuestionAnswer2" type="text" value="" maxlength="50" minlength="1" class="form-control required"/>
</div>
</div>
</div>
<div class="col-xs-6">
<div class="form-group">
<label class="control-label col-sm-3">${text('新密保问题')}3</label>
<label class="control-label col-sm-4">${text('新密保问题')}3</label>
<div class="col-sm-8">
<input id="pwdQuestion3" name="pwdQuestion3" type="text" value="${user.pwdQuestion3}" maxlength="50" minlength="3" class="form-control required"/>
</div>
</div>
</div>
<div class="col-xs-6">
<div class="form-group">
<label class="control-label col-sm-3">${text('新密保问题答案')}3</label>
<label class="control-label col-sm-4">${text('新密保问题答案')}3</label>
<div class="col-sm-8">
<input id="pwdQuestionAnswer3" name="pwdQuestionAnswer3" type="text" value="" maxlength="50" minlength="1" class="form-control required"/>
</div>
@@ -270,8 +290,8 @@
</div>
</div>
<div class="box-footer">
<div class="row">
<div class="col-sm-offset-3 col-sm-10">
<div class="row mr20 pr20">
<div class="text-center mr20 pr20">
<button type="submit" class="btn btn-sm btn-primary"><i class="fa fa-check"></i> ${text('保 存')}</button>&nbsp;
<button type="button" class="btn btn-sm btn-default" onclick="js.closeCurrentTabPage()"><i class="fa fa-reply-all"></i> ${text('关 闭')}</button>
</div>

View File

@@ -4,7 +4,7 @@ productName: JeeSite Demo
companyName: ThinkGem
# 产品版本、版权年份
productVersion: V5.10
productVersion: V5.11
copyrightYear: 2025
# 数据库连接

View File

@@ -5,7 +5,7 @@
<groupId>com.jeesite</groupId>
<artifactId>jeesite-modules</artifactId>
<version>5.10.1-SNAPSHOT</version>
<version>5.11.0-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.10.1-SNAPSHOT</version>
<version>5.11.0-SNAPSHOT</version>
<relativePath>../../parent/pom.xml</relativePath>
</parent>

View File

@@ -46,7 +46,8 @@ $(function(){
js.ajaxSubmit(ctxPath + '/account/getFpValidCode', {
validType: $('#fp_validType').val(),
loginCode : $('#fp_loginCode').val(),
validCode : $('#fp_validCode').val()
validCode : $('#fp_validCode').val(),
corpCode : $('#fp_corpCode').val()
}, function(data){
js.showMessage(data.message);
if (data.result == 'true'){
@@ -61,7 +62,8 @@ $(function(){
$('#fp_getQuestion').click(function() {
js.ajaxSubmit(ctxPath + '/account/getPwdQuestion', {
loginCode : $('#fp_loginCode').val(),
validCode : $('#fp_validCode').val()
validCode : $('#fp_validCode').val(),
corpCode : $('#fp_corpCode').val()
}, function(data){
js.showMessage(data.message);
if (data.result == 'true'){

View File

@@ -66,7 +66,8 @@ $(function(){
var $this = this;
js.ajaxSubmit(ctxPath + '/account/getLoginValidCode', {
mobile : $('#mobile').val(),
validCode : $('#validCode').val()
validCode : $('#validCode').val(),
corpCode : $('#switchCorpSelectCode').val()
}, function(data){
js.showMessage(data.message);
if (data.result == 'true'){

View File

@@ -34,7 +34,7 @@
// 工具栏上的所有的功能按钮和下拉框可以在new编辑器的实例时选择自己需要的从新定义
, toolbars: [[
'fullscreen', /*'source', '|', */'undo', 'redo', '|',
'fullscreen', 'undo', 'redo', '|',
'bold', 'italic', 'underline', 'fontborder', 'strikethrough', 'superscript', 'subscript', 'removeformat', 'formatmatch', 'autotypeset', 'blockquote', 'pasteplain', '|',
'forecolor', 'backcolor', 'insertorderedlist', 'insertunorderedlist', 'selectall', /*'cleardoc', */'|',
'rowspacingtop', 'rowspacingbottom', 'lineheight', '|',
@@ -45,7 +45,7 @@
/*'simpleupload', */'insertimage', 'emotion', 'scrawl', 'insertvideo', /*'music', */'attachment', 'map',/* 'gmap', 'insertframe', 'insertcode', 'webapp', 'pagebreak', */'template', 'background', '|',
'horizontal', 'date', 'time', 'spechars', /*'snapscreen', */'wordimage', '|',
'inserttable', 'deletetable', 'insertparagraphbeforetable', 'insertrow', 'deleterow', 'insertcol', 'deletecol', 'mergecells', 'mergeright', 'mergedown', 'splittocells', 'splittorows', 'splittocols', /*'charts', */'|',
'print', 'preview', 'searchreplace', 'drafts', 'help'
'print', 'preview', 'searchreplace', 'drafts', 'source', 'help',
]]
// 简单的工具栏

View File

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

View File

@@ -12,7 +12,7 @@
<groupId>com.jeesite</groupId>
<artifactId>jeesite-parent</artifactId>
<version>5.10.1-SNAPSHOT</version>
<version>5.11.0-SNAPSHOT</version>
<packaging>pom</packaging>
<name>JeeSite Parent</name>
@@ -57,7 +57,6 @@
<druid.version>1.2.23</druid.version>
<shiro.version>1.13.0</shiro.version>
<quartz.version>2.4.0-rc3</quartz.version>
<j2cache.version>2.8.0-release</j2cache.version>
<swagger.version>1.6.6</swagger.version>
<liquibase.version>4.20.0</liquibase.version>
<spring-framework.version>5.3.39</spring-framework.version>

View File

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

View File

@@ -5,7 +5,7 @@
<groupId>com.jeesite</groupId>
<artifactId>jeesite-root</artifactId>
<version>5.10.1-SNAPSHOT</version>
<version>5.11.0-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.10.1-SNAPSHOT</version>
<version>5.11.0-SNAPSHOT</version>
<relativePath>../parent/pom.xml</relativePath>
</parent>

View File

@@ -8,7 +8,7 @@ productName: JeeSite Demo
companyName: ThinkGem
# 产品版本、版权年份
productVersion: V5.10
productVersion: V5.11
copyrightYear: 2025
# 是否演示模式

View File

@@ -6,7 +6,7 @@
<parent>
<groupId>com.jeesite</groupId>
<artifactId>jeesite-parent</artifactId>
<version>5.10.1-SNAPSHOT</version>
<version>5.11.0-SNAPSHOT</version>
<relativePath>../parent/pom.xml</relativePath>
</parent>
@@ -97,7 +97,7 @@
<dependency>
<groupId>com.jeesite</groupId>
<artifactId>jeesite-vue-dist</artifactId>
<version>5.10.1-SNAPSHOT</version>
<version>5.11.0-SNAPSHOT</version>
</dependency>
</dependencies>

View File

@@ -8,7 +8,7 @@ productName: JeeSite Demo
companyName: ThinkGem
# 产品版本、版权年份
productVersion: V5.10
productVersion: V5.11
copyrightYear: 2025
# 是否演示模式

View File

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

View File

@@ -8,7 +8,7 @@ productName: JeeSite Demo
companyName: ThinkGem
# 产品版本、版权年份
productVersion: V5.10
productVersion: V5.11
copyrightYear: 2025
# 是否演示模式

View File

@@ -4,8 +4,8 @@
<include resource="org/springframework/boot/logging/logback/defaults.xml" />
<logger name="org.springframework.boot.web.embedded" level="INFO" />
<logger name="net.oschina.j2cache.caffeine.CaffeineProvider" level="ERROR" />
<logger name="org.apache.catalina.core.StandardEngine" level="INFO" />
<logger name="ShardingSphere-SQL" level="DEBUG" />
<!-- <logger name="org.apache.ibatis" level="DEBUG" /> -->
<!-- <logger name="org.mybatis.spring" level="DEBUG" /> -->
<!-- <logger name="org.springframework.jdbc" level="DEBUG" /> -->
@@ -17,19 +17,22 @@
<logger name="com.atomikos.recovery.xa.XaResourceRecoveryManager" level="ERROR" />
<logger name="org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator" level="DEBUG" />
<!-- <logger name="org.springframework.transaction.support.TransactionSynchronizationManager" level="TRACE" /> -->
<logger name="org.springframework.web.servlet.PageNotFound" level="ERROR" />
<logger name="org.springframework.context.support.PostProcessorRegistrationDelegate$BeanPostProcessorChecker" level="ERROR" />
<logger name="springfox.documentation.spring.web.readers.parameter.ParameterDataTypeReader" level="ERROR" />
<logger name="springfox.documentation.schema.property.CachingModelPropertiesProvider" level="ERROR" />
<!-- <logger name="io.swagger" level="DEBUG" /> -->
<!-- <logger name="springfox" level="DEBUG" /> -->
<logger name="org.flowable.ui.modeler.domain" level="DEBUG" />
<logger name="org.flowable.idm.engine.impl.persistence" level="DEBUG" />
<logger name="org.flowable.task.service.impl.persistence" level="DEBUG" />
<logger name="org.flowable.identitylink.service.impl.persistence" level="DEBUG" />
<logger name="org.flowable.variable.service.impl.persistence" level="DEBUG" />
<logger name="org.flowable.engine.impl.persistence" level="DEBUG" />
<logger name="com.bstek.ureport" level="DEBUG" />
<logger name="com.jeesite" level="DEBUG" />
<logger name="com.jeesite.common.i18n" level="INFO" />
<logger name="com.jeesite.common.shiro" level="INFO" />
@@ -38,6 +41,7 @@
<logger name="com.jeesite.common.j2cache" level="INFO" />
<logger name="com.jeesite.common.j2cache.cache.support.caffeine" level="ERROR" />
<logger name="com.jeesite.common.mybatis" level="INFO" />
<logger name="com.jeesite.common.mybatis.type" level="DEBUG" />
<logger name="com.jeesite.common.mybatis.mapper" level="DEBUG" />
<logger name="com.jeesite.common.reflect.ReflectUtils" level="INFO" />
<logger name="com.jeesite.common.io.FileUtils" level="INFO" />

View File

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

View File

@@ -8,7 +8,7 @@ productName: JeeSite Demo
companyName: ThinkGem
# 产品版本、版权年份
productVersion: V5.10
productVersion: V5.11
copyrightYear: 2025
# 是否演示模式