329 Commits
Author SHA1 Message Date
RuoYi c2deb14284 树表查询无数据时清除分页信息(I7OB0S) 2023-08-12 16:22:29 +08:00
RuoYi 2ebedeb5df 优化代码 2023-08-12 16:21:23 +08:00
RuoYi e4585f5dcb update maven-plugin 2023-08-12 16:20:33 +08:00
若依andGitee 62db29627a !465 前端定时任务菜单中Cron表达式生成器中-日-选项中的--每小时--应为-每日
Merge pull request !465 from wpengsen/master
2023-08-12 08:09:42 +00:00
RuoYi b15106d139 升级shiro到最新版本1.12.0 2023-07-28 20:27:07 +08:00
wpengsen d7a2e80bf6 前端定时任务菜单中Cron表达式生成器中-日-选项中的--每小时--应为-每日 2023-07-20 10:30:21 +08:00
RuoYi e405becf9a 表格重置默认返回到第一页 2023-07-14 11:04:27 +08:00
RuoYi e8d8325ead 排序属性orderBy参数限制长度 2023-07-06 21:52:18 +08:00
RuoYi c21eb3507b 优化代码 2023-07-06 21:51:35 +08:00
RuoYi c92059d356 update sql 2023-07-06 21:49:52 +08:00
RuoYi b36ba5a16c 升级oshi到最新版本6.4.3 2023-06-29 19:36:45 +08:00
RuoYi cc74bde7be optimized code 2023-06-29 19:36:24 +08:00
RuoYi 7358a2027d 升级spring-boot到最新版本2.5.15 2023-06-23 16:25:39 +08:00
RuoYi 21ea871ada update application.yml 2023-06-23 16:24:41 +08:00
RuoYi 1207052749 修复表格行内编辑启用翻页记住选择无效问题(I72OMA) 2023-05-19 10:26:15 +08:00
RuoYi 6f8a388e8e 升级x-editable到最新版本1.5.3 2023-05-19 10:25:55 +08:00
RuoYi 03201c36e8 若依 v4.7.7 2023-04-14 08:32:07 +08:00
RuoYi aa7ee1aae1 升级oshi到最新版本6.4.1 2023-04-12 15:06:04 +08:00
RuoYi 07f9316935 优化导入用户时更新丢失岗位角色的问题 2023-04-10 18:20:28 +08:00
RuoYi 5e34d68d51 优化代码 2023-04-10 18:20:22 +08:00
RuoYi 5a07a91b50 升级jasny-bootstrap到最新版4.0.0 2023-04-07 19:38:29 +08:00
RuoYi 17abf826e9 优化用户导入更新时需获取用户编号问题 2023-04-07 19:20:38 +08:00
若依andGitee eca27ed5a1 !448 优化用户导入
Merge pull request !448 from 周冰/master
2023-04-07 11:08:15 +00:00
RuoYi 466d8800fc 优化导出Excel时设置dictType属性重复查缓存问题 2023-04-06 15:23:06 +08:00
shui ada2cb426b 用户导入,更新时需获取用户id,用于更新数据 2023-04-03 13:35:32 +08:00
RuoYi f67600df28 支持自定义隐藏属性列过滤子对象 2023-03-17 14:54:24 +08:00
RuoYi 10bbb27684 修复用户注册唯一校验问题(I6MVZS) 2023-03-17 11:24:27 +08:00
若依andGitee a32da911d1 !442 用户多角色,数据权限切面处理时可能出现权限抬升的情况。
Merge pull request !442 from 0慕容雪0/master
2023-03-17 03:21:13 +00:00
0慕容雪0andGitee 6a861498ca update ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataScopeAspect.java.
Signed-off-by: 0慕容雪0 <ytu.mxh@163.com>
2023-03-11 04:28:09 +00:00
0慕容雪0andGitee 292ac30aa5 update ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/DataScopeAspect.java.
DataScopeAspect,数据权限切面处理类中,用户多角色情况下,若所有角色都不包含传递过来的权限字符,这个时候sqlString也会为空,会导致用户拥有全部数据权限,所以要限制一下, 可以根据conditions集合是否为空,来判断循环时所有角色是否都是在判断权限字符时continue了。
复现方法: 在使用@DataScope注解时permission定义了值,这个值所有角色不包含。


Signed-off-by: 0慕容雪0 <ytu.mxh@163.com>
2023-03-10 07:53:03 +00:00
RuoYi 1e91312f08 日志管理使用索引提升查询性能 2023-02-23 09:29:26 +08:00
RuoYi bee73e87a5 升级layui到最新版本2.7.6 2023-02-23 09:23:26 +08:00
RuoYi a1e2c6e1e6 修复isMatchedIp的参数判断产生空指针的问题 2023-02-22 10:30:49 +08:00
RuoYi 0bbe126125 移除apache/commons-fileupload依赖 2023-02-21 17:18:34 +08:00
RuoYi 590f6a302c 遗漏的优化代码 2023-02-21 16:19:33 +08:00
RuoYi 22470677d4 升级druid到最新版本1.2.16 2023-02-21 13:44:19 +08:00
RuoYi 7040cd26c6 优化代码 2023-02-21 13:43:52 +08:00
RuoYi ac1e66b4b6 日志注解支持排除指定的请求参数 2023-02-20 15:50:15 +08:00
RuoYi 658ed5791b update sql 2023-02-20 15:49:35 +08:00
RuoYi ef0a29552e 支持登录IP黑名单限制 2023-02-20 12:54:02 +08:00
RuoYi 99554659f0 修复异步表格树子项排序问题(I6G2YL) 2023-02-19 22:26:39 +08:00
RuoYi 995eb76c0f 修复冻结列不支持IE浏览器的问题(I6FD4W) 2023-02-19 20:54:55 +08:00
RuoYi dbb312b26e 修复主子表使用suggest插件无法新增问题(I6FA5Z) 2023-02-19 19:29:35 +08:00
RuoYi 9b476399f0 更新fontawesome图标示例 2023-02-19 14:54:08 +08:00
RuoYi e4f70b190c 优化前端属性提醒说明 2023-02-18 16:06:44 +08:00
RuoYi bb5f87658e 新增监控页面图标显示 2023-02-17 08:52:15 +08:00
RuoYi 00f2db99d8 操作日志新增消耗时间属性 2023-02-16 11:57:40 +08:00
RuoYi e26b65ca31 添加新群号:175104288 2023-02-11 12:16:15 +08:00
RuoYi cda00589a4 修复菜单栏快速点击导致展开折叠样式问题(I6CWMP) 2023-02-04 21:56:56 +08:00
RuoYi 3b75d93d6b 连接池Druid支持新的配置connectTimeout和socketTimeout(I6CLL8) 2023-02-04 20:11:34 +08:00
RuoYi 10fb654d23 修复异步加载表格树重置列表父节点展开异常问题(I6AGWH) 2023-02-04 17:32:31 +08:00
RuoYi 432d5ce1be 屏蔽定时任务bean违规的字符 2023-02-04 16:06:04 +08:00
RuoYi f2d5545092 update copyright 2023 2023-02-03 17:41:14 +08:00
若依andGitee 8939e21a29 !437 解决单体版本表格行拖拽操作后,列表底部的总共记录条数变成了undefined问题
Merge pull request !437 from chenxin04187/master
2023-02-03 08:43:46 +00:00
若依andGitee b872a84a4a !436 EhCacheManager改为从bean容器获取,不使用自动装配
Merge pull request !436 from oak/master
2023-02-03 08:31:19 +00:00
William Chen 311cb892a7 解决单体版本表格行拖拽操作后,列表底部的总共记录条数变成了undefined问题。
link https://gitee.com/y_project/RuoYi/issues/I68198
2023-01-23 22:19:34 +08:00
oak fab98274b1 EhCacheManager改为从bean容器获取,不使用自动装配。作用:自建SpringBoot模块如果引用了ruoyi-system并且没有使用shiro,启动会报错。 2023-01-23 16:38:33 +08:00
RuoYi 3e8b211789 升级jquery到最新版v3.6.3 2023-01-19 11:59:10 +08:00
RuoYi c92ed66436 修复页签属性refresh为undefined时页面被刷新问题 2023-01-12 17:31:30 +08:00
RuoYi f1233c85d7 主子表根据序号删除方法加入表格ID参数 2023-01-12 17:31:06 +08:00
RuoYi 9d02f8f7e7 若依 v4.7.6 2022-12-16 08:50:57 +08:00
RuoYi 70205922fc 优化代码 2022-12-13 15:45:13 +08:00
RuoYi f3d1f0afe2 修改参数键名时移除前缓存配置 2022-12-13 15:09:38 +08:00
RuoYi 7ee6ad8aec 升级pagehelper到最新版1.4.6 2022-12-13 14:23:20 +08:00
RuoYi 4ff9afac23 升级oshi到最新版本6.4.0 2022-12-13 14:21:58 +08:00
RuoYi 167970e5c4 优化SQL关键字检查防止注入 2022-12-13 13:17:17 +08:00
若依andGitee 29395be19a !432 优化deleteFile方法返回值,接受File.delete的false返回值
Merge pull request !432 from 岳林/master
2022-12-12 05:48:17 +00:00
fanchenweimin da01f093f8 优化deleteFile方法返回值,接受File.delete的false返回值 2022-12-12 09:41:38 +08:00
RuoYi f53515eb70 升级druid到最新版本1.2.15 2022-12-07 11:55:23 +08:00
RuoYi 84dde0dcf2 升级kaptcha到最新版2.3.3 2022-12-07 10:58:07 +08:00
RuoYi df1c283335 定时任务违规的字符 2022-12-03 11:32:41 +08:00
RuoYi faa4bfaef3 升级oshi到最新版本6.3.2 2022-12-01 11:49:25 +08:00
若依andGitee eef7ef6544 !426 升级shiro到最新版本1.10.1
Merge pull request !426 from Hacker/N/A
2022-11-25 11:05:20 +00:00
HackerandGitee 22d42048ab 升级shiro到最新版本1.10.1
Signed-off-by: Hacker <721806280@qq.com>
2022-11-24 07:31:40 +00:00
RuoYi e5b905c455 优化用户管理重置时取消部门选择(I621OJ) 2022-11-21 13:39:09 +08:00
RuoYi c64f027e66 兼容Excel下拉框内容过多无法显示的问题(I61HCG) 2022-11-21 11:13:02 +08:00
RuoYi 96934ca139 修复操作日志类型多选导出不生效问题(I617FW) 2022-11-15 13:30:43 +08:00
RuoYi f4c763c84d 升级druid到最新版本1.2.14 2022-11-14 11:47:57 +08:00
RuoYi 8cd0d9f366 忽略不必要的属性数据返回 2022-11-12 11:57:08 +08:00
RuoYi 6a7f727f70 优化导出对象的子列表为空会出现[]问题(I60904) 2022-11-11 10:35:32 +08:00
RuoYi 62381f0472 修复sheet超出最大行数异常问题 2022-11-07 11:27:12 +08:00
若依andGitee 2952337f15 !420 update ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/session/OnlineSessionFactory.java.
Merge pull request !420 from chenjh/N/A
2022-11-07 03:22:59 +00:00
chenjhandGitee c719be609a update ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/session/OnlineSessionFactory.java.
ServletUtils.getRequest()应改request,可能为空

Signed-off-by: chenjh <asgard2023@outlook.com>
2022-11-06 14:26:47 +00:00
RuoYi 6253e41658 升级oshi到最新版本6.3.0 2022-10-28 21:31:14 +08:00
RuoYi bd0e574268 优化select2搜索下拉后校验必填样式问题(I5VZY0) 2022-10-21 09:48:13 +08:00
RuoYi 6e176c807c 升级bootstrap-fileinput到最新版本5.5.2 2022-10-20 19:12:26 +08:00
RuoYi 2bdf12b1e1 升级shiro到最新版本1.10.0 2022-10-13 10:09:10 +08:00
RuoYi 67f2ba2aa9 修复导出包含空子列表数据异常的问题 2022-10-10 09:00:10 +08:00
RuoYi c105f44eb9 优化树形表格层级显示(I5TQ87) 2022-10-09 21:17:20 +08:00
RuoYi e23a6919af 优化topnav页缺少的样式右括号 2022-10-09 21:17:04 +08:00
RuoYi b362e58646 R isError and isSuccess static 2022-10-09 21:16:52 +08:00
RuoYi db3e571af0 优化代码生成同步后字典值NULL问题 2022-09-28 20:58:11 +08:00
RuoYi 52fe19e933 导入更新用户数据前校验数据权限 2022-09-28 20:58:02 +08:00
RuoYi 7b3ab45ecc 添加新群号:185760789 2022-09-28 10:56:36 +08:00
RuoYi e337f685bc 修改用户登录账号重复验证 2022-09-18 11:25:03 +08:00
RuoYi 13287e02eb 修复关闭父页签后提交无法跳转的问题(I5QBMO) 2022-09-12 10:34:00 +08:00
RuoYi d4a33eab94 优化代码 2022-09-09 10:09:56 +08:00
RuoYi 0ca327f538 若依 v4.7.5 2022-09-05 09:42:15 +08:00
RuoYi 31bd27fcf0 升级jquery到最新版3.6.1 2022-09-03 09:22:34 +08:00
RuoYi dcfc062c01 修复用户分配角色大于默认页数丢失问题(I5OJA8) 2022-09-02 10:19:32 +08:00
RuoYi daa8286804 AjaxResult错误消息结果类型的判断 2022-09-02 10:19:22 +08:00
RuoYi 5a3714e9bc 优化横向菜单下激活菜单样式 2022-08-27 11:54:15 +08:00
RuoYi abe1f0d63e 定时任务支持执行父类方法 2022-08-27 11:54:06 +08:00
RuoYi c95cb70af3 优化多角色数据权限匹配规则 2022-08-22 19:43:27 +08:00
RuoYi 47bd3c4c10 页签创建标题优先data-title属性(I4MC5L) 2022-08-22 19:41:08 +08:00
RuoYi 1c8f55c2c1 新增示例(进度条) 2022-08-20 18:52:26 +08:00
RuoYi 0f9558a825 自动设置切换多个树表格实例配置 2022-08-14 18:34:10 +08:00
RuoYi 8a4d37e975 菜单配置刷新时Tab页签切换时刷新 2022-08-14 10:32:24 +08:00
RuoYi 7fbabe1a8e 升级oshi到最新版本6.2.2 2022-08-14 09:19:19 +08:00
RuoYi 53cd4867df 修复树表onLoadSuccess不生效的问题 2022-08-10 13:07:28 +08:00
RuoYi 7aa4872cb9 优化导出对象的子列表判断条件 2022-08-10 12:47:46 +08:00
RuoYi 8fcc548d34 优化excel/scale属性导出单元格数值类型 2022-08-09 08:01:47 +08:00
RuoYi d318b719fc Excel支持导出对象的子列表方法 2022-08-07 18:19:27 +08:00
RuoYi d6db5963d5 数据逻辑删除不进行唯一验证 2022-08-03 15:54:58 +08:00
RuoYi d5f4bba084 新增主子表提交校验示例 2022-08-02 12:09:11 +08:00
RuoYi 960dee7756 增加对AjaxResult消息结果类型的判断 2022-08-02 12:08:18 +08:00
RuoYi 08f775da4b 优化任务过期不执行调度 2022-07-29 20:07:29 +08:00
RuoYi 2a0fcdea21 升级layui到最新版本v2.7.5 2022-07-28 19:54:55 +08:00
RuoYi 3f0a34e20f 自定义数据权限不排除重复 2022-07-26 14:43:09 +08:00
RuoYi 289161b8c6 升级pagehelper到最新版1.4.3 2022-07-22 14:53:25 +08:00
RuoYi 47b51fe965 支持自定义隐藏Excel属性列 2022-07-21 13:51:09 +08:00
RuoYi 0c0efc9455 Excel注解支持backgroundColor属性设置背景颜色 2022-07-20 09:32:11 +08:00
RuoYi dd86447176 优化多个相同角色数据导致权限SQL重复问题 2022-07-19 15:36:01 +08:00
RuoYi 3427223da2 升级oshi到最新版本6.2.1 2022-07-14 16:16:28 +08:00
RuoYi 1959b02220 升级shiro到最新版本1.9.1 2022-06-29 19:52:38 +08:00
RuoYi acf8ea428f 修改错误命名属性 2022-06-24 23:09:44 +08:00
RuoYi 6e476e40af 新增内容编码/解码方便插件集成使用 2022-06-22 17:46:07 +08:00
若依andGitee 25d07b11cc !395 修复导入导出时,当某字段类型为字典类型或解析类型时,如果有分隔符时无法正确解析的问题
Merge pull request !395 from jinyangaction/master
2022-06-22 09:20:38 +00:00
jinyangcruise 36013e6139 修复导入导出时,当某字段类型为字典类型或解析类型时,如果有分隔符时无法正确解析的问题 2022-06-20 22:23:05 +08:00
RuoYi 87d3c9a93c 升级druid到最新版本1.2.11 2022-06-14 11:30:24 +08:00
RuoYi d1b3f4f397 优化druid开启wall过滤器出现的异常问题 2022-06-13 21:21:28 +08:00
RuoYi 5c5961f1b4 释放焦点,防止打开后按回车反复弹出(I5AA4V) 2022-06-08 19:52:07 +08:00
RuoYi e932a7ead1 若依 v4.7.4 2022-06-01 08:21:04 +08:00
RuoYi 20db92ecf5 修复代码生成拖拽多次出现的排序不正确问题 2022-05-31 09:46:51 +08:00
RuoYi e1c855b091 升级spring-boot到最新版本2.5.14 2022-05-26 11:05:19 +08:00
RuoYi 693498b877 添加新群号:213650505 2022-05-25 11:01:55 +08:00
RuoYi 0ef403d785 升级fastjson到最新版1.2.83 2022-05-24 09:20:26 +08:00
RuoYi d8b2a9a905 用户头像上传格式限制 2022-05-22 12:44:40 +08:00
RuoYi 6df2609d1a 修复客户端分页序号方法显示错误问题 2022-05-22 11:10:12 +08:00
RuoYi 608f05b21b 接口使用泛型使其看到响应属性字段 2022-05-20 10:54:16 +08:00
若依andGitee 8145485cff !385 update ruoyi-common/src/main/java/com/ruoyi/common/core/text/Convert.java.
Merge pull request !385 from np/N/A
2022-05-20 02:48:54 +00:00
若依andGitee 7506ac77cb !384 【轻量级PR】新增SpringUtils.getRequiredProperty,以静态方式获取配置文件中的值
Merge pull request !384 from 阿超/master
2022-05-20 02:48:48 +00:00
RuoYi 5142e2d668 升级oshi到最新版本6.1.6 2022-05-11 09:55:07 +08:00
RuoYi ef1cf982e3 优化excel创建表格样式 2022-05-09 16:57:05 +08:00
npandGitee 12d550d2b6 update ruoyi-common/src/main/java/com/ruoyi/common/core/text/Convert.java.
优化Switch case
2022-05-06 02:13:00 +00:00
VampireAchao 2304f95b13 新增SpringUtils.getRequiredProperty,以静态方式获取配置文件中的值 2022-05-04 22:38:03 +08:00
RuoYi a4be143104 升级spring-boot到最新版本2.5.13 2022-04-30 16:38:27 +08:00
RuoYi 0209ed0326 修改显示顺序orderNum类型为整型 2022-04-25 10:23:17 +08:00
RuoYi 55846c5658 Excel注解支持color字体颜色 2022-04-23 20:28:09 +08:00
RuoYi 799815c273 表格冻结列阴影效果显示 2022-04-23 20:27:57 +08:00
RuoYi baa689b098 树表格操作时保留ajaxParams初始参数 2022-04-22 10:04:01 +08:00
RuoYi e4bc44115a 设置分页参数默认值 2022-04-17 10:18:56 +08:00
RuoYi 53bb1da7a1 优化主子表单删方法 2022-04-17 10:18:19 +08:00
RuoYi 977ceb562e 新增获取不带后缀文件名称方法 2022-04-17 10:17:47 +08:00
RuoYi 0264da8d7c 主子表操作列新增单个删除 2022-04-16 21:42:30 +08:00
RuoYi 94e23ec0f8 检查定时任务bean所在包名是否为白名单配置 2022-04-16 21:42:09 +08:00
RuoYi 7610e138dc 字典类型必须以字母开头,且只能为(小写字母,数字,下滑线) 2022-04-16 21:41:24 +08:00
RuoYi b04c6833a3 升级shiro到最新版本1.9.0 2022-04-14 19:00:03 +08:00
RuoYi 035c326071 修复Excel注解prompt/combo同时使用不生效问题 2022-04-03 18:23:21 +08:00
RuoYi e7660d94c9 用户缓存信息添加部门ancestors祖级列表 2022-04-03 18:22:11 +08:00
RuoYi 5f996472e1 修复URL类型回退键被禁止问题 2022-04-03 18:19:44 +08:00
RuoYi 7cbdc0eb8e 优化菜单侧边栏滚动条尺寸及颜色 2022-04-03 18:19:02 +08:00
RuoYi 615aa58bea 升级spring-boot到最新版本2.5.12 防止RCE漏洞 2022-04-02 10:05:49 +08:00
RuoYi de7e2f1bfc 新增清理分页的线程变量方法 2022-03-31 11:52:39 +08:00
RuoYi 41bf76a49f 升级spring-boot到最新版本2.5.11 2022-03-30 10:47:27 +08:00
RuoYi 2a2744a1bf 升级fastjson到最新版1.2.80 2022-03-30 10:47:15 +08:00
RuoYi 757c0eebaf 优化IP地址获取到多个的问题 2022-03-27 11:31:48 +08:00
RuoYi f60cb25245 优化导出excel单元格验证,包含变更为开头.防止正常内容被替换 2022-03-27 11:08:58 +08:00
RuoYi 199eb3f191 添加新群号:139845794 2022-03-24 09:48:37 +08:00
清溪先生 c1de1113c4 修复初始化多表格处理回调函数时获取的表格配置不一致的问题。 2022-03-22 20:40:20 +08:00
RuoYi 19803715be 自定义ShiroFilterFactoryBean防止中文请求被拦截 2022-03-17 19:53:16 +08:00
RuoYi d60d0425bc 优化导出数据LocalDateTime类型无数据问题 2022-03-15 14:38:32 +08:00
RuoYi 28387c46e2 文件上传兼容Weblogic环境 2022-03-09 10:01:11 +08:00
RuoYi 6e06a6a9e8 修复导入Excel时字典字段类型为Long转义为空问题 2022-03-05 08:39:01 +08:00
RuoYi 9a60c27785 修复表格打印组件不识别多层对象属性值问题(I4V7YV) 2022-03-02 19:31:40 +08:00
RuoYi 4613984fb4 若依 v4.7.3 2022-03-01 09:03:50 +08:00
RuoYi 893b29cae8 升级spring-boot到最新版本2.5.10 2022-02-26 09:41:33 +08:00
RuoYi b99efad19c 优化Excel格式化不同类型的日期对象 2022-02-26 09:40:59 +08:00
RuoYi 034e7ec9f0 优化上传文件名称命名规则 2022-02-25 14:54:45 +08:00
RuoYi 72540d01ab 文件上传接口新增原/新文件名返回参数 2022-02-24 15:17:55 +08:00
若依andGitee 85677a3349 !373 代码生成预览隐藏临时的文本域.
Merge pull request !373 from Hacker/N/A
2022-02-23 12:51:37 +00:00
HackerandGitee b5301a3632 代码生成预览隐藏临时的文本域. 2022-02-23 10:11:57 +00:00
RuoYi c2743f949e 页面若未匹配到字典标签则返回原字典值 2022-02-23 16:57:07 +08:00
RuoYi a7350294e8 代码生成预览支持复制内容 2022-02-23 09:03:31 +08:00
RuoYi 6d531fb173 优化国际化配置多余的zh请求问题 2022-02-22 17:23:23 +08:00
RuoYi 18517b6dc5 定时任务默认保存到内存中更高效 2022-02-22 17:20:44 +08:00
RuoYi 27889b0a14 表格树支持分页/异步加载 2022-02-22 10:41:19 +08:00
RuoYi 6bd0dc8e05 升级bootstrap-table到最新版本1.19.1 2022-02-21 09:06:55 +08:00
RuoYi 248fe926c5 优化任务队列满时任务拒绝策略 2022-02-21 08:58:40 +08:00
RuoYi 8c6546f5d8 服务监控新增运行参数信息显示 2022-02-20 14:37:33 +08:00
RuoYi b04eac0566 升级pagehelper到最新版1.4.1 2022-02-20 12:16:18 +08:00
RuoYi 6984644313 升级spring-boot-mybatis到最新版2.2.2 2022-02-20 12:16:03 +08:00
RuoYi 174520d259 升级oshi到最新版本6.1.2 2022-02-19 20:59:24 +08:00
RuoYi e4a22fabc5 代码生成同步保留必填/类型选项 2022-02-13 20:57:16 +08:00
RuoYi d770e73e31 fix value 'baos' is always 'null' 2022-02-13 20:54:21 +08:00
RuoYi e73877f0a2 update gitignore 2022-02-12 21:23:16 +08:00
RuoYi 0086cc9f53 优化代码 2022-02-12 21:23:07 +08:00
RuoYi 2f4c975615 修复Xss注解字段值为空时的异常问题 2022-02-10 17:22:33 +08:00
清溪先生andGitee bbfe5889ea 增加StringUtils的导包
Merge pull request !368 from 清溪先生/master
2022-02-02 04:16:54 +00:00
清溪先生 8b2177673b 增加StringUtils的导包 2022-02-02 12:05:25 +08:00
清溪先生andGitee eb0602033d !367 修复了@xss注解字段值为null时的空指针异常问题
Merge pull request !367 from 清溪先生/master
2022-01-30 13:51:52 +00:00
Awen 210d75be8e 修复了@xss注解字段值为null时的空指针异常问题 2022-01-30 21:45:20 +08:00
RuoYi ed1e7e69a8 用户访问控制时校验数据权限,防止越权 2022-01-27 11:13:59 +08:00
RuoYi e9ebf86ac8 导出Excel时屏蔽公式,防止CSV注入风险 2022-01-27 11:09:50 +08:00
RuoYi 8faea4836d update ry.bat 2022-01-27 11:07:40 +08:00
RuoYi 30f821be49 升级spring-boot到最新版本2.5.9 2022-01-23 11:02:45 +08:00
若依andGitee 3361f420c4 !365 修改 ECharts 官网地址为最新
Merge pull request !365 from 网游之鱼/N/A
2022-01-23 03:02:03 +00:00
网游之鱼andGitee 07357a8b75 修改 ECharts 官网地址为最新 2022-01-22 05:50:33 +00:00
RuoYi c009c88a5b 添加新群号:298522656 2022-01-21 17:02:23 +08:00
RuoYi 40715336e3 优化加载字典缓存数据 2022-01-14 11:50:14 +08:00
RuoYi 16ec346493 优化代码生成字段更新未同步 2022-01-14 11:50:02 +08:00
RuoYi a11fb3ddf7 update copyright 2022 2022-01-14 09:56:45 +08:00
RuoYi 063ee7f773 定时任务屏蔽违规的字符 2022-01-14 09:56:19 +08:00
RuoYi 008a461968 分页数据新增分页参数合理化参数 2022-01-07 12:28:08 +08:00
RuoYi 36f428d928 优化新版Chrome浏览器回退出现的遮罩层 2022-01-07 11:26:35 +08:00
RuoYi 871c0a115d 修正文字错误 2022-01-07 11:26:24 +08:00
RuoYi 6c3f0c36ff 定时任务目标字符串验证包名白名单 2022-01-06 14:31:09 +08:00
RuoYi 26c76deb5f 定时任务目标字符串过滤参数 2022-01-05 14:46:10 +08:00
RuoYi 20e2b60370 update donate 2022-01-04 20:30:07 +08:00
若依andGitHub 503e9c3a8e Create FUNDING.yml 2022-01-04 19:48:30 +08:00
RuoYi cea74fec35 update README.md 2022-01-04 10:36:46 +08:00
RuoYi 9cca7839bc 表格父子视图添加点击事件打开示例 2022-01-02 11:05:51 +08:00
RuoYi 8bcbdc3160 升级log4j2到2.17.1,防止漏洞风险 2021-12-30 14:24:28 +08:00
RuoYi a9e38fa54d 升级spring-boot到最新版本2.5.8 2021-12-27 12:28:12 +08:00
RuoYi a5573315a1 修复EMAIL类型回退键被禁止问题 2021-12-24 10:14:25 +08:00
若依andGitee d7ed5a1f73 !358 解决IE11上传预览不显示的问题
Merge pull request !358 from 网游之鱼/master
2021-12-24 02:08:31 +00:00
RuoYi 4c9c67927b 若依 v4.7.2 2021-12-23 08:39:07 +08:00
hbwf 4a53b718b1 解决IE11上传预览不显示的问题 2021-12-22 11:52:46 +08:00
RuoYi 6f42d2e821 升级oshi到最新版本v5.8.6 2021-12-22 09:57:26 +08:00
RuoYi 07cc5dfa51 升级thymeleaf到最新版3.0.14 阻止远程代码执行漏洞 2021-12-22 09:27:15 +08:00
RuoYi 22881ccb59 工具类异常使用UtilException 2021-12-21 13:55:55 +08:00
RuoYi c44c280b21 升级fastjson到最新版1.2.79 2021-12-21 13:21:16 +08:00
RuoYi 452da5caeb 代码生成创建表检查关键字,防止注入风险 2021-12-21 13:21:03 +08:00
RuoYi c78758e32d 升级log4j2到安全版本,防止漏洞风险 2021-12-19 19:59:32 +08:00
RuoYi 4b7e9152c6 请求分页方法设置成通用方便灵活调用 2021-12-18 10:00:52 +08:00
RuoYi e8e149719a 代码生成创建按钮添加超级管理员权限 2021-12-18 10:00:43 +08:00
若依andGitee d2730a187e !356 前端添加单独的二代身份证校验
Merge pull request !356 from 网游之鱼/N/A
2021-12-18 01:38:24 +00:00
网游之鱼andGitee 068483ac6a 前端添加单独的二代身份证校验 2021-12-16 08:40:12 +00:00
RuoYi e597cdead4 优化日期类型错误提示与图标重叠问题 2021-12-16 10:21:33 +08:00
若依andGitee 25340da2e2 !355 update ruoyi-admin/src/main/resources/static/ruoyi/css/ry-ui.css.
Merge pull request !355 from 风晓/N/A
2021-12-16 02:18:43 +00:00
风晓andGitee 02375cbe7d update ruoyi-admin/src/main/resources/static/ruoyi/css/ry-ui.css.
日期类型后面会有一个日历的图标,3px的偏移量太小了,错误提示信息会与那个图标重叠。设置为40px可以避开那个日历小图标
2021-12-15 10:46:09 +00:00
RuoYi 5587d39d42 自定义xss校验注解实现 2021-12-15 10:44:40 +08:00
RuoYi ae8f069cbc 升级log4j2到安全版本,防止漏洞风险 2021-12-14 12:09:49 +08:00
RuoYi d6f7423d59 升级log4j2到安全版本,防止漏洞风险 2021-12-14 10:18:11 +08:00
RuoYi 2a3981268a 优化查询用户的角色组&岗位组代码 2021-12-10 21:28:36 +08:00
若依andGitee 40263f9549 !350 修复多参数逗号分隔的问题
Merge pull request !350 from 网游之鱼/N/A
2021-12-10 13:27:26 +00:00
RuoYi be8cb965e3 修复插件一起使用出现的已声明报错问题 2021-12-05 11:34:35 +08:00
RuoYi 8a92dc8257 tomcat update 2021-12-02 16:40:39 +08:00
Ricky 2cd634a8de 代码生成主子表优化 2021-11-29 09:23:07 +08:00
网游之鱼andGitee a23af96034 修复多参数逗号分隔的问题 2021-11-26 07:45:50 +00:00
coderyangandRuoYi 78abc63c06 升级velocity到最新版本2.3(语法升级) 2021-11-25 17:24:24 +08:00
RuoYi ba9b483472 进入修改页面方法添加权限标识 2021-11-24 13:55:22 +08:00
RuoYi a21b875402 优化修改/授权角色实时生效 2021-11-24 13:22:54 +08:00
RuoYi 366459e8f3 优化新增部门时验证用户所属部门 2021-11-24 11:45:11 +08:00
RuoYi 7414626137 升级velocity到最新版本2.3 2021-11-24 11:15:17 +08:00
RuoYi 9ff9eb30aa 添加新群号:264355400 2021-11-20 12:01:36 +08:00
RuoYi 4d6ff66187 添加新群号:298522656 2021-11-19 18:40:23 +08:00
RuoYi 0bc9bd2cfb 代码生成主子表模板删除方法缺少事务 2021-11-18 17:58:20 +08:00
RuoYi 7cd98d6dd0 任务参数忽略双引号中的逗号 2021-11-16 11:51:59 +08:00
RuoYi 6d3c988768 若依 v4.7.1 2021-11-10 09:12:31 +08:00
RuoYi 618b81bc93 增加sendGet无参请求方法 2021-11-09 16:52:38 +08:00
RuoYi 16248b6e12 添加新群号:264355400 2021-11-09 09:03:21 +08:00
RuoYi ceba6a91f0 表格实例切换event不能为空 2021-11-08 15:32:57 +08:00
若依andGitee d005057c98 !341 update ruoyi-admin/src/main/resources/static/ruoyi/js/common.js.
Merge pull request !341 from Hacker/N/A
2021-11-01 07:28:19 +00:00
若依andGitee e4738da6fa !340 update ruoyi-admin/src/main/resources/static/ruoyi/js/ry-ui.js.
Merge pull request !340 from Hacker/N/A
2021-11-01 07:22:39 +00:00
HackerandGitee ed8834075e update ruoyi-admin/src/main/resources/static/ruoyi/js/common.js.
input 数字输入框无法删除内容
2021-11-01 07:22:37 +00:00
HackerandGitee 13bba13d6a update ruoyi-admin/src/main/resources/static/ruoyi/js/ry-ui.js. 2021-11-01 07:21:20 +00:00
RuoYi e0b7910d5e 修复无法被反转义问题 2021-10-30 10:58:58 +08:00
RuoYi 086458b89d 多表格切换表单查询参数 2021-10-30 10:28:20 +08:00
RuoYi 775d77ee6d 任务屏蔽违规字符 2021-10-30 10:27:07 +08:00
RuoYi 7c1fa482ba 页签关闭右侧清除iframe元素 2021-10-28 15:45:37 +08:00
RuoYi 7be993eb8d 升级spring-boot到最新版本2.5.6 2021-10-27 15:10:28 +08:00
Ricky 5a9e87c60d 替换自定义验证注解 2021-10-26 16:44:18 +08:00
RuoYi 5f836d249c update ry.sh. 2021-10-22 14:49:41 +08:00
若依andGitee 1d0175fb87 !337 修正别字
Merge pull request !337 from 网游之鱼/N/A
2021-10-22 03:24:05 +00:00
网游之鱼andGitee 774cff9c52 修正别字 2021-10-16 06:49:37 +00:00
RuoYi 51251331cf 升级oshi到最新版本v5.8.2 2021-10-14 11:58:31 +08:00
若依andGitee 2b1c90d249 !335 修改阿里云 Maven 仓库地址为新版地址
Merge pull request !335 from 网游之鱼/N/A
2021-10-14 03:57:24 +00:00
coderyang 14ca1e5c40 注释掉前端传到后端的排序字段 2021-10-13 15:43:13 +08:00
RuoYi 0efa04946b 升级spring-boot-mybatis到最新版2.2.0 2021-10-12 09:57:23 +08:00
RuoYi 96286d5836 升级pagehelper到最新版1.4.0 2021-10-12 09:57:05 +08:00
RuoYi 07e933de5c 升级spring-boot到最新版本2.5.5 2021-10-12 09:56:25 +08:00
Ricky 2ec5eab7bb 调整表单向导文字描述 2021-10-12 09:01:44 +08:00
网游之鱼andGitee 601cc1060c 修改阿里云 Maven 仓库地址为新版地址 2021-10-11 01:10:58 +00:00
RuoYi a6bc8e342d Excel导入支持@Excels注解 2021-10-10 16:04:51 +08:00
RuoYi 30c603a733 升级druid到最新版1.2.8 2021-10-10 09:43:16 +08:00
RuoYi a10d09f293 修复select2回退键被禁止问题 2021-10-09 09:39:38 +08:00
RuoYi 5493e21bfd 导入模板添加默认参数 2021-10-09 09:39:26 +08:00
若依andGitee 59217e59d0 !334 增加 sendGet 无参判断
Merge pull request !334 from 网游之鱼/N/A
2021-10-09 01:29:52 +00:00
网游之鱼andGitee 03b977f5cb 增加 sendGet 无参判断 2021-10-08 03:41:22 +00:00
RuoYi b8a8583598 修复apple/webkit浏览器时间无法格式化 2021-10-03 20:04:38 +08:00
RuoYi 4f50365ac1 设置mybatis默认的执行器 2021-10-03 20:04:21 +08:00
Ricky ee9ff26594 修复新窗口打开页面关闭弹窗报错 2021-09-30 15:58:21 +08:00
Ricky af7339f3b0 优化导入Excel 2021-09-30 15:57:30 +08:00
Ricky 0224f58e52 修复拖拽行数据错位问题 2021-09-30 15:55:38 +08:00
RuoYi 05ee2d0bf4 修正swagger没有指定dataTypeClass导致启动出现warn日志 2021-09-29 18:58:30 +08:00
RuoYi 54d338807e 优化代码生成创建表结构功能 2021-09-29 18:57:52 +08:00
若依andGitee 4b6ed674b3 !333 update ruoyi-generator/src/main/resources/templates/tool/gen/edit.html.
Merge pull request !333 from 偶滴神啊/N/A
2021-09-29 10:56:19 +00:00
若依andGitee 32ec900f87 !332 启动脚本中参数[-jar]和参数值[AppName]对应写到一起
Merge pull request !332 from lixifun/启动脚本修改
2021-09-29 10:54:21 +00:00
若依andGitee 5b160a275b !331 代码生成的模块增加创建表功能。
Merge pull request !331 from 刘宗奇/master
2021-09-29 10:35:37 +00:00
偶滴神啊andGitee c6b6295b26 update ruoyi-generator/src/main/resources/templates/tool/gen/edit.html.
我本地碰到了  undefined 的时候 
var html = $.common.sprintf("<input class='form-control' type='text' name='columns[%s].dictType' value='%s' id='columns_dict_%s'>", index, value, row.columnId);
不生效
2021-09-29 03:41:26 +00:00
lixifun c11ac2e565 启动脚本中的 参数 [-jar] 和参数值 [AppName] 对应写到一起 2021-09-27 14:13:26 +08:00
liuzongqi 912366563b 代码生成功能,增加创建表的功能。 2021-09-26 16:04:44 +08:00
RuoYi 61007b2905 Excel注解支持导入导出标题信息 2021-09-26 09:00:36 +08:00
RuoYi db83718aa6 修复树表代码生成短字段无法识别问题 2021-09-25 09:57:40 +08:00
若依andGitee 4c46e41525 !329 🔥 Remove code. 移除无用代码
Merge pull request !329 from Hacker/N/A
2021-09-25 01:54:25 +00:00
RuoYi 69d31e301f 优化记录登录信息,防止不必要的修改 2021-09-24 14:47:25 +08:00
HackerandGitee 314f0e94da 🔥 Remove code. 移除无用代码
Remove code. 移除无用代码
2021-09-24 03:22:59 +00:00
RuoYi ff3d2134a5 新增是否开启页签功能 2021-09-24 09:22:43 +08:00
RuoYi 4a6194274a 升级fastjson到最新版1.2.78 2021-09-24 08:52:30 +08:00
RuoYi bf222b392b 升级thymeleaf-extras-shiro到最新版本v2.1.0 2021-09-23 15:34:58 +08:00
RuoYi 7aebe466d9 Excel注解支持自定义数据处理器 2021-09-22 09:02:39 +08:00
RuoYi 777b05ce6a 防重提交注解支持配置间隔时间/提示消息 2021-09-20 18:43:55 +08:00
RuoYi 9046b96941 reset dataSourceAspect 2021-09-20 18:41:13 +08:00
RuoYi eb6f4c7f92 优化aop语法,使用spring自动注入注解 2021-09-19 08:50:44 +08:00
RuoYi d3899a8d9e 防止Excel导入图片可能出现的异常 2021-09-19 08:50:31 +08:00
RuoYi 4315c0983d 修复富文本回退键被禁止&控制台报错问题 2021-09-18 20:09:01 +08:00
RuoYi 3ea3edc6ba update year 2021-09-18 09:51:04 +08:00
RuoYi dc18ca2274 修复后端主子表代码模板方法名生成错误问题 2021-09-18 09:50:18 +08:00
RuoYi 8fadbef031 日志注解新增是否保存响应参数 2021-09-16 08:58:19 +08:00
RuoYi 7187161621 禁止后退键(Backspace) 2021-09-14 17:07:38 +08:00
RuoYi 17afe54f6f 升级bootstrap-fileinput到最新版本v5.2.4 2021-09-10 15:38:29 +08:00
若依andGitee 8ed485c28f !328 update ruoyi-admin/src/main/resources/static/ruoyi/login.js.
Merge pull request !328 from 孙鹏/N/A
2021-09-10 07:31:32 +00:00
孙鹏andGitee b307655251 update ruoyi-admin/src/main/resources/static/ruoyi/login.js.
修改了在IntelliJ IDEA中 ‘空格’ 展示为 ‘NBSP’ 的问题。
2021-09-10 06:40:51 +00:00
RuoYi 38f7ecb671 实例演示中增加多层窗口获取值 2021-09-06 16:44:29 +08:00
RuoYi f51b4f40f1 弹出层openOptions增加动画属性 2021-09-06 16:44:05 +08:00
若依andGitee 1530644de5 !327 小写不起作用,大写后功能正常
Merge pull request !327 from yangyang/N/A
2021-09-06 08:19:35 +00:00
yangyangandGitee 79fee39b2a 小写不起作用,大写后功能正常 2021-09-06 03:39:26 +00:00
RuoYi c44c9187a9 代码生成导入表按创建时间排序 2021-09-03 09:54:57 +08:00
252 changed files with 8066 additions and 6995 deletions
+1
View File
@@ -0,0 +1 @@
custom: http://doc.ruoyi.vip/ruoyi/other/donate.html
+3
View File
@@ -25,6 +25,8 @@ target/
*.iml
*.ipr
### JRebel ###
rebel.xml
### NetBeans ###
nbproject/private/
build/*
@@ -37,6 +39,7 @@ nbdist/
# Others
*.log
*.xml.versionsBackup
*.swp
!*/build/*.java
!*/build/*.html
+12 -1
View File
@@ -1,3 +1,14 @@
<p align="center">
<img alt="logo" src="https://oscimg.oschina.net/oscnet/up-dd77653d7c9f197dd9d93684f3c8dcfbab6.png">
</p>
<h1 align="center" style="margin: 30px 0 30px; font-weight: bold;">RuoYi v4.7.7</h1>
<h4 align="center">基于SpringBoot开发的轻量级Java快速开发框架</h4>
<p align="center">
<a href="https://gitee.com/y_project/RuoYi/stargazers"><img src="https://gitee.com/y_project/RuoYi/badge/star.svg?theme=gvp"></a>
<a href="https://gitee.com/y_project/RuoYi"><img src="https://img.shields.io/badge/RuoYi-v4.7.7-brightgreen.svg"></a>
<a href="https://gitee.com/y_project/RuoYi/blob/master/LICENSE"><img src="https://img.shields.io/github/license/mashape/apistatus.svg"></a>
</p>
## 平台简介
一直想做一款后台管理系统,看了很多优秀的开源项目但是发现没有合适的。于是利用空闲休息时间开始自己写了一套后台系统。如此有了若依。她可以用于所有的Web应用程序,如网站管理后台,网站会员中心,CMS,CRM,OA。所有前端后台代码封装过后十分精简易上手,出错概率低。同时支持移动客户端访问。系统会陆续更新一些实用功能。
@@ -88,4 +99,4 @@
## 若依交流群
QQ群: [![加入QQ群](https://img.shields.io/badge/已满-1389287-blue.svg)](https://jq.qq.com/?_wv=1027&k=5HBAaYN) [![加入QQ群](https://img.shields.io/badge/已满-1679294-blue.svg)](https://jq.qq.com/?_wv=1027&k=5cHeRVW) [![加入QQ群](https://img.shields.io/badge/已满-1529866-blue.svg)](https://jq.qq.com/?_wv=1027&k=53R0L5Z) [![加入QQ群](https://img.shields.io/badge/已满-1772718-blue.svg)](https://jq.qq.com/?_wv=1027&k=5g75dCU) [![加入QQ群](https://img.shields.io/badge/已满-1366522-blue.svg)](https://jq.qq.com/?_wv=1027&k=58cPoHA) [![加入QQ群](https://img.shields.io/badge/已满-1382251-blue.svg)](https://jq.qq.com/?_wv=1027&k=5Ofd4Pb) [![加入QQ群](https://img.shields.io/badge/已满-1145125-blue.svg)](https://jq.qq.com/?_wv=1027&k=5yugASz) [![加入QQ群](https://img.shields.io/badge/已满-86752435-blue.svg)](https://jq.qq.com/?_wv=1027&k=5Rf3d2P) [![加入QQ群](https://img.shields.io/badge/已满-134072510-blue.svg)](https://jq.qq.com/?_wv=1027&k=5ZIjaeP) [![加入QQ群](https://img.shields.io/badge/已满-210336300-blue.svg)](https://jq.qq.com/?_wv=1027&k=5CJw1jY) [![加入QQ群](https://img.shields.io/badge/已满-339522636-blue.svg)](https://jq.qq.com/?_wv=1027&k=5omzbKc) [![加入QQ群](https://img.shields.io/badge/已满-130035985-blue.svg)](https://jq.qq.com/?_wv=1027&k=qPIKBb7s) [![加入QQ群](https://img.shields.io/badge/已满-143151071-blue.svg)](https://jq.qq.com/?_wv=1027&k=4NsjKbtU) [![加入QQ群](https://img.shields.io/badge/已满-158781320-blue.svg)](https://jq.qq.com/?_wv=1027&k=VD2pkz2G) [![加入QQ群](https://img.shields.io/badge/已满-201531282-blue.svg)](https://jq.qq.com/?_wv=1027&k=HlshFwkJ) [![加入QQ群](https://img.shields.io/badge/101526938-blue.svg)](https://jq.qq.com/?_wv=1027&k=0ARRrO9V)
QQ群: [![加入QQ群](https://img.shields.io/badge/已满-1389287-blue.svg)](https://jq.qq.com/?_wv=1027&k=5HBAaYN) [![加入QQ群](https://img.shields.io/badge/已满-1679294-blue.svg)](https://jq.qq.com/?_wv=1027&k=5cHeRVW) [![加入QQ群](https://img.shields.io/badge/已满-1529866-blue.svg)](https://jq.qq.com/?_wv=1027&k=53R0L5Z) [![加入QQ群](https://img.shields.io/badge/已满-1772718-blue.svg)](https://jq.qq.com/?_wv=1027&k=5g75dCU) [![加入QQ群](https://img.shields.io/badge/已满-1366522-blue.svg)](https://jq.qq.com/?_wv=1027&k=58cPoHA) [![加入QQ群](https://img.shields.io/badge/已满-1382251-blue.svg)](https://jq.qq.com/?_wv=1027&k=5Ofd4Pb) [![加入QQ群](https://img.shields.io/badge/已满-1145125-blue.svg)](https://jq.qq.com/?_wv=1027&k=5yugASz) [![加入QQ群](https://img.shields.io/badge/已满-86752435-blue.svg)](https://jq.qq.com/?_wv=1027&k=5Rf3d2P) [![加入QQ群](https://img.shields.io/badge/已满-134072510-blue.svg)](https://jq.qq.com/?_wv=1027&k=5ZIjaeP) [![加入QQ群](https://img.shields.io/badge/已满-210336300-blue.svg)](https://jq.qq.com/?_wv=1027&k=5CJw1jY) [![加入QQ群](https://img.shields.io/badge/已满-339522636-blue.svg)](https://jq.qq.com/?_wv=1027&k=5omzbKc) [![加入QQ群](https://img.shields.io/badge/已满-130035985-blue.svg)](https://jq.qq.com/?_wv=1027&k=qPIKBb7s) [![加入QQ群](https://img.shields.io/badge/已满-143151071-blue.svg)](https://jq.qq.com/?_wv=1027&k=4NsjKbtU) [![加入QQ群](https://img.shields.io/badge/已满-158781320-blue.svg)](https://jq.qq.com/?_wv=1027&k=VD2pkz2G) [![加入QQ群](https://img.shields.io/badge/已满-201531282-blue.svg)](https://jq.qq.com/?_wv=1027&k=HlshFwkJ) [![加入QQ群](https://img.shields.io/badge/已满-101526938-blue.svg)](https://jq.qq.com/?_wv=1027&k=0ARRrO9V) [![加入QQ群](https://img.shields.io/badge/已满-264355400-blue.svg)](https://jq.qq.com/?_wv=1027&k=up9k3ZXJ) [![加入QQ群](https://img.shields.io/badge/已满-298522656-blue.svg)](https://jq.qq.com/?_wv=1027&k=540WfdEr) [![加入QQ群](https://img.shields.io/badge/已满-139845794-blue.svg)](https://jq.qq.com/?_wv=1027&k=ss91fC4t) [![加入QQ群](https://img.shields.io/badge/已满-185760789-blue.svg)](https://jq.qq.com/?_wv=1027&k=Cqd66IKe) [![加入QQ群](https://img.shields.io/badge/175104288-blue.svg)](https://jq.qq.com/?_wv=1027&k=7FplYUnR)
+17 -52
View File
@@ -5,33 +5,30 @@
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi</artifactId>
<version>4.7.0</version>
<version>4.7.7</version>
<name>ruoyi</name>
<url>http://www.ruoyi.vip</url>
<description>若依管理系统</description>
<properties>
<ruoyi.version>4.7.0</ruoyi.version>
<ruoyi.version>4.7.7</ruoyi.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
<shiro.version>1.8.0</shiro.version>
<thymeleaf.extras.shiro.version>2.0.0</thymeleaf.extras.shiro.version>
<druid.version>1.2.6</druid.version>
<shiro.version>1.12.0</shiro.version>
<thymeleaf.extras.shiro.version>2.1.0</thymeleaf.extras.shiro.version>
<druid.version>1.2.16</druid.version>
<bitwalker.version>1.21</bitwalker.version>
<kaptcha.version>2.3.2</kaptcha.version>
<kaptcha.version>2.3.3</kaptcha.version>
<swagger.version>3.0.0</swagger.version>
<mybatis-spring-boot.version>2.1.4</mybatis-spring-boot.version>
<pagehelper.boot.version>1.3.1</pagehelper.boot.version>
<fastjson.version>1.2.76</fastjson.version>
<oshi.version>5.8.0</oshi.version>
<jna.version>5.8.0</jna.version>
<pagehelper.boot.version>1.4.6</pagehelper.boot.version>
<fastjson.version>1.2.83</fastjson.version>
<oshi.version>6.4.3</oshi.version>
<commons.io.version>2.11.0</commons.io.version>
<commons.fileupload.version>1.4</commons.fileupload.version>
<poi.version>4.1.2</poi.version>
<velocity.version>1.7</velocity.version>
<velocity.version>2.3</velocity.version>
</properties>
<!-- 依赖声明 -->
@@ -42,7 +39,7 @@
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.2.13.RELEASE</version>
<version>2.5.15</version>
<type>pom</type>
<scope>import</scope>
</dependency>
@@ -56,7 +53,7 @@
<!-- 验证码 -->
<dependency>
<groupId>com.github.penggle</groupId>
<groupId>pro.fessional</groupId>
<artifactId>kaptcha</artifactId>
<version>${kaptcha.version}</version>
</dependency>
@@ -81,7 +78,7 @@
<artifactId>shiro-ehcache</artifactId>
<version>${shiro.version}</version>
</dependency>
<!-- thymeleaf模板引擎和shiro框架的整合 -->
<dependency>
<groupId>com.github.theborakompanioni</groupId>
@@ -96,13 +93,6 @@
<version>${bitwalker.version}</version>
</dependency>
<!-- SpringBoot集成mybatis框架 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis-spring-boot.version}</version>
</dependency>
<!-- pagehelper 分页插件 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
@@ -117,18 +107,6 @@
<version>${oshi.version}</version>
</dependency>
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
<version>${jna.version}</version>
</dependency>
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna-platform</artifactId>
<version>${jna.version}</version>
</dependency>
<!-- Swagger3依赖 -->
<dependency>
<groupId>io.springfox</groupId>
@@ -149,13 +127,6 @@
<version>${commons.io.version}</version>
</dependency>
<!-- 文件上传工具类 -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>${commons.fileupload.version}</version>
</dependency>
<!-- excel工具 -->
<dependency>
<groupId>org.apache.poi</groupId>
@@ -166,14 +137,8 @@
<!-- velocity代码生成使用模板 -->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity</artifactId>
<artifactId>velocity-engine-core</artifactId>
<version>${velocity.version}</version>
<exclusions>
<exclusion>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 阿里JSON解析器 -->
@@ -182,7 +147,7 @@
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
<!-- 定时任务-->
<dependency>
<groupId>com.ruoyi</groupId>
@@ -255,7 +220,7 @@
<repository>
<id>public</id>
<name>aliyun nexus</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<url>https://maven.aliyun.com/repository/public</url>
<releases>
<enabled>true</enabled>
</releases>
@@ -266,7 +231,7 @@
<pluginRepository>
<id>public</id>
<name>aliyun nexus</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<url>https://maven.aliyun.com/repository/public</url>
<releases>
<enabled>true</enabled>
</releases>
+2 -2
View File
@@ -5,7 +5,7 @@
<parent>
<artifactId>ruoyi</artifactId>
<groupId>com.ruoyi</groupId>
<version>4.7.0</version>
<version>4.7.7</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<packaging>jar</packaging>
@@ -74,7 +74,7 @@
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.1.1.RELEASE</version>
<version>2.5.15</version>
<configuration>
<fork>true</fork> <!-- 如果没有该配置,devtools不会生效 -->
</configuration>
@@ -11,6 +11,7 @@ import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import com.ruoyi.common.config.RuoYiConfig;
@@ -27,6 +28,7 @@ import com.ruoyi.common.utils.file.FileUtils;
* @author ruoyi
*/
@Controller
@RequestMapping("/common")
public class CommonController
{
private static final Logger log = LoggerFactory.getLogger(CommonController.class);
@@ -42,7 +44,7 @@ public class CommonController
* @param fileName 文件名称
* @param delete 是否删除
*/
@GetMapping("common/download")
@GetMapping("/download")
public void fileDownload(String fileName, Boolean delete, HttpServletResponse response, HttpServletRequest request)
{
try
@@ -71,7 +73,7 @@ public class CommonController
/**
* 通用上传请求(单个)
*/
@PostMapping("/common/upload")
@PostMapping("/upload")
@ResponseBody
public AjaxResult uploadFile(MultipartFile file) throws Exception
{
@@ -83,8 +85,10 @@ public class CommonController
String fileName = FileUploadUtils.upload(filePath, file);
String url = serverConfig.getUrl() + fileName;
AjaxResult ajax = AjaxResult.success();
ajax.put("fileName", fileName);
ajax.put("url", url);
ajax.put("fileName", fileName);
ajax.put("newFileName", FileUtils.getName(fileName));
ajax.put("originalFilename", file.getOriginalFilename());
return ajax;
}
catch (Exception e)
@@ -96,7 +100,7 @@ public class CommonController
/**
* 通用上传请求(多个)
*/
@PostMapping("/common/uploads")
@PostMapping("/uploads")
@ResponseBody
public AjaxResult uploadFiles(List<MultipartFile> files) throws Exception
{
@@ -104,19 +108,25 @@ public class CommonController
{
// 上传文件路径
String filePath = RuoYiConfig.getUploadPath();
List<String> fileNames = new ArrayList<String>();
List<String> urls = new ArrayList<String>();
List<String> fileNames = new ArrayList<String>();
List<String> newFileNames = new ArrayList<String>();
List<String> originalFilenames = new ArrayList<String>();
for (MultipartFile file : files)
{
// 上传并返回新文件名称
String fileName = FileUploadUtils.upload(filePath, file);
String url = serverConfig.getUrl() + fileName;
fileNames.add(fileName);
urls.add(url);
fileNames.add(fileName);
newFileNames.add(FileUtils.getName(fileName));
originalFilenames.add(file.getOriginalFilename());
}
AjaxResult ajax = AjaxResult.success();
ajax.put("fileNames", StringUtils.join(fileNames, FILE_DELIMETER));
ajax.put("urls", StringUtils.join(urls, FILE_DELIMETER));
ajax.put("fileNames", StringUtils.join(fileNames, FILE_DELIMETER));
ajax.put("newFileNames", StringUtils.join(newFileNames, FILE_DELIMETER));
ajax.put("originalFilenames", StringUtils.join(originalFilenames, FILE_DELIMETER));
return ajax;
}
catch (Exception e)
@@ -128,7 +138,7 @@ public class CommonController
/**
* 本地资源通用下载
*/
@GetMapping("/common/download/resource")
@GetMapping("/download/resource")
public void resourceDownload(String resource, HttpServletRequest request, HttpServletResponse response)
throws Exception
{
@@ -77,4 +77,22 @@ public class DemoDialogController
{
return prefix + "/table/parent";
}
/**
* 多层窗口frame1
*/
@GetMapping("/frame1")
public String frame1()
{
return prefix + "/table/frame1";
}
/**
* 多层窗口frame2
*/
@GetMapping("/frame2")
public String frame2()
{
return prefix + "/table/frame2";
}
}
@@ -62,6 +62,15 @@ public class DemoFormController
return prefix + "/timeline";
}
/**
* 进度条
*/
@GetMapping("/progress_bars")
public String progress_bars()
{
return prefix + "/progress_bars";
}
/**
* 表单校验
*/
@@ -65,6 +65,57 @@ public class DemoTableController extends BaseController
users.add(new UserTableModel(26, "1000026", "测试26", "1", "15666666666", "ry@qq.com", 250.0, "1"));
}
private final static List<AreaModel> areas = new ArrayList<AreaModel>();
{
areas.add(new AreaModel(1, 0, "广东省", "440000", "GDS", "GuangDongSheng", 1));
areas.add(new AreaModel(2, 0, "湖南省", "430000", "HNS", "HuNanSheng", 1));
areas.add(new AreaModel(3, 0, "河南省", "410000", "HNS", "HeNanSheng", 0));
areas.add(new AreaModel(4, 0, "湖北省", "420000", "HBS", "HuBeiSheng", 0));
areas.add(new AreaModel(5, 0, "辽宁省", "210000", "LNS", "LiaoNingSheng", 0));
areas.add(new AreaModel(6, 0, "山东省", "370000", "SDS", "ShanDongSheng", 0));
areas.add(new AreaModel(7, 0, "陕西省", "610000", "SXS", "ShanXiSheng", 0));
areas.add(new AreaModel(8, 0, "贵州省", "520000", "GZS", "GuiZhouSheng", 0));
areas.add(new AreaModel(9, 0, "上海市", "310000", "SHS", "ShangHaiShi", 0));
areas.add(new AreaModel(10, 0, "重庆市", "500000", "CQS", "ChongQingShi", 0));
areas.add(new AreaModel(11, 0, "若依省", "666666", "YYS", "RuoYiSheng", 0));
areas.add(new AreaModel(12, 0, "安徽省", "340000", "AHS", "AnHuiSheng", 0));
areas.add(new AreaModel(13, 0, "福建省", "350000", "FJS", "FuJianSheng", 0));
areas.add(new AreaModel(14, 0, "海南省", "460000", "HNS", "HaiNanSheng", 0));
areas.add(new AreaModel(15, 0, "江苏省", "320000", "JSS", "JiangSuSheng", 0));
areas.add(new AreaModel(16, 0, "青海省", "630000", "QHS", "QingHaiSheng", 0));
areas.add(new AreaModel(17, 0, "广西壮族自治区", "450000", "GXZZZZQ", "GuangXiZhuangZuZiZhiQu", 0));
areas.add(new AreaModel(18, 0, "宁夏回族自治区", "640000", "NXHZZZQ", "NingXiaHuiZuZiZhiQu", 0));
areas.add(new AreaModel(19, 0, "内蒙古自治区", "150000", "NMGZZQ", "NeiMengGuZiZhiQu", 0));
areas.add(new AreaModel(20, 0, "新疆维吾尔自治区", "650000", "XJWWEZZQ", "XinJiangWeiWuErZiZhiQu", 0));
areas.add(new AreaModel(21, 0, "江西省", "360000", "JXS", "JiangXiSheng", 0));
areas.add(new AreaModel(22, 0, "浙江省", "330000", "ZJS", "ZheJiangSheng", 0));
areas.add(new AreaModel(23, 0, "河北省", "130000", "HBS", "HeBeiSheng", 0));
areas.add(new AreaModel(24, 0, "天津市", "120000", "TJS", "TianJinShi", 0));
areas.add(new AreaModel(25, 0, "山西省", "140000", "SXS", "ShanXiSheng", 0));
areas.add(new AreaModel(26, 0, "台湾省", "710000", "TWS", "TaiWanSheng", 0));
areas.add(new AreaModel(27, 0, "甘肃省", "620000", "GSS", "GanSuSheng", 0));
areas.add(new AreaModel(28, 0, "四川省", "510000", "SCS", "SiChuanSheng", 0));
areas.add(new AreaModel(29, 0, "云南省", "530000", "YNS", "YunNanSheng", 0));
areas.add(new AreaModel(30, 0, "北京市", "110000", "BJS", "BeiJingShi", 0));
areas.add(new AreaModel(31, 0, "香港特别行政区", "810000", "XGTBXZQ", "XiangGangTeBieXingZhengQu", 0));
areas.add(new AreaModel(32, 0, "澳门特别行政区", "820000", "AMTBXZQ", "AoMenTeBieXingZhengQu", 0));
areas.add(new AreaModel(100, 1, "深圳市", "440300", "SZS", "ShenZhenShi", 1));
areas.add(new AreaModel(101, 1, "广州市", "440100", "GZS", "GuangZhouShi", 0));
areas.add(new AreaModel(102, 1, "东莞市", "441900", "DGS", "DongGuanShi", 0));
areas.add(new AreaModel(103, 2, "长沙市", "410005", "CSS", "ChangShaShi", 1));
areas.add(new AreaModel(104, 2, "岳阳市", "414000", "YYS", "YueYangShi", 0));
areas.add(new AreaModel(1000, 100, "龙岗区", "518172", "LGQ", "LongGangQu", 0));
areas.add(new AreaModel(1001, 100, "南山区", "518051", "NSQ", "NanShanQu", 0));
areas.add(new AreaModel(1002, 100, "宝安区", "518101", "BAQ", "BaoAnQu", 0));
areas.add(new AreaModel(1003, 100, "福田区", "518081", "FTQ", "FuTianQu", 0));
areas.add(new AreaModel(1004, 103, "天心区", "410004", "TXQ", "TianXinQu", 0));
areas.add(new AreaModel(1005, 103, "开福区", "410008", "KFQ", "KaiFuQu", 0));
areas.add(new AreaModel(1006, 103, "芙蓉区", "410011", "FRQ", "FuRongQu", 0));
areas.add(new AreaModel(1007, 103, "雨花区", "410011", "YHQ", "YuHuaQu", 0));
}
private final static List<UserTableColumn> columns = new ArrayList<UserTableColumn>();
{
columns.add(new UserTableColumn("用户ID", "userId"));
@@ -348,6 +399,15 @@ public class DemoTableController extends BaseController
return prefix + "/customView";
}
/**
* 异步加载表格树
*/
@GetMapping("/asynTree")
public String asynTree()
{
return prefix + "/asynTree";
}
/**
* 表格其他操作
*/
@@ -412,6 +472,84 @@ public class DemoTableController extends BaseController
rspData.setTotal(userList.size());
return rspData;
}
/**
* 查询树表数据
*/
@PostMapping("/tree/list")
@ResponseBody
public TableDataInfo treeList(AreaModel areaModel)
{
TableDataInfo rspData = new TableDataInfo();
List<AreaModel> areaList = new ArrayList<AreaModel>(Arrays.asList(new AreaModel[areas.size()]));
// 默认查询条件 parentId 0
Collections.copy(areaList, areas);
areaList.clear();
if (StringUtils.isNotEmpty(areaModel.getAreaName()))
{
for (AreaModel area : areas)
{
if (area.getParentId() == 0 && area.getAreaName().equals(areaModel.getAreaName()))
{
areaList.add(area);
}
}
}
else
{
for (AreaModel area : areas)
{
if (area.getParentId() == 0)
{
areaList.add(area);
}
}
}
PageDomain pageDomain = TableSupport.buildPageRequest();
Integer pageNum = (pageDomain.getPageNum() - 1) * pageDomain.getPageSize();
Integer pageSize = pageDomain.getPageNum() * pageDomain.getPageSize();
if (pageSize > areaList.size())
{
pageSize = areaList.size();
}
rspData.setRows(areaList.subList(pageNum, pageSize));
rspData.setTotal(areaList.size());
return rspData;
}
/**
* 查询树表子节点数据
*/
@PostMapping("/tree/listChild")
@ResponseBody
public List<AreaModel> listChild(AreaModel areaModel)
{
List<AreaModel> areaList = new ArrayList<AreaModel>(Arrays.asList(new AreaModel[areas.size()]));
// 查询条件 parentId
Collections.copy(areaList, areas);
areaList.clear();
if (StringUtils.isNotEmpty(areaModel.getAreaName()))
{
for (AreaModel area : areas)
{
if (area.getParentId().intValue() == areaModel.getParentId().intValue() && area.getAreaName().equals(areaModel.getAreaName()))
{
areaList.add(area);
}
}
}
else
{
for (AreaModel area : areas)
{
if (area.getParentId().intValue() == areaModel.getParentId().intValue())
{
areaList.add(area);
}
}
}
return areaList;
}
}
class UserTableColumn
@@ -597,3 +735,112 @@ class UserTableModel
this.createTime = createTime;
}
}
class AreaModel
{
/** 编号 */
private Long id;
/** 父编号 */
private Long parentId;
/** 区域名称 */
private String areaName;
/** 区域代码 */
private String areaCode;
/** 名称首字母 */
private String simplePy;
/** 名称全拼 */
private String pinYin;
/** 是否有子节点(0无 1有) */
private Integer isTreeLeaf = 1;
public AreaModel()
{
}
public AreaModel(int id, int parentId, String areaName, String areaCode, String simplePy, String pinYin, Integer isTreeLeaf)
{
this.id = Long.valueOf(id);
this.parentId = Long.valueOf(parentId);
this.areaName = areaName;
this.areaCode = areaCode;
this.simplePy = simplePy;
this.pinYin = pinYin;
this.isTreeLeaf = isTreeLeaf;
}
public Long getId()
{
return id;
}
public void setId(Long id)
{
this.id = id;
}
public Long getParentId()
{
return parentId;
}
public void setParentId(Long parentId)
{
this.parentId = parentId;
}
public String getAreaName()
{
return areaName;
}
public void setAreaName(String areaName)
{
this.areaName = areaName;
}
public String getAreaCode()
{
return areaCode;
}
public void setAreaCode(String areaCode)
{
this.areaCode = areaCode;
}
public String getSimplePy()
{
return simplePy;
}
public void setSimplePy(String simplePy)
{
this.simplePy = simplePy;
}
public String getPinYin()
{
return pinYin;
}
public void setPinYin(String pinYin)
{
this.pinYin = pinYin;
}
public Integer getIsTreeLeaf()
{
return isTreeLeaf;
}
public void setIsTreeLeaf(Integer isTreeLeaf)
{
this.isTreeLeaf = isTreeLeaf;
}
}
@@ -1,5 +1,6 @@
package com.ruoyi.web.controller.monitor;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
@@ -25,6 +26,7 @@ public class CacheController extends BaseController
@Autowired
private CacheService cacheService;
@RequiresPermissions("monitor:cache:view")
@GetMapping()
public String cache(ModelMap mmap)
{
@@ -32,6 +34,7 @@ public class CacheController extends BaseController
return prefix + "/cache";
}
@RequiresPermissions("monitor:cache:view")
@PostMapping("/getNames")
public String getCacheNames(String fragment, ModelMap mmap)
{
@@ -39,14 +42,16 @@ public class CacheController extends BaseController
return prefix + "/cache::" + fragment;
}
@RequiresPermissions("monitor:cache:view")
@PostMapping("/getKeys")
public String getCacheKeys(String fragment, String cacheName, ModelMap mmap)
{
mmap.put("cacheName", cacheName);
mmap.put("cacheKyes", cacheService.getCacheKeys(cacheName));
mmap.put("cacheKeys", cacheService.getCacheKeys(cacheName));
return prefix + "/cache::" + fragment;
}
@RequiresPermissions("monitor:cache:view")
@PostMapping("/getValue")
public String getCacheValue(String fragment, String cacheName, String cacheKey, ModelMap mmap)
{
@@ -56,6 +61,7 @@ public class CacheController extends BaseController
return prefix + "/cache::" + fragment;
}
@RequiresPermissions("monitor:cache:view")
@PostMapping("/clearCacheName")
@ResponseBody
public AjaxResult clearCacheName(String cacheName, ModelMap mmap)
@@ -64,6 +70,7 @@ public class CacheController extends BaseController
return AjaxResult.success();
}
@RequiresPermissions("monitor:cache:view")
@PostMapping("/clearCacheKey")
@ResponseBody
public AjaxResult clearCacheKey(String cacheName, String cacheKey, ModelMap mmap)
@@ -72,6 +79,7 @@ public class CacheController extends BaseController
return AjaxResult.success();
}
@RequiresPermissions("monitor:cache:view")
@GetMapping("/clearAll")
@ResponseBody
public AjaxResult clearAll(ModelMap mmap)
@@ -12,7 +12,6 @@ import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
@@ -84,7 +83,7 @@ public class SysConfigController extends BaseController
@ResponseBody
public AjaxResult addSave(@Validated SysConfig config)
{
if (UserConstants.CONFIG_KEY_NOT_UNIQUE.equals(configService.checkConfigKeyUnique(config)))
if (!configService.checkConfigKeyUnique(config))
{
return error("新增参数'" + config.getConfigName() + "'失败,参数键名已存在");
}
@@ -95,6 +94,7 @@ public class SysConfigController extends BaseController
/**
* 修改参数配置
*/
@RequiresPermissions("system:config:edit")
@GetMapping("/edit/{configId}")
public String edit(@PathVariable("configId") Long configId, ModelMap mmap)
{
@@ -111,7 +111,7 @@ public class SysConfigController extends BaseController
@ResponseBody
public AjaxResult editSave(@Validated SysConfig config)
{
if (UserConstants.CONFIG_KEY_NOT_UNIQUE.equals(configService.checkConfigKeyUnique(config)))
if (!configService.checkConfigKeyUnique(config))
{
return error("修改参数'" + config.getConfigName() + "'失败,参数键名已存在");
}
@@ -150,7 +150,7 @@ public class SysConfigController extends BaseController
*/
@PostMapping("/checkConfigKeyUnique")
@ResponseBody
public String checkConfigKeyUnique(SysConfig config)
public boolean checkConfigKeyUnique(SysConfig config)
{
return configService.checkConfigKeyUnique(config);
}
@@ -17,7 +17,6 @@ import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.Ztree;
import com.ruoyi.common.core.domain.entity.SysDept;
import com.ruoyi.common.core.domain.entity.SysRole;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.service.ISysDeptService;
@@ -75,7 +74,7 @@ public class SysDeptController extends BaseController
@ResponseBody
public AjaxResult addSave(@Validated SysDept dept)
{
if (UserConstants.DEPT_NAME_NOT_UNIQUE.equals(deptService.checkDeptNameUnique(dept)))
if (!deptService.checkDeptNameUnique(dept))
{
return error("新增部门'" + dept.getDeptName() + "'失败,部门名称已存在");
}
@@ -84,8 +83,9 @@ public class SysDeptController extends BaseController
}
/**
* 修改
* 修改部门
*/
@RequiresPermissions("system:dept:edit")
@GetMapping("/edit/{deptId}")
public String edit(@PathVariable("deptId") Long deptId, ModelMap mmap)
{
@@ -100,7 +100,7 @@ public class SysDeptController extends BaseController
}
/**
* 保存
* 修改保存部门
*/
@Log(title = "部门管理", businessType = BusinessType.UPDATE)
@RequiresPermissions("system:dept:edit")
@@ -108,16 +108,17 @@ public class SysDeptController extends BaseController
@ResponseBody
public AjaxResult editSave(@Validated SysDept dept)
{
if (UserConstants.DEPT_NAME_NOT_UNIQUE.equals(deptService.checkDeptNameUnique(dept)))
Long deptId = dept.getDeptId();
deptService.checkDeptDataScope(deptId);
if (!deptService.checkDeptNameUnique(dept))
{
return error("修改部门'" + dept.getDeptName() + "'失败,部门名称已存在");
}
else if (dept.getParentId().equals(dept.getDeptId()))
else if (dept.getParentId().equals(deptId))
{
return error("修改部门'" + dept.getDeptName() + "'失败,上级部门不能是自己");
}
else if (StringUtils.equals(UserConstants.DEPT_DISABLE, dept.getStatus())
&& deptService.selectNormalChildrenDeptById(dept.getDeptId()) > 0)
else if (StringUtils.equals(UserConstants.DEPT_DISABLE, dept.getStatus()) && deptService.selectNormalChildrenDeptById(deptId) > 0)
{
return AjaxResult.error("该部门包含未停用的子部门!");
}
@@ -142,6 +143,7 @@ public class SysDeptController extends BaseController
{
return AjaxResult.warn("部门存在用户,不允许删除");
}
deptService.checkDeptDataScope(deptId);
return toAjax(deptService.deleteDeptById(deptId));
}
@@ -150,7 +152,7 @@ public class SysDeptController extends BaseController
*/
@PostMapping("/checkDeptNameUnique")
@ResponseBody
public String checkDeptNameUnique(SysDept dept)
public boolean checkDeptNameUnique(SysDept dept)
{
return deptService.checkDeptNameUnique(dept);
}
@@ -163,24 +165,13 @@ public class SysDeptController extends BaseController
*/
@GetMapping(value = { "/selectDeptTree/{deptId}", "/selectDeptTree/{deptId}/{excludeId}" })
public String selectDeptTree(@PathVariable("deptId") Long deptId,
@PathVariable(value = "excludeId", required = false) String excludeId, ModelMap mmap)
@PathVariable(value = "excludeId", required = false) Long excludeId, ModelMap mmap)
{
mmap.put("dept", deptService.selectDeptById(deptId));
mmap.put("excludeId", excludeId);
return prefix + "/tree";
}
/**
* 加载部门列表树
*/
@GetMapping("/treeData")
@ResponseBody
public List<Ztree> treeData()
{
List<Ztree> ztrees = deptService.selectDeptTree(new SysDept());
return ztrees;
}
/**
* 加载部门列表树(排除下级)
*/
@@ -193,15 +184,4 @@ public class SysDeptController extends BaseController
List<Ztree> ztrees = deptService.selectDeptTreeExcludeChild(dept);
return ztrees;
}
/**
* 加载角色部门(数据权限)列表树
*/
@GetMapping("/roleDeptTreeData")
@ResponseBody
public List<Ztree> deptTreeData(SysRole role)
{
List<Ztree> ztrees = deptService.roleDeptTreeData(role);
return ztrees;
}
}
@@ -88,6 +88,7 @@ public class SysDictDataController extends BaseController
/**
* 修改字典类型
*/
@RequiresPermissions("system:dict:edit")
@GetMapping("/edit/{dictCode}")
public String edit(@PathVariable("dictCode") Long dictCode, ModelMap mmap)
{
@@ -12,7 +12,6 @@ import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.Ztree;
@@ -83,7 +82,7 @@ public class SysDictTypeController extends BaseController
@ResponseBody
public AjaxResult addSave(@Validated SysDictType dict)
{
if (UserConstants.DICT_TYPE_NOT_UNIQUE.equals(dictTypeService.checkDictTypeUnique(dict)))
if (!dictTypeService.checkDictTypeUnique(dict))
{
return error("新增字典'" + dict.getDictName() + "'失败,字典类型已存在");
}
@@ -94,6 +93,7 @@ public class SysDictTypeController extends BaseController
/**
* 修改字典类型
*/
@RequiresPermissions("system:dict:edit")
@GetMapping("/edit/{dictId}")
public String edit(@PathVariable("dictId") Long dictId, ModelMap mmap)
{
@@ -110,7 +110,7 @@ public class SysDictTypeController extends BaseController
@ResponseBody
public AjaxResult editSave(@Validated SysDictType dict)
{
if (UserConstants.DICT_TYPE_NOT_UNIQUE.equals(dictTypeService.checkDictTypeUnique(dict)))
if (!dictTypeService.checkDictTypeUnique(dict))
{
return error("修改字典'" + dict.getDictName() + "'失败,字典类型已存在");
}
@@ -158,7 +158,7 @@ public class SysDictTypeController extends BaseController
*/
@PostMapping("/checkDictTypeUnique")
@ResponseBody
public String checkDictTypeUnique(SysDictType dictType)
public boolean checkDictTypeUnique(SysDictType dictType)
{
return dictTypeService.checkDictTypeUnique(dictType);
}
@@ -55,7 +55,11 @@ public class SysIndexController extends BaseController
mmap.put("user", user);
mmap.put("sideTheme", configService.selectConfigByKey("sys.index.sideTheme"));
mmap.put("skinName", configService.selectConfigByKey("sys.index.skinName"));
mmap.put("ignoreFooter", configService.selectConfigByKey("sys.index.ignoreFooter"));
Boolean footer = Convert.toBool(configService.selectConfigByKey("sys.index.footer"), true);
Boolean tagsView = Convert.toBool(configService.selectConfigByKey("sys.index.tagsView"), true);
mmap.put("footer", footer);
mmap.put("tagsView", tagsView);
mmap.put("mainClass", contentMainClass(footer, tagsView));
mmap.put("copyrightYear", RuoYiConfig.getCopyrightYear());
mmap.put("demoEnabled", RuoYiConfig.isDemoEnabled());
mmap.put("isDefaultModifyPwd", initPasswordIsModify(user.getPwdUpdateDate()));
@@ -98,7 +102,7 @@ public class SysIndexController extends BaseController
SysUser user = getSysUser();
if (StringUtils.isNull(user))
{
return AjaxResult.error("服务器超时,请重新登");
return AjaxResult.error("服务器超时,请重新登");
}
if (passwordService.matches(user, password))
{
@@ -130,6 +134,24 @@ public class SysIndexController extends BaseController
return "main";
}
// content-main class
public String contentMainClass(Boolean footer, Boolean tagsView)
{
if (!footer && !tagsView)
{
return "tagsview-footer-hide";
}
else if (!footer)
{
return "footer-hide";
}
else if (!tagsView)
{
return "tagsview-hide";
}
return StringUtils.EMPTY;
}
// 检查初始密码是否提醒修改
public boolean initPasswordIsModify(Date pwdUpdateDate)
{
@@ -15,6 +15,7 @@ import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.text.Convert;
import com.ruoyi.common.utils.ServletUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.framework.web.service.ConfigService;
@@ -47,7 +48,7 @@ public class SysLoginController extends BaseController
// 是否开启记住我
mmap.put("isRemembered", rememberMe);
// 是否开启用户注册
mmap.put("isAllowRegister", configService.getKey("sys.account.registerUser"));
mmap.put("isAllowRegister", Convert.toBool(configService.getKey("sys.account.registerUser"), false));
return "login";
}
@@ -12,7 +12,6 @@ import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.Ztree;
@@ -105,7 +104,7 @@ public class SysMenuController extends BaseController
@ResponseBody
public AjaxResult addSave(@Validated SysMenu menu)
{
if (UserConstants.MENU_NAME_NOT_UNIQUE.equals(menuService.checkMenuNameUnique(menu)))
if (!menuService.checkMenuNameUnique(menu))
{
return error("新增菜单'" + menu.getMenuName() + "'失败,菜单名称已存在");
}
@@ -117,6 +116,7 @@ public class SysMenuController extends BaseController
/**
* 修改菜单
*/
@RequiresPermissions("system:menu:edit")
@GetMapping("/edit/{menuId}")
public String edit(@PathVariable("menuId") Long menuId, ModelMap mmap)
{
@@ -133,7 +133,7 @@ public class SysMenuController extends BaseController
@ResponseBody
public AjaxResult editSave(@Validated SysMenu menu)
{
if (UserConstants.MENU_NAME_NOT_UNIQUE.equals(menuService.checkMenuNameUnique(menu)))
if (!menuService.checkMenuNameUnique(menu))
{
return error("修改菜单'" + menu.getMenuName() + "'失败,菜单名称已存在");
}
@@ -156,7 +156,7 @@ public class SysMenuController extends BaseController
*/
@PostMapping("/checkMenuNameUnique")
@ResponseBody
public String checkMenuNameUnique(SysMenu menu)
public boolean checkMenuNameUnique(SysMenu menu)
{
return menuService.checkMenuNameUnique(menu);
}
@@ -5,6 +5,7 @@ import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
@@ -68,7 +69,7 @@ public class SysNoticeController extends BaseController
@Log(title = "通知公告", businessType = BusinessType.INSERT)
@PostMapping("/add")
@ResponseBody
public AjaxResult addSave(SysNotice notice)
public AjaxResult addSave(@Validated SysNotice notice)
{
notice.setCreateBy(getLoginName());
return toAjax(noticeService.insertNotice(notice));
@@ -77,6 +78,7 @@ public class SysNoticeController extends BaseController
/**
* 修改公告
*/
@RequiresPermissions("system:notice:edit")
@GetMapping("/edit/{noticeId}")
public String edit(@PathVariable("noticeId") Long noticeId, ModelMap mmap)
{
@@ -91,7 +93,7 @@ public class SysNoticeController extends BaseController
@Log(title = "通知公告", businessType = BusinessType.UPDATE)
@PostMapping("/edit")
@ResponseBody
public AjaxResult editSave(SysNotice notice)
public AjaxResult editSave(@Validated SysNotice notice)
{
notice.setUpdateBy(getLoginName());
return toAjax(noticeService.updateNotice(notice));
@@ -12,7 +12,6 @@ import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
@@ -97,11 +96,11 @@ public class SysPostController extends BaseController
@ResponseBody
public AjaxResult addSave(@Validated SysPost post)
{
if (UserConstants.POST_NAME_NOT_UNIQUE.equals(postService.checkPostNameUnique(post)))
if (!postService.checkPostNameUnique(post))
{
return error("新增岗位'" + post.getPostName() + "'失败,岗位名称已存在");
}
else if (UserConstants.POST_CODE_NOT_UNIQUE.equals(postService.checkPostCodeUnique(post)))
else if (!postService.checkPostCodeUnique(post))
{
return error("新增岗位'" + post.getPostName() + "'失败,岗位编码已存在");
}
@@ -112,6 +111,7 @@ public class SysPostController extends BaseController
/**
* 修改岗位
*/
@RequiresPermissions("system:post:edit")
@GetMapping("/edit/{postId}")
public String edit(@PathVariable("postId") Long postId, ModelMap mmap)
{
@@ -128,11 +128,11 @@ public class SysPostController extends BaseController
@ResponseBody
public AjaxResult editSave(@Validated SysPost post)
{
if (UserConstants.POST_NAME_NOT_UNIQUE.equals(postService.checkPostNameUnique(post)))
if (!postService.checkPostNameUnique(post))
{
return error("修改岗位'" + post.getPostName() + "'失败,岗位名称已存在");
}
else if (UserConstants.POST_CODE_NOT_UNIQUE.equals(postService.checkPostCodeUnique(post)))
else if (!postService.checkPostCodeUnique(post))
{
return error("修改岗位'" + post.getPostName() + "'失败,岗位编码已存在");
}
@@ -145,7 +145,7 @@ public class SysPostController extends BaseController
*/
@PostMapping("/checkPostNameUnique")
@ResponseBody
public String checkPostNameUnique(SysPost post)
public boolean checkPostNameUnique(SysPost post)
{
return postService.checkPostNameUnique(post);
}
@@ -155,7 +155,7 @@ public class SysPostController extends BaseController
*/
@PostMapping("/checkPostCodeUnique")
@ResponseBody
public String checkPostCodeUnique(SysPost post)
public boolean checkPostCodeUnique(SysPost post)
{
return postService.checkPostCodeUnique(post);
}
@@ -13,7 +13,6 @@ import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.config.RuoYiConfig;
import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysUser;
@@ -22,6 +21,7 @@ import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.ShiroUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.file.FileUploadUtils;
import com.ruoyi.common.utils.file.MimeTypeUtils;
import com.ruoyi.framework.shiro.service.SysPasswordService;
import com.ruoyi.system.service.ISysUserService;
@@ -62,11 +62,7 @@ public class SysProfileController extends BaseController
public boolean checkPassword(String password)
{
SysUser user = getSysUser();
if (passwordService.matches(user, password))
{
return true;
}
return false;
return passwordService.matches(user, password);
}
@GetMapping("/resetPwd")
@@ -137,13 +133,11 @@ public class SysProfileController extends BaseController
currentUser.setEmail(user.getEmail());
currentUser.setPhonenumber(user.getPhonenumber());
currentUser.setSex(user.getSex());
if (StringUtils.isNotEmpty(user.getPhonenumber())
&& UserConstants.USER_PHONE_NOT_UNIQUE.equals(userService.checkPhoneUnique(currentUser)))
if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(currentUser))
{
return error("修改用户'" + currentUser.getLoginName() + "'失败,手机号码已存在");
}
else if (StringUtils.isNotEmpty(user.getEmail())
&& UserConstants.USER_EMAIL_NOT_UNIQUE.equals(userService.checkEmailUnique(currentUser)))
else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(currentUser))
{
return error("修改用户'" + currentUser.getLoginName() + "'失败,邮箱账号已存在");
}
@@ -168,7 +162,7 @@ public class SysProfileController extends BaseController
{
if (!file.isEmpty())
{
String avatar = FileUploadUtils.upload(RuoYiConfig.getAvatarPath(), file);
String avatar = FileUploadUtils.upload(RuoYiConfig.getAvatarPath(), file, MimeTypeUtils.IMAGE_EXTENSION);
currentUser.setAvatar(avatar);
if (userService.updateUserInfo(currentUser) > 0)
{
@@ -2,13 +2,13 @@ package com.ruoyi.web.controller.system;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.framework.shiro.service.SysRegisterService;
import com.ruoyi.system.service.ISysConfigService;
@@ -12,9 +12,9 @@ import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.Ztree;
import com.ruoyi.common.core.domain.entity.SysRole;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.page.TableDataInfo;
@@ -22,6 +22,7 @@ import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.shiro.util.AuthorizationUtils;
import com.ruoyi.system.domain.SysUserRole;
import com.ruoyi.system.service.ISysDeptService;
import com.ruoyi.system.service.ISysRoleService;
import com.ruoyi.system.service.ISysUserService;
@@ -42,6 +43,9 @@ public class SysRoleController extends BaseController
@Autowired
private ISysUserService userService;
@Autowired
private ISysDeptService deptService;
@RequiresPermissions("system:role:view")
@GetMapping()
public String role()
@@ -88,11 +92,11 @@ public class SysRoleController extends BaseController
@ResponseBody
public AjaxResult addSave(@Validated SysRole role)
{
if (UserConstants.ROLE_NAME_NOT_UNIQUE.equals(roleService.checkRoleNameUnique(role)))
if (!roleService.checkRoleNameUnique(role))
{
return error("新增角色'" + role.getRoleName() + "'失败,角色名称已存在");
}
else if (UserConstants.ROLE_KEY_NOT_UNIQUE.equals(roleService.checkRoleKeyUnique(role)))
else if (!roleService.checkRoleKeyUnique(role))
{
return error("新增角色'" + role.getRoleName() + "'失败,角色权限已存在");
}
@@ -105,6 +109,7 @@ public class SysRoleController extends BaseController
/**
* 修改角色
*/
@RequiresPermissions("system:role:edit")
@GetMapping("/edit/{roleId}")
public String edit(@PathVariable("roleId") Long roleId, ModelMap mmap)
{
@@ -123,11 +128,12 @@ public class SysRoleController extends BaseController
public AjaxResult editSave(@Validated SysRole role)
{
roleService.checkRoleAllowed(role);
if (UserConstants.ROLE_NAME_NOT_UNIQUE.equals(roleService.checkRoleNameUnique(role)))
roleService.checkRoleDataScope(role.getRoleId());
if (!roleService.checkRoleNameUnique(role))
{
return error("修改角色'" + role.getRoleName() + "'失败,角色名称已存在");
}
else if (UserConstants.ROLE_KEY_NOT_UNIQUE.equals(roleService.checkRoleKeyUnique(role)))
else if (!roleService.checkRoleKeyUnique(role))
{
return error("修改角色'" + role.getRoleName() + "'失败,角色权限已存在");
}
@@ -156,6 +162,7 @@ public class SysRoleController extends BaseController
public AjaxResult authDataScopeSave(SysRole role)
{
roleService.checkRoleAllowed(role);
roleService.checkRoleDataScope(role.getRoleId());
role.setUpdateBy(getLoginName());
if (roleService.authDataScope(role) > 0)
{
@@ -179,7 +186,7 @@ public class SysRoleController extends BaseController
*/
@PostMapping("/checkRoleNameUnique")
@ResponseBody
public String checkRoleNameUnique(SysRole role)
public boolean checkRoleNameUnique(SysRole role)
{
return roleService.checkRoleNameUnique(role);
}
@@ -189,7 +196,7 @@ public class SysRoleController extends BaseController
*/
@PostMapping("/checkRoleKeyUnique")
@ResponseBody
public String checkRoleKeyUnique(SysRole role)
public boolean checkRoleKeyUnique(SysRole role)
{
return roleService.checkRoleKeyUnique(role);
}
@@ -213,6 +220,7 @@ public class SysRoleController extends BaseController
public AjaxResult changeStatus(SysRole role)
{
roleService.checkRoleAllowed(role);
roleService.checkRoleDataScope(role.getRoleId());
return toAjax(roleService.changeStatus(role));
}
@@ -296,6 +304,19 @@ public class SysRoleController extends BaseController
@ResponseBody
public AjaxResult selectAuthUserAll(Long roleId, String userIds)
{
roleService.checkRoleDataScope(roleId);
return toAjax(roleService.insertAuthUsers(roleId, userIds));
}
/**
* 加载角色部门(数据权限)列表树
*/
@RequiresPermissions("system:role:edit")
@GetMapping("/deptTreeData")
@ResponseBody
public List<Ztree> deptTreeData(SysRole role)
{
List<Ztree> ztrees = deptService.roleDeptTreeData(role);
return ztrees;
}
}
@@ -15,9 +15,10 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.Ztree;
import com.ruoyi.common.core.domain.entity.SysDept;
import com.ruoyi.common.core.domain.entity.SysRole;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.page.TableDataInfo;
@@ -27,6 +28,8 @@ import com.ruoyi.common.utils.ShiroUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.shiro.service.SysPasswordService;
import com.ruoyi.framework.shiro.util.AuthorizationUtils;
import com.ruoyi.system.service.ISysDeptService;
import com.ruoyi.system.service.ISysPostService;
import com.ruoyi.system.service.ISysRoleService;
import com.ruoyi.system.service.ISysUserService;
@@ -47,6 +50,9 @@ public class SysUserController extends BaseController
@Autowired
private ISysRoleService roleService;
@Autowired
private ISysDeptService deptService;
@Autowired
private ISysPostService postService;
@@ -123,17 +129,15 @@ public class SysUserController extends BaseController
@ResponseBody
public AjaxResult addSave(@Validated SysUser user)
{
if (UserConstants.USER_NAME_NOT_UNIQUE.equals(userService.checkLoginNameUnique(user.getLoginName())))
if (!userService.checkLoginNameUnique(user))
{
return error("新增用户'" + user.getLoginName() + "'失败,登录账号已存在");
}
else if (StringUtils.isNotEmpty(user.getPhonenumber())
&& UserConstants.USER_PHONE_NOT_UNIQUE.equals(userService.checkPhoneUnique(user)))
else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user))
{
return error("新增用户'" + user.getLoginName() + "'失败,手机号码已存在");
}
else if (StringUtils.isNotEmpty(user.getEmail())
&& UserConstants.USER_EMAIL_NOT_UNIQUE.equals(userService.checkEmailUnique(user)))
else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user))
{
return error("新增用户'" + user.getLoginName() + "'失败,邮箱账号已存在");
}
@@ -146,6 +150,7 @@ public class SysUserController extends BaseController
/**
* 修改用户
*/
@RequiresPermissions("system:user:edit")
@GetMapping("/edit/{userId}")
public String edit(@PathVariable("userId") Long userId, ModelMap mmap)
{
@@ -167,17 +172,21 @@ public class SysUserController extends BaseController
public AjaxResult editSave(@Validated SysUser user)
{
userService.checkUserAllowed(user);
if (StringUtils.isNotEmpty(user.getPhonenumber())
&& UserConstants.USER_PHONE_NOT_UNIQUE.equals(userService.checkPhoneUnique(user)))
userService.checkUserDataScope(user.getUserId());
if (!userService.checkLoginNameUnique(user))
{
return error("修改用户'" + user.getLoginName() + "'失败,登录账号已存在");
}
else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user))
{
return error("修改用户'" + user.getLoginName() + "'失败,手机号码已存在");
}
else if (StringUtils.isNotEmpty(user.getEmail())
&& UserConstants.USER_EMAIL_NOT_UNIQUE.equals(userService.checkEmailUnique(user)))
else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user))
{
return error("修改用户'" + user.getLoginName() + "'失败,邮箱账号已存在");
}
user.setUpdateBy(getLoginName());
AuthorizationUtils.clearAllCachedAuthorizationInfo();
return toAjax(userService.updateUser(user));
}
@@ -196,6 +205,7 @@ public class SysUserController extends BaseController
public AjaxResult resetPwdSave(SysUser user)
{
userService.checkUserAllowed(user);
userService.checkUserDataScope(user.getUserId());
user.setSalt(ShiroUtils.randomSalt());
user.setPassword(passwordService.encryptPassword(user.getLoginName(), user.getPassword(), user.getSalt()));
if (userService.resetUserPwd(user) > 0)
@@ -232,7 +242,9 @@ public class SysUserController extends BaseController
@ResponseBody
public AjaxResult insertAuthRole(Long userId, Long[] roleIds)
{
userService.checkUserDataScope(userId);
userService.insertUserAuth(userId, roleIds);
AuthorizationUtils.clearAllCachedAuthorizationInfo();
return success();
}
@@ -254,9 +266,9 @@ public class SysUserController extends BaseController
*/
@PostMapping("/checkLoginNameUnique")
@ResponseBody
public String checkLoginNameUnique(SysUser user)
public boolean checkLoginNameUnique(SysUser user)
{
return userService.checkLoginNameUnique(user.getLoginName());
return userService.checkLoginNameUnique(user);
}
/**
@@ -264,7 +276,7 @@ public class SysUserController extends BaseController
*/
@PostMapping("/checkPhoneUnique")
@ResponseBody
public String checkPhoneUnique(SysUser user)
public boolean checkPhoneUnique(SysUser user)
{
return userService.checkPhoneUnique(user);
}
@@ -274,7 +286,7 @@ public class SysUserController extends BaseController
*/
@PostMapping("/checkEmailUnique")
@ResponseBody
public String checkEmailUnique(SysUser user)
public boolean checkEmailUnique(SysUser user)
{
return userService.checkEmailUnique(user);
}
@@ -289,6 +301,32 @@ public class SysUserController extends BaseController
public AjaxResult changeStatus(SysUser user)
{
userService.checkUserAllowed(user);
userService.checkUserDataScope(user.getUserId());
return toAjax(userService.changeStatus(user));
}
/**
* 加载部门列表树
*/
@RequiresPermissions("system:user:list")
@GetMapping("/deptTreeData")
@ResponseBody
public List<Ztree> deptTreeData()
{
List<Ztree> ztrees = deptService.selectDeptTree(new SysDept());
return ztrees;
}
/**
* 选择部门树
*
* @param deptId 部门ID
*/
@RequiresPermissions("system:user:list")
@GetMapping("/selectDeptTree/{deptId}")
public String selectDeptTree(@PathVariable("deptId") Long deptId, ModelMap mmap)
{
mmap.put("dept", deptService.selectDeptById(deptId));
return prefix + "/deptTree";
}
}
@@ -13,7 +13,7 @@ import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.utils.StringUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
@@ -40,73 +40,75 @@ public class TestController extends BaseController
@ApiOperation("获取用户列表")
@GetMapping("/list")
public AjaxResult userList()
public R<List<UserEntity>> userList()
{
List<UserEntity> userList = new ArrayList<UserEntity>(users.values());
return AjaxResult.success(userList);
return R.ok(userList);
}
@ApiOperation("获取用户详细")
@ApiImplicitParam(name = "userId", value = "用户ID", required = true, dataType = "int", paramType = "path")
@ApiImplicitParam(name = "userId", value = "用户ID", required = true, dataType = "int", paramType = "path", dataTypeClass = Integer.class)
@GetMapping("/{userId}")
public AjaxResult getUser(@PathVariable Integer userId)
public R<UserEntity> getUser(@PathVariable Integer userId)
{
if (!users.isEmpty() && users.containsKey(userId))
{
return AjaxResult.success(users.get(userId));
return R.ok(users.get(userId));
}
else
{
return error("用户不存在");
return R.fail("用户不存在");
}
}
@ApiOperation("新增用户")
@ApiImplicitParams({
@ApiImplicitParam(name = "userId", value = "用户id", dataType = "Integer"),
@ApiImplicitParam(name = "username", value = "用户名称", dataType = "String"),
@ApiImplicitParam(name = "password", value = "用户密码", dataType = "String"),
@ApiImplicitParam(name = "mobile", value = "用户手机", dataType = "String")
@ApiImplicitParam(name = "userId", value = "用户id", dataType = "Integer", dataTypeClass = Integer.class),
@ApiImplicitParam(name = "username", value = "用户名称", dataType = "String", dataTypeClass = String.class),
@ApiImplicitParam(name = "password", value = "用户密码", dataType = "String", dataTypeClass = String.class),
@ApiImplicitParam(name = "mobile", value = "用户手机", dataType = "String", dataTypeClass = String.class)
})
@PostMapping("/save")
public AjaxResult save(UserEntity user)
public R<String> save(UserEntity user)
{
if (StringUtils.isNull(user) || StringUtils.isNull(user.getUserId()))
{
return error("用户ID不能为空");
return R.fail("用户ID不能为空");
}
return AjaxResult.success(users.put(user.getUserId(), user));
users.put(user.getUserId(), user);
return R.ok();
}
@ApiOperation("更新用户")
@PutMapping("/update")
public AjaxResult update(@RequestBody UserEntity user)
public R<String> update(@RequestBody UserEntity user)
{
if (StringUtils.isNull(user) || StringUtils.isNull(user.getUserId()))
{
return error("用户ID不能为空");
return R.fail("用户ID不能为空");
}
if (users.isEmpty() || !users.containsKey(user.getUserId()))
{
return error("用户不存在");
return R.fail("用户不存在");
}
users.remove(user.getUserId());
return AjaxResult.success(users.put(user.getUserId(), user));
users.put(user.getUserId(), user);
return R.ok();
}
@ApiOperation("删除用户信息")
@ApiImplicitParam(name = "userId", value = "用户ID", required = true, dataType = "int", paramType = "path")
@ApiImplicitParam(name = "userId", value = "用户ID", required = true, dataType = "int", paramType = "path", dataTypeClass = Integer.class)
@DeleteMapping("/{userId}")
public AjaxResult delete(@PathVariable Integer userId)
public R<String> delete(@PathVariable Integer userId)
{
if (!users.isEmpty() && users.containsKey(userId))
{
users.remove(userId);
return success();
return R.ok();
}
else
{
return error("用户不存在");
return R.fail("用户不存在");
}
}
}
@@ -24,6 +24,10 @@ spring:
maxActive: 20
# 配置获取连接等待超时的时间
maxWait: 60000
# 配置连接超时时间
connectTimeout: 30000
# 配置网络超时时间
socketTimeout: 60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
timeBetweenEvictionRunsMillis: 60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
+27 -24
View File
@@ -3,9 +3,9 @@ ruoyi:
# 名称
name: RuoYi
# 版本
version: 4.7.0
version: 4.7.7
# 版权年份
copyrightYear: 2021
copyrightYear: 2023
# 实例演示开关
demoEnabled: true
# 文件路径 示例( Windows配置D:/ruoyi/uploadPathLinux配置 /home/ruoyi/uploadPath
@@ -23,10 +23,13 @@ server:
tomcat:
# tomcat的URI编码
uri-encoding: UTF-8
# tomcat最大线程数,默认为200
max-threads: 800
# Tomcat启动初始化的线程数,默认值25
min-spare-threads: 30
# 连接数满后的排队数,默认为100
accept-count: 1000
threads:
# tomcat最大线程数,默认为200
max: 800
# Tomcat启动初始化的线程数,默认值10
min-spare: 100
# 日志配置
logging:
@@ -55,15 +58,15 @@ spring:
jackson:
time-zone: GMT+8
date-format: yyyy-MM-dd HH:mm:ss
profiles:
profiles:
active: druid
# 文件上传
servlet:
multipart:
# 单个文件大小
max-file-size: 10MB
# 设置总上传的文件大小
max-request-size: 20MB
multipart:
# 单个文件大小
max-file-size: 10MB
# 设置总上传的文件大小
max-request-size: 20MB
# 服务模块
devtools:
restart:
@@ -72,18 +75,18 @@ spring:
# MyBatis
mybatis:
# 搜索指定包别名
typeAliasesPackage: com.ruoyi.**.domain
# 配置mapper的扫描,找到所有的mapper.xml映射文件
mapperLocations: classpath*:mapper/**/*Mapper.xml
# 加载全局的配置文件
configLocation: classpath:mybatis/mybatis-config.xml
# 搜索指定包别名
typeAliasesPackage: com.ruoyi.**.domain
# 配置mapper的扫描,找到所有的mapper.xml映射文件
mapperLocations: classpath*:mapper/**/*Mapper.xml
# 加载全局的配置文件
configLocation: classpath:mybatis/mybatis-config.xml
# PageHelper分页插件
pagehelper:
pagehelper:
helperDialect: mysql
supportMethodsArguments: true
params: count=countSql
params: count=countSql
# Shiro
shiro:
@@ -96,11 +99,11 @@ shiro:
indexUrl: /index
# 验证码开关
captchaEnabled: true
# 验证码类型 math 数计算 char 字符
# 验证码类型 math 数计算 char 字符验证
captchaType: math
cookie:
# 设置Cookie的域名 默认空,即当前访问的域名
domain:
domain:
# 设置cookie的有效访问路径
path: /
# 设置HttpOnly属性
@@ -108,7 +111,7 @@ shiro:
# 设置Cookie的过期时间,天为单位
maxAge: 30
# 设置密钥,务必保持唯一性(生成方式,直接拷贝到main运行即可)Base64.encodeToString(CipherUtils.generateNewKey(128, "AES").getEncoded()) (默认启动生成随机秘钥,随机秘钥会导致之前客户端RememberMe Cookie无效,如设置固定秘钥RememberMe Cookie则有效)
cipherKey:
cipherKey:
session:
# Session超时时间,-1代表永不过期(默认30分钟)
expireTime: 30
@@ -125,7 +128,7 @@ shiro:
enabled: true
# 防止XSS攻击
xss:
xss:
# 过滤开关
enabled: true
# 排除链接(多个用逗号分隔)
@@ -3,13 +3,18 @@
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<setting name="cacheEnabled" value="true" /> <!-- 全局映射器启用缓存 -->
<setting name="useGeneratedKeys" value="true" /> <!-- 允许 JDBC 支持自动生成主键 -->
<setting name="defaultExecutorType" value="REUSE" /> <!-- 配置默认的执行器 -->
<setting name="logImpl" value="SLF4J" /> <!-- 指定 MyBatis 所用日志的具体实现 -->
<!-- <setting name="mapUnderscoreToCamelCase" value="true"/> 驼峰式命名 -->
<!-- 全局参数 -->
<settings>
<!-- 使全局映射器启用或禁用缓存 -->
<setting name="cacheEnabled" value="true" />
<!-- 允许JDBC 支持自动生成主键 -->
<setting name="useGeneratedKeys" value="true" />
<!-- 配置默认的执行器.SIMPLE就是普通执行器;REUSE执行器会重用预处理语句(prepared statements);BATCH执行器将重用语句并执行批量更新 -->
<setting name="defaultExecutorType" value="SIMPLE" />
<!-- 指定 MyBatis 所用日志的具体实现 -->
<setting name="logImpl" value="SLF4J" />
<!-- 使用驼峰命名法转换字段 -->
<!-- <setting name="mapUnderscoreToCamelCase" value="true"/> -->
</settings>
</configuration>
@@ -1,11 +1,11 @@
/*!
* bootstrap-fileinput v5.2.3
* bootstrap-fileinput v5.5.2
* http://plugins.krajee.com/file-input
*
* Krajee default styling for bootstrap-fileinput.
*
* Author: Kartik Visweswaran
* Copyright: 2014 - 2021, Kartik Visweswaran, Krajee.com
* Copyright: 2014 - 2022, Kartik Visweswaran, Krajee.com
*
* Licensed under the BSD-3-Clause
* https://github.com/kartik-v/bootstrap-fileinput/blob/master/LICENSE.md
@@ -50,6 +50,10 @@ input[type=file].file-loading {
display: none;
}
.file-caption .input-group {
align-items: center;
}
.btn-file input[type=file],
.file-caption-icon,
.file-preview .fileinput-remove,
@@ -179,15 +183,15 @@ input[type=file].file-loading {
}
.file-caption.icon-visible .file-caption-name {
padding-left: 1.875rem;
padding-left: 25px;
}
.file-caption.icon-visible > .input-group-lg .file-caption-name {
padding-left: 2.1rem;
padding-left: 30px;
}
.file-caption.icon-visible > .input-group-sm .file-caption-name {
padding-left: 1.5rem;
padding-left: 22px;
}
.file-caption-name:not(.file-caption-disabled) {
@@ -201,7 +205,7 @@ input[type=file].file-loading {
}
.file-caption-icon {
padding: 0.5rem;
padding: 7px 5px;
left: 4px;
}
@@ -274,6 +278,7 @@ input[type=file].file-loading {
padding: 6px;
float: left;
text-align: center;
}
.krajee-default.file-preview-frame .kv-file-content {
@@ -281,12 +286,6 @@ input[type=file].file-loading {
height: 160px;
}
.krajee-default .file-preview-other-frame {
display: flex;
align-items: center;
justify-content: center;
}
.krajee-default.file-preview-frame .kv-file-content.kv-pdf-rendered {
width: 400px;
}
@@ -330,7 +329,7 @@ input[type=file].file-loading {
text-align: center;
padding-top: 4px;
font-size: 11px;
color: #777;
color: #999;
margin-bottom: 30px;
}
@@ -406,7 +405,7 @@ input[type=file].file-loading {
height: 2.4rem;
top: 50%;
border-radius: 50%;
text-align:center;
text-align: center;
}
.btn-navigate * {
@@ -426,19 +425,12 @@ input[type=file].file-loading {
right: 0;
}
.file-zoom-dialog .kv-zoom-caption {
max-width: 50%;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
.file-zoom-dialog .kv-zoom-header {
padding: 0.5rem;
}
.file-zoom-dialog .kv-zoom-body {
padding: 0.25rem 0.5rem 0.25rem 0;
padding: 0.25rem;
}
.file-zoom-dialog .kv-zoom-description {
@@ -554,6 +546,10 @@ input[type=file].file-loading {
z-index: 3000;
}
.kv-zoom-actions {
min-width: 140px;
}
.kv-zoom-actions .btn-kv {
margin-left: 3px;
}
@@ -568,15 +564,6 @@ input[type=file].file-loading {
background: transparent;
}
.file-zoom-content > * {
display: inline-block;
vertical-align: middle;
}
.file-zoom-content .kv-spacer {
height: 100%;
}
.file-zoom-content .file-preview-image {
max-height: 100%;
}
@@ -668,4 +655,34 @@ input[type=file].file-loading {
.file-preview .kv-zoom-cache {
display: none;
}
.file-preview-other-frame, .file-preview-object, .kv-file-content, .kv-zoom-body {
display: flex;
align-items: center;
justify-content: center;
}
.btn-kv-rotate,
.kv-file-rotate {
display: none;
}
.rotatable:not(.hide-rotate) .btn-kv-rotate,
.rotatable:not(.hide-rotate) .kv-file-rotate {
display: inline-block;
}
.rotatable .file-zoom-detail,
.rotatable .kv-file-content,
.rotatable .kv-file-content > :first-child {
transform-origin: center center;
}
.rotate-animate {
transition: transform 0.3s ease;
}
.kv-overflow-hidden {
overflow: hidden;
}
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -4,10 +4,11 @@
* @update: zhixin wen <wenzhixin2010@gmail.com>
*/
const Utils = $.fn.bootstrapTable.utils
var Utils = $.fn.bootstrapTable.utils
$.extend($.fn.bootstrapTable.defaults, {
autoRefresh: false,
showAutoRefresh: true,
autoRefreshInterval: 60,
autoRefreshSilent: true,
autoRefreshStatus: true,
@@ -17,6 +18,7 @@ $.extend($.fn.bootstrapTable.defaults, {
$.extend($.fn.bootstrapTable.defaults.icons, {
autoRefresh: {
bootstrap3: 'glyphicon-time icon-time',
bootstrap5: 'bi-clock',
materialize: 'access_time',
'bootstrap-table': 'icon-clock'
}[$.fn.bootstrapTable.theme] || 'fa-clock'
File diff suppressed because one or more lines are too long
@@ -1,8 +1,9 @@
/**
* @author zhixin wen <wenzhixin2010@gmail.com>
* @author: Dustin Utecht
* @github: https://github.com/UtechtDustin
*/
const Utils = $.fn.bootstrapTable.utils
var Utils = $.fn.bootstrapTable.utils
$.extend($.fn.bootstrapTable.defaults, {
customView: false,
@@ -105,4 +106,4 @@ $.BootstrapTable = class extends $.BootstrapTable {
this.showCustomView = !this.showCustomView
this.initBody()
}
}
}
@@ -1,7 +1,7 @@
/*! X-editable - v1.5.1
/*! X-editable - v1.5.3
* In-place editing with Twitter Bootstrap, jQuery UI or pure jQuery
* http://github.com/vitalets/x-editable
* Copyright (c) 2013 Vitaliy Potapov; Licensed MIT */
* Copyright (c) 2019 Vitaliy Potapov; Licensed MIT */
.editableform {
margin-bottom: 0; /* overwrites bootstrap margin */
}
@@ -12,6 +12,16 @@
line-height: 20px; /* overwriting bootstrap line-height. See #133 */
}
/*
BS3 fix: stop css from breaking when the form is inside a popup and inside a form with the class .form-horizontal
See: https://github.com/vitalets/x-editable/issues/682
*/
.form-horizontal .editable-popup .editableform .form-group {
margin-left:0;
margin-right:0;
}
/*
BS3 width:1005 for inputs breaks editable form in popup
See: https://github.com/vitalets/x-editable/issues/393
@@ -145,6 +155,7 @@
.editable-pre-wrapped {
white-space: pre-wrap;
}
.editable-container.editable-popup {
max-width: none !important; /* without this rule poshytip/tooltip does not stretch */
}
File diff suppressed because one or more lines are too long
@@ -4,7 +4,7 @@
* extensions: https://github.com/vitalets/x-editable
*/
const Utils = $.fn.bootstrapTable.utils
var Utils = $.fn.bootstrapTable.utils
$.extend($.fn.bootstrapTable.defaults, {
editable: true,
@@ -26,7 +26,7 @@ $.extend($.fn.bootstrapTable.columnDefaults, {
alwaysUseFormatter: false
})
$.extend($.fn.bootstrapTable.Constructor.EVENTS, {
$.extend($.fn.bootstrapTable.events, {
'editable-init.bs.table': 'onEditableInit',
'editable-save.bs.table': 'onEditableSave',
'editable-shown.bs.table': 'onEditableShown',
@@ -63,7 +63,7 @@ $.BootstrapTable = class extends $.BootstrapTable {
column.formatter = column.formatter || (value => value)
column._formatter = column._formatter ? column._formatter : column.formatter
column.formatter = (value, row, index) => {
column.formatter = (value, row, index, field) => {
let result = Utils.calculateObjectValue(column, column._formatter, [value, row, index], value)
result = typeof result === 'undefined' || result === null ? this.options.undefinedText : result
@@ -86,7 +86,7 @@ $.BootstrapTable = class extends $.BootstrapTable {
column.editable, [index, row], {})
if (editableOpts.hasOwnProperty('noEditFormatter')) {
noEditFormatter = editableOpts.noEditFormatter(value, row, index)
noEditFormatter = editableOpts.noEditFormatter(value, row, index, field)
}
if (noEditFormatter === false) {
@@ -177,11 +177,13 @@ $.BootstrapTable = class extends $.BootstrapTable {
if (params && params.escape) {
for (const row of data) {
for (const [key, value] of Object.entries(row)) {
row[key] = Utils.unescapeHTML(value)
if (typeof(value) !== "number") {
row[key] = Utils.unescapeHTML(value)
}
}
}
}
return data
}
}
}
@@ -3,7 +3,7 @@
* extensions: https://github.com/hhurz/tableExport.jquery.plugin
*/
const Utils = $.fn.bootstrapTable.utils
var Utils = $.fn.bootstrapTable.utils
const TYPE_NAME = {
json: 'JSON',
@@ -43,6 +43,7 @@ $.extend($.fn.bootstrapTable.columnDefaults, {
$.extend($.fn.bootstrapTable.defaults.icons, {
export: {
bootstrap3: 'glyphicon-export icon-share',
bootstrap5: 'bi-download',
materialize: 'file_download',
'bootstrap-table': 'icon-download'
}[$.fn.bootstrapTable.theme] || 'fa-download'
@@ -91,30 +92,51 @@ $.BootstrapTable = class extends $.BootstrapTable {
this.buttons = Object.assign(this.buttons, {
export: {
html: exportTypes.length === 1 ? `
<div class="export ${this.constants.classes.buttonsDropdown}"
data-type="${exportTypes[0]}">
<button class="${this.constants.buttonsClass}"
aria-label="Export"
type="button"
title="${o.formatExport()}">
${o.showButtonIcons ? Utils.sprintf(this.constants.html.icon, o.iconsPrefix, o.icons.export) : ''}
${o.showButtonText ? o.formatExport() : ''}
</button>
</div>
` : `
<div class="export ${this.constants.classes.buttonsDropdown}">
<button class="${this.constants.buttonsClass} dropdown-toggle"
aria-label="Export"
${this.constants.dataToggle}="dropdown"
type="button"
title="${o.formatExport()}">
${o.showButtonIcons ? Utils.sprintf(this.constants.html.icon, o.iconsPrefix, o.icons.export) : ''}
${o.showButtonText ? o.formatExport() : ''}
${this.constants.html.dropdownCaret}
</button>
</div>
`
html:
(() => {
if (exportTypes.length === 1) {
return `
<div class="export ${this.constants.classes.buttonsDropdown}"
data-type="${exportTypes[0]}">
<button class="${this.constants.buttonsClass}"
aria-label="Export"
type="button"
title="${o.formatExport()}">
${o.showButtonIcons ? Utils.sprintf(this.constants.html.icon, o.iconsPrefix, o.icons.export) : ''}
${o.showButtonText ? o.formatExport() : ''}
</button>
</div>
`
}
const html = []
html.push(`
<div class="export ${this.constants.classes.buttonsDropdown}">
<button class="${this.constants.buttonsClass} dropdown-toggle"
aria-label="Export"
${this.constants.dataToggle}="dropdown"
type="button"
title="${o.formatExport()}">
${o.showButtonIcons ? Utils.sprintf(this.constants.html.icon, o.iconsPrefix, o.icons.export) : ''}
${o.showButtonText ? o.formatExport() : ''}
${this.constants.html.dropdownCaret}
</button>
${this.constants.html.toolbarDropdown[0]}
`)
for (const type of exportTypes) {
if (TYPE_NAME.hasOwnProperty(type)) {
const $item = $(Utils.sprintf(this.constants.html.pageDropdownItem, '', TYPE_NAME[type]))
$item.attr('data-type', type)
html.push($item.prop('outerHTML'))
}
}
html.push(this.constants.html.toolbarDropdown[1], '</div>')
return html.join('')
})
}
})
}
@@ -126,32 +148,14 @@ $.BootstrapTable = class extends $.BootstrapTable {
return
}
let $menu = $(this.constants.html.toolbarDropdown.join(''))
let $items = this.$export
this.updateExportButton()
let $exportButtons = this.$export.find('[data-type]')
if (exportTypes.length > 1) {
this.$export.append($menu)
// themes support
if ($menu.children().length) {
$menu = $menu.children().eq(0)
}
for (const type of exportTypes) {
if (TYPE_NAME.hasOwnProperty(type)) {
const $item = $(Utils.sprintf(this.constants.html.pageDropdownItem,
'', TYPE_NAME[type]))
$item.attr('data-type', type)
$menu.append($item)
}
}
$items = $menu.children()
if (exportTypes.length === 1) {
$exportButtons = this.$export.find('button')
}
this.updateExportButton()
$items.click(e => {
$exportButtons.click(e => {
e.preventDefault()
const type = $(e.currentTarget).data('type')
@@ -2,7 +2,7 @@
* @update zhixin wen <wenzhixin2010@gmail.com>
*/
const Utils = $.fn.bootstrapTable.utils
var Utils = $.fn.bootstrapTable.utils
function printPageBuilderDefault (table) {
return `
@@ -134,8 +134,9 @@ $.BootstrapTable = class extends $.BootstrapTable {
doPrint (data) {
const formatValue = (row, i, column) => {
const value = Utils.calculateObjectValue(column, column.printFormatter,
[row[column.field], row, i], row[column.field])
const value = Utils.calculateObjectValue(column,
column.printFormatter || column.formatter,
[$.common.getItemField(row, column.field), row, i], $.common.getItemField(row, column.field))
return typeof value === 'undefined' || value === null ?
this.options.undefinedText : value
@@ -13,7 +13,7 @@ $.extend($.fn.bootstrapTable.defaults, {
onDragStyle: null,
onDropStyle: null,
onDragClass: 'reorder_rows_onDragClass',
dragHandle: '>tbody>tr>td',
dragHandle: '>tbody>tr>td:not(.bs-checkbox)',
useRowAttrFunc: false,
// eslint-disable-next-line no-unused-vars
onReorderRowsDrag (row) {
@@ -93,10 +93,26 @@ $.BootstrapTable = class extends $.BootstrapTable {
this.options.data.splice(this.options.data.indexOf(draggingRow), 1)
this.options.data.splice(index, 0, draggingRow)
this.initSearch()
// Call the user defined function
this.options.onReorderRowsDrop(droppedRow)
// Call the event reorder-row
this.trigger('reorder-row', newData, draggingRow, droppedRow)
}
initSearch () {
this.ignoreInitSort = true
super.initSearch()
}
initSort () {
if (this.ignoreInitSort) {
this.ignoreInitSort = false
return
}
super.initSort()
}
}
@@ -43,6 +43,8 @@ $.BootstrapTable = class extends $.BootstrapTable {
.on('column-switch.bs.table page-change.bs.table', () => {
reInitResizable(this)
})
reInitResizable(this)
}
toggleView (...args) {
@@ -14,12 +14,14 @@
}
// 如果是初始化组件
options = $.extend({}, $.fn.bootstrapTreeTable.defaults, options || {});
target.hasSelectItem = false;// 是否有radio或checkbox
target.data_list = null; //用于缓存格式化后的数据-按父分组
target.data_obj = null; //用于缓存格式化后的数据-按id存对象
target.hiddenColumns = []; //用于存放被隐藏列的field
target.lastAjaxParams; //用户最后一次请求的参数
target.isFixWidth=false; //是否有固定宽度
target.hasSelectItem = false; // 是否有radio或checkbox
target.data_list = null; // 用于缓存格式化后的数据-按父分组
target.data_obj = null; // 用于缓存格式化后的数据-按id存对象
target.hiddenColumns = []; // 用于存放被隐藏列的field
target.lastAjaxParams; // 用户最后一次请求的参数
target.isFixWidth=false; // 是否有固定宽度
target.totalRows = 0; // 记录总数
target.totalPages = 0; // 总页数
// 初始化
var init = function() {
// 初始化容器
@@ -148,12 +150,30 @@
if (options.height) {
$tbody.css("height", options.height);
}
if (options.pagination) {
var $pagination = $('<div class="fixed-table-pagination"></div>');
target.append($pagination);
}
}
// 初始化数据服务
var initServer = function(parms) {
if (options.pagination) {
if(parms == undefined || parms == null) {
parms = {};
}
parms[options.parentCode] = options.rootIdValue;
}
// 加载数据前先清空
target.data_list = {};
target.data_obj = {};
// 设置请求分页参数
if (options.pagination) {
var params = {};
params.offset = options.pageSize * (options.pageNumber - 1);
params.limit = options.pageSize;
var curParams = { pageSize: params.limit, pageNum: params.offset / params.limit + 1 };
parms = $.extend(curParams, parms);
}
var $tbody = target.find("tbody");
// 添加加载loading
var $loading = '<tr><td colspan="' + options.columns.length + '"><div style="display: block;text-align: center;">正在努力地加载数据中,请稍候……</div></td></tr>'
@@ -162,8 +182,8 @@
$.ajax({
type: options.type,
url: options.url,
data: parms ? parms : options.ajaxParams,
dataType: "JSON",
data: $.extend(parms, options.ajaxParams),
dataType: "json",
success: function(data, textStatus, jqXHR) {
data = calculateObjectValue(options, options.responseHandler, [data], data);
renderTable(data);
@@ -172,7 +192,7 @@
error: function(xhr, textStatus) {
var _errorMsg = '<tr><td colspan="' + options.columns.length + '"><div style="display: block;text-align: center;">' + xhr.responseText + '</div></td></tr>'
$tbody.html(_errorMsg);
},
}
});
} else {
renderTable(options.data);
@@ -180,12 +200,25 @@
}
// 加载完数据后渲染表格
var renderTable = function(data) {
var list, totalPage = 0, currPage = 0;
if (options.pagination) {
list = data.rows; // 数据
currPage = options.pageNumber; // 当前页
totalPage = ~~((data.total - 1) / options.pageSize) + 1 // 总页数
target.totalPages = totalPage;
target.totalRows = data.total; // 总记录数
} else {
list = data;
}
data = list;
var $tbody = target.find("tbody");
// 先清空
$tbody.html("");
if (!data || data.length <= 0) {
var _empty = '<tr><td colspan="' + options.columns.length + '"><div style="display: block;text-align: center;">没有找到匹配的记录</div></td></tr>'
$tbody.html(_empty);
options.pageNumber = 1;
initPagination(0, 0);
return;
}
// 缓存并格式化数据
@@ -196,22 +229,24 @@
if (rootNode) {
$.each(rootNode, function(i, item) {
var _child_row_id = "row_id_" + i
recursionNode(item, 1, _child_row_id, "row_root");
recursionNode(item, 1, _child_row_id, "row_root", item[options.code]);
});
}
// 下边的操作主要是为了查询时让一些没有根节点的节点显示
$.each(data, function(i, item) {
if (!item.isShow) {
var tr = renderRow(item, false, 1, "", "");
var tr = renderRow(item, false, 1, "", "", options.pagination, item[options.code]);
$tbody.append(tr);
}
});
target.append($tbody);
registerExpanderEvent();
registerRowClickEvent();
initHiddenColumns();
// 动态设置表头宽度
autoTheadWidth();
if (options.pagination) {
initPagination(totalPage, currPage);
}
// 移动端适配
var treetableTable = $(target).parent('.treetable-table');
var availableHeight = treetableTable.outerWidth();
@@ -229,6 +264,183 @@
$(target).attr('style','width:' + w +'px');
}
}
// 初始化分页
var initPagination = function (totalPage,currPage) {
var $pagination = target.find(".fixed-table-pagination");
$pagination.empty();
var html = [];
var pageFrom = (options.pageNumber - 1) * options.pageSize + 1;
var pageTo = options.pageNumber * options.pageSize;
if (pageTo > target.totalRows) {
pageTo = target.totalRows;
}
if (pageFrom > pageTo) {
pageFrom = pageTo;
}
html.push('<div class="pull-left pagination-detail">');
html.push('<span class="pagination-info">' + formatShowingRows(pageFrom, pageTo, target.totalRows) + '</span>');
var pageList = false;
$.each(options.pageList, function (i, page) {
if(target.totalRows > page){
pageList = true;
}
})
if(pageList){
var _page_list = [];
_page_list.push('<span class="page-list">');
_page_list.push('<span class="btn-group dropup">');
_page_list.push('<button type="button" class="btn btn-default btn-outline dropdown-toggle" data-toggle="dropdown">');
_page_list.push('<span class="page-size">' + options.pageSize + '</span>');
_page_list.push('<span class="caret"></span>');
_page_list.push('</button>');
_page_list.push('<ul class="dropdown-menu" role="menu">');
$.each(options.pageList, function (i, page) {
if(page == options.pageSize){
_page_list.push('<li class="active"><a href="javascript:void(0)">' + page + '</a></li>');
}
else if(page >= target.totalRows && i === 1){
_page_list.push('<li><a href="javascript:void(0)">' + page + '</a></li>');
}
else if(page <= target.totalRows){
_page_list.push('<li><a href="javascript:void(0)">' + page + '</a></li>');
}
})
_page_list.push('</ul>');
_page_list.push('</span>');
html.push(formatRecordsPerPage(_page_list.join('')))
html.push('</span>');
}
html.push('</div>');
if(totalPage > 1){
html.push('<div class="pull-right pagination">');
html.push('<ul class="pagination pagination-outline">');
html.push('<li class="page-pre"><a href="javascript:void(0)">' + options.paginationPreText + '</a></li>');
var from, to;
if (totalPage < 5) {
from = 1;
to = totalPage;
} else {
from = currPage - 2;
to = from + 4;
if (from < 1) {
from = 1;
to = 5;
}
if (to > totalPage) {
to = totalPage;
from = to - 4;
}
}
if (totalPage >= 6) {
if (currPage >= 3) {
html.push('<li class="page-first' + (1 == currPage ? ' active' : '') + '">', '<a href="javascript:void(0)">', 1, '</a>', '</li>');
from++;
}
if (currPage >= 4) {
if (currPage == 4 || totalPage == 6 || totalPage == 7) {
from--;
} else {
html.push('<li class="page-first-separator disabled">', '<a href="javascript:void(0)">...</a>', '</li>');
}
to--;
}
}
if (totalPage >= 7) {
if (currPage >= (totalPage - 2)) {
from--;
}
}
if (totalPage == 6) {
if (currPage >= (totalPage - 2)) {
to++;
}
} else if (totalPage >= 7) {
if (totalPage == 7 || currPage >= (totalPage - 3)) {
to++;
}
}
for (var i = from; i <= to; i++) {
html.push('<li class="page-number' + (i == currPage ? ' active' : '') + '">', '<a href="javascript:void(0)">', i, '</a>', '</li>');
}
if (totalPage >= 8) {
if (currPage <= (totalPage - 4)) {
html.push('<li class="page-last-separator disabled">', '<a href="javascript:void(0)">...</a>', '</li>');
}
}
if (totalPage >= 6) {
if (currPage <= (totalPage - 3)) {
html.push('<li class="page-last' + (totalPage === currPage ? ' active' : '') + '">', '<a href="javascript:void(0)">', totalPage, '</a>', '</li>');
}
}
html.push('<li class="page-next"><a href="javascript:void(0)">' + options.paginationNextText + '</a></li>');
html.push('</ul></div>');
}
$pagination.append(html.join(''));
var $pageList = $pagination.find('.page-list a');
var $pre = $pagination.find('.page-pre');
var $next = $pagination.find('.page-next');
var $number = $pagination.find('.page-number');
var $first = $pagination.find('.page-first');
var $last = $pagination.find('.page-last');
$pre.off('click').on('click', $.proxy(onPagePre, this));
$pageList.off('click').on('click', $.proxy(onPageListChange, this));
$number.off('click').on('click', $.proxy(onPageNumber, this));
$first.off('click').on('click', $.proxy(onPageFirst, this));
$last.off('click').on('click', $.proxy(onPageLast, this));
$next.off('click').on('click', $.proxy(onPageNext, this));
}
var onPageListChange = function(event){
var $this = $(event.currentTarget);
$this.parent().addClass('active').siblings().removeClass('active');
var $pagination = target.find(".fixed-table-pagination");
options.pageSize = $this.text().toUpperCase() === target.totalRows ? target.totalRows : + $this.text();
if(target.totalRows < options.pageSize * options.pageNumber){
options.pageNumber = 1;
}
$pagination.find('.page-size').text(options.pageSize);
initServer();
}
var onPagePre = function(event){
if ((options.pageNumber - 1) === 0) {
options.pageNumber = target.totalPages;
} else {
options.pageNumber--;
}
initServer();
}
var onPageNumber = function(event){
if (options.pageNumber == $(event.currentTarget).text()) {
return;
}
options.pageNumber = $(event.currentTarget).text();
initServer();
}
var onPageFirst = function(event){
options.pageNumber = 1;
initServer();
}
var onPageLast = function (event) {
options.pageNumber = target.totalPages;
initServer();
}
var onPageNext = function(event){
if ((options.pageNumber + 1) > target.totalPages) {
options.pageNumber = 1;
} else {
options.pageNumber++;
}
initServer();
}
// 动态设置表头宽度
var autoTheadWidth = function(initFlag) {
if(options.height>0){
@@ -269,6 +481,14 @@
$.each(data, function(index, item) {
// 添加一个默认属性,用来判断当前节点有没有被显示
item.isShow = false;
// 是否分页
if (options.pagination) {
if (item.isTreeLeaf == undefined || item.isTreeLeaf == null) {
item.isTreeLeaf = false;
} else {
item.isTreeLeaf = (item["isTreeLeaf"] == 1 ? true: false) || ((item["isTreeLeaf"] == 'true' || item["isTreeLeaf"] == true) ? true: false);
}
}
// 顶级节点校验判断,兼容0,'0','',null
var _defaultRootFlag = item[options.parentCode] == '0' ||
item[options.parentCode] == 0 ||
@@ -295,26 +515,26 @@
});
}
// 递归获取子节点并且设置子节点
var recursionNode = function(parentNode, lv, row_id, p_id) {
var recursionNode = function(parentNode, lv, row_id, p_id, k) {
var $tbody = target.find("tbody");
var _ls = target.data_list["_n_" + parentNode[options.code]];
var $tr = renderRow(parentNode, _ls ? true : false, lv, row_id, p_id);
var $tr = renderRow(parentNode, _ls ? true : false, lv, row_id, p_id, options.pagination, k);
$tbody.append($tr);
if (_ls) {
$.each(_ls, function(i, item) {
var _child_row_id = row_id + "_" + i
recursionNode(item, (lv + 1), _child_row_id, row_id)
recursionNode(item, (lv + 1), _child_row_id, row_id, item[options.code])
});
}
};
// 绘制行
var renderRow = function(item, isP, lv, row_id, p_id) {
var renderRow = function(item, isP, lv, row_id, p_id, _pagination, k) {
// 标记已显示
item.isShow = true;
item.row_id = row_id;
item.p_id = p_id;
item.lv = lv;
var $tr = $('<tr id="' + row_id + '" pid="' + p_id + '"></tr>');
var $tr = $('<tr id="' + row_id + '" data-id="' + k + '"pid="' + p_id + '"></tr>');
var _icon = options.expanderCollapsedClass;
if (options.expandAll) {
$tr.css("display", "table");
@@ -329,6 +549,10 @@
$tr.css("display", "none");
}
_icon = options.expanderCollapsedClass;
} else if (_pagination) {
if (item.isTreeLeaf) {
_icon = options.expanderCollapsedClass;
}
} else {
$tr.css("display", "none");
_icon = options.expanderCollapsedClass;
@@ -375,12 +599,20 @@
$td.text(getItemField(item, column.field));
}
if (options.expandColumn == index) {
if (!isP) {
$td.prepend('<span class="treetable-expander"></span>')
} else {
$td.prepend('<span class="treetable-expander ' + _icon + '"></span>')
}
for (var int = 0; int < (lv - 1); int++) {
if (_pagination) {
if (item["isTreeLeaf"]) {
$td.prepend('<span class="treetable-expander ' + _icon + '"></span>');
} else {
$td.prepend('<span class="treetable-expander"></span>')
}
} else {
if (!isP) {
$td.prepend('<span class="treetable-expander"></span>')
} else {
$td.prepend('<span class="treetable-expander ' + _icon + '"></span>');
}
}
for (var int = 0; int < (lv - options.expandColumn); int++) {
$td.prepend('<span class="treetable-indent"></span>')
}
}
@@ -440,6 +672,8 @@
$(this).addClass("treetable-selected");
}
}
var _rowData = target.data_obj["id_" + $(this).data('id')];
calculateObjectValue(options, options.onClickRow, [_rowData], _rowData);
}
});
}
@@ -452,26 +686,77 @@
if (_isExpanded || _isCollapsed) {
var tr = $(this).parent().parent();
var row_id = tr.attr("id");
var _ls = target.find("tbody").find("tr[id^='" + row_id + "_']"); //下所有
if (_isExpanded) {
$(this).removeClass(options.expanderExpandedClass);
$(this).addClass(options.expanderCollapsedClass);
if (_ls && _ls.length > 0) {
$.each(_ls, function(index, item) {
$(item).css("display", "none");
});
}
var _id = tr.attr("data-id");
var _ls = target.find("tbody").find("tr[id^='" + row_id + "_']");
if (!options.pagination) {
if (_isExpanded) {
$(this).removeClass(options.expanderExpandedClass);
$(this).addClass(options.expanderCollapsedClass);
if (_ls && _ls.length > 0) {
$.each(_ls, function(index, item) {
$(item).css("display", "none");
});
}
} else {
$(this).removeClass(options.expanderCollapsedClass);
$(this).addClass(options.expanderExpandedClass);
if (_ls && _ls.length > 0) {
$.each(_ls, function(index, item) {
var _p_icon = $("#" + $(item).attr("pid")).children().eq(options.expandColumn).find(".treetable-expander");
var _p_display = $("#" + $(item).attr("pid")).css('display');
if (_p_icon.hasClass(options.expanderExpandedClass) && _p_display == 'table') {
$(item).css("display", "table");
}
});
}
}
} else {
$(this).removeClass(options.expanderCollapsedClass);
$(this).addClass(options.expanderExpandedClass);
var _ls = target.find("tbody").find("tr[id^='" + row_id + "_']");
if (_ls && _ls.length > 0) {
$.each(_ls, function(index, item) {
// 父icon
var _p_icon = $("#" + $(item).attr("pid")).children().eq(options.expandColumn).find(".treetable-expander");
if (_p_icon.hasClass(options.expanderExpandedClass)) {
$(item).css("display", "table");
if (_isExpanded) {
$.each(_ls, function(index, item) {
$(item).css("display", "none");
});
} else {
$.each(_ls, function(index, item) {
var _icon = $(item).eq(options.expandColumn).find(".treetable-expander");
if (_icon && _icon.hasClass(options.expanderExpandedClass)) {
$(item).css("display", "table");
} else {
$(item).css("display", "table");
}
});
}
} else {
if (options.pagination) {
var parms = {};
parms[options.parentCode] = _id;
if (options.dataUrl) {
$.ajax({
type: options.type,
url: options.dataUrl,
data: parms,
dataType: "json",
success: function(data, textStatus, jqXHR) {
$("#" + row_id + "_load").remove();
var list = data;
data = list;
target.appendData(data)
},
error: function(xhr, textStatus) {
var _errorMsg = '<tr><td colspan="' + options.columns.length + '"><div style="display: block;text-align: center;">' + xhr.responseText + '</div></td></tr>'
$("#" + row_id).after(_errorMsg);
}
});
}
});
}
}
if (_isExpanded) {
$(this).removeClass(options.expanderExpandedClass);
$(this).addClass(options.expanderCollapsedClass);
} else {
$(this).removeClass(options.expanderCollapsedClass);
$(this).addClass(options.expanderExpandedClass);
}
}
}
@@ -486,8 +771,12 @@
}
// 添加数据刷新表格
target.appendData = function(data) {
data.reverse()
// 下边的操作主要是为了查询时让一些没有根节点的节点显示
$.each(data, function(i, item) {
if (options.pagination) {
item.__nodes = (item["nodes"] == 1 ? true: false) || ((item["nodes"] == 'true' || item["nodes"] == true) ? true: false);
}
var _data = target.data_obj["id_" + item[options.code]];
var _p_data = target.data_obj["id_" + item[options.parentCode]];
var _c_list = target.data_list["_n_" + item[options.parentCode]];
@@ -509,7 +798,7 @@
}
_lv = _p_data.lv + 1; //如果有父
// 绘制行
tr = renderRow(item, false, _lv, row_id, p_id);
tr = renderRow(item, true, _lv, row_id, p_id, options.pagination, item[options.code]);
var _p_icon = $("#" + _p_data.row_id).children().eq(options.expandColumn).find(".treetable-expander");
var _isExpanded = _p_icon.hasClass(options.expanderExpandedClass);
@@ -531,12 +820,11 @@
} else {
// 计算父的同级下一行
var _tmp_ls = _p_data.row_id.split("_");
var _p_next = _p_data.row_id.substring(0, _p_data.row_id.length - 1) + (parseInt(_tmp_ls[_tmp_ls.length - 1]) + 1);
// 画上
$("#" + _p_next).before(tr);
var _p_next = _p_data.row_id.substring(0, _p_data.row_id.length - (_tmp_ls[_tmp_ls.length - 1] + "").length) + (parseInt(_tmp_ls[_tmp_ls.length - 1]) + 1);
$("#" + _p_data.row_id).after(tr);
}
} else {
tr = renderRow(item, false, _lv, row_id, p_id);
tr = renderRow(item, false, _lv, row_id, p_id, options.pagination, item[options.code]);
if (_data) {
$("#" + _data.row_id).before(tr);
$("#" + _data.row_id).remove();
@@ -660,6 +948,12 @@
}
return defaultValue;
};
var formatRecordsPerPage = function (pageNumber) {
return '每页显示 ' + pageNumber + ' 条记录';
};
var formatShowingRows = function (pageFrom, pageTo, totalRows) {
return '显示第 ' + pageFrom + ' 到第 ' + pageTo + ' 条记录,总共 ' + totalRows + ' 条记录。';
};
// 初始化
init();
return target;
@@ -732,12 +1026,12 @@
$.fn.bootstrapTreeTable.defaults = {
code: 'code', // 选取记录返回的值,用于设置父子关系
parentCode: 'parentCode', // 用于设置父子关系
rootIdValue: null, // 设置根节点id值----可指定根节点,默认为null,"",0,"0"
rootIdValue: 0, // 设置根节点id值----可指定根节点,默认为null,"",0,"0"
data: null, // 构造table的数据集合
type: "GET", // 请求数据的ajax类型
url: null, // 请求数据的ajax的url
ajaxParams: {}, // 请求数据的ajax的data属性
expandColumn: 0, // 在哪一列上面显示展开按钮
expandColumn: 1, // 在哪一列上面显示展开按钮
expandAll: false, // 是否全部展开
expandFirst: true, // 是否默认第一级展开--expandAll为false时生效
striped: false, // 是否各行渐变色
@@ -747,11 +1041,19 @@
columns: [], // 列
toolbar: null, // 顶部工具条
height: 0, // 表格高度
pagination: false, // 是否显示分页
dataUrl: null, // 加载子节点异步请求数据url
pageNumber: 1, // 当前页条数
pageSize: 10, // 每页的记录行数
onClickRow: null, // 单击某行事件
pageList: [10, 25, 50], // 可供选择的每页的行数
showTitle: true, // 是否采用title属性显示字段内容(被formatter格式化的字段不会显示)
showSearch: true, // 是否显示检索信息
showColumns: true, // 是否显示内容列下拉框
showRefresh: true, // 是否显示刷新按钮
expanderExpandedClass: 'glyphicon glyphicon-chevron-down', // 展开的按钮的图标
paginationPreText: '&lsaquo;',
paginationNextText: '&rsaquo;',
expanderExpandedClass: 'glyphicon glyphicon-chevron-down', // 展开的按钮的图标
expanderCollapsedClass: 'glyphicon glyphicon-chevron-right', // 缩起的按钮的图标
responseHandler: function(res) {
return false;
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -8,7 +8,7 @@ $(document).ready(function(){
//手机号码验证身份证正则合并:(^\d{15}$)|(^\d{17}([0-9]|X)$)
jQuery.validator.addMethod("isPhone",function(value,element){
var length = value.length;
var phone=/^1[3|4|5|6|7|8|9][0-9]\d{8}$/;
var phone=/^1[3-9]\d{9}$/;
return this.optional(element)||(length == 11 && phone.test(value));
},"请填写正确的11位手机号");
//电话号码验证
@@ -31,7 +31,12 @@ $(document).ready(function(){
jQuery.validator.addMethod("isIdentity",function(value,element){
var id= /^(\d{15}$|^\d{18}$|^\d{17}(\d|X))$/;
return this.optional(element) || (id.test(value));
},"请输入正确的15或18位身份证号,末尾大写X");
},"请输入正确的15或18位身份证号,末尾若为X请大写");
//校验二代身份证
jQuery.validator.addMethod("isIdentity18",function(value,element){
var id= /^(^\d{17}(\d|X))$/;
return this.optional(element) || (id.test(value));
},"请输入正确的18位身份证号,末尾若为X请大写");
//校验出生日期
jQuery.validator.addMethod("isBirth",function(value,element){
var birth = /^(19|20)\d{2}-(1[0-2]|0?[1-9])-(0?[1-9]|[1-2][0-9]|3[0-1])$/;
File diff suppressed because one or more lines are too long
@@ -726,8 +726,8 @@ body.canvas-menu.mini-navbar nav.navbar-static-side {
}
.btn-success:hover, .btn-success:focus, .btn-success:active, .btn-success.active, .open .dropdown-toggle.btn-success {
background-color: #1a7bb9;
border-color: #1a7bb9;
background-color: #1a7bb9 !important;
border-color: #1a7bb9 !important;
color: #FFFFFF;
}
@@ -3344,6 +3344,21 @@ nav.page-tabs .page-tabs-content {
overflow: hidden;
}
.tagsview-hide#content-main {
height: calc(100% - 88px);
overflow: hidden;
}
.footer-hide#content-main {
height: calc(100% - 91px);
overflow: hidden;
}
.tagsview-footer-hide#content-main {
height: calc(100% - 52px);
overflow: hidden;
}
.fixed-nav #content-main {
height: calc(100% - 80px);
overflow: hidden;
File diff suppressed because one or more lines are too long
@@ -8,6 +8,7 @@ user.password.retry.limit.exceed=密码输入错误{0}次,帐户锁定10分钟
user.password.delete=对不起,您的账号已被删除
user.blocked=用户已封禁,请联系管理员
role.blocked=角色已封禁,请联系管理员
login.blocked=很遗憾,访问IP已被列入系统黑名单
user.logout.success=退出成功
length.not.valid=长度必须在{min}到{max}个字符之间
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1,120 +1,10 @@
/*
* metismenu - v1.1.3
* Easy menu jQuery plugin for Twitter Bootstrap 3
* metismenu - v2.0.2
* A jQuery menu plugin
* https://github.com/onokumus/metisMenu
*
* Made by Osman Nuri Okumus
* Under MIT License
*/
;(function($, window, document, undefined) {
var pluginName = "metisMenu",
defaults = {
toggle: true,
doubleTapToGo: false
};
function Plugin(element, options) {
this.element = $(element);
this.settings = $.extend({}, defaults, options);
this._defaults = defaults;
this._name = pluginName;
this.init();
}
Plugin.prototype = {
init: function() {
var $this = this.element,
$toggle = this.settings.toggle,
obj = this;
if (this.isIE() <= 9) {
$this.find("li.active").has("ul").children("ul").collapse("show");
$this.find("li").not(".active").has("ul").children("ul").collapse("hide");
} else {
$this.find("li.active").has("ul").children("ul").addClass("collapse in");
$this.find("li").not(".active").has("ul").children("ul").addClass("collapse");
}
//add the "doubleTapToGo" class to active items if needed
if (obj.settings.doubleTapToGo) {
$this.find("li.active").has("ul").children("a").addClass("doubleTapToGo");
}
$this.find("li").has("ul").children("a").on("click" + "." + pluginName, function(e) {
e.preventDefault();
//Do we need to enable the double tap
if (obj.settings.doubleTapToGo) {
//if we hit a second time on the link and the href is valid, navigate to that url
if (obj.doubleTapToGo($(this)) && $(this).attr("href") !== "#" && $(this).attr("href") !== "") {
e.stopPropagation();
document.location = $(this).attr("href");
return;
}
}
$(this).parent("li").toggleClass("active").children("ul").collapse("toggle");
if ($toggle) {
$(this).parent("li").siblings().removeClass("active").children("ul.in").collapse("hide");
}
});
},
isIE: function() { //https://gist.github.com/padolsey/527683
var undef,
v = 3,
div = document.createElement("div"),
all = div.getElementsByTagName("i");
while (
div.innerHTML = "<!--[if gt IE " + (++v) + "]><i></i><![endif]-->",
all[0]
) {
return v > 4 ? v : undef;
}
},
//Enable the link on the second click.
doubleTapToGo: function(elem) {
var $this = this.element;
//if the class "doubleTapToGo" exists, remove it and return
if (elem.hasClass("doubleTapToGo")) {
elem.removeClass("doubleTapToGo");
return true;
}
//does not exists, add a new class and return false
if (elem.parent().children("ul").length) {
//first remove all other class
$this.find(".doubleTapToGo").removeClass("doubleTapToGo");
//add the class on the current element
elem.addClass("doubleTapToGo");
return false;
}
},
remove: function() {
this.element.off("." + pluginName);
this.element.removeData(pluginName);
}
};
$.fn[pluginName] = function(options) {
this.each(function () {
var el = $(this);
if (el.data(pluginName)) {
el.data(pluginName).remove();
}
el.data(pluginName, new Plugin(this, options));
});
return this;
};
})(jQuery, window, document);
!function(a){"use strict";function b(){var a=document.createElement("mm"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}function c(b){return this.each(function(){var c=a(this),d=c.data("mm"),f=a.extend({},e.DEFAULTS,c.data(),"object"==typeof b&&b);d||c.data("mm",d=new e(this,f)),"string"==typeof b&&d[b]()})}a.fn.emulateTransitionEnd=function(b){var c=!1,e=this;a(this).one("mmTransitionEnd",function(){c=!0});var f=function(){c||a(e).trigger(d.end)};return setTimeout(f,b),this};var d=b();d&&(a.event.special.mmTransitionEnd={bindType:d.end,delegateType:d.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}});var e=function(b,c){this.$element=a(b),this.options=a.extend({},e.DEFAULTS,c),this.transitioning=null,this.init()};e.TRANSITION_DURATION=350,e.DEFAULTS={toggle:!0,doubleTapToGo:!1,activeClass:"active"},e.prototype.init=function(){var b=this,c=this.options.activeClass;this.$element.find("li."+c).has("ul").children("ul").addClass("collapse in"),this.$element.find("li").not("."+c).has("ul").children("ul").addClass("collapse"),this.options.doubleTapToGo&&this.$element.find("li."+c).has("ul").children("a").addClass("doubleTapToGo"),this.$element.find("li").has("ul").children("a").on("click.metisMenu",function(d){var e=a(this),f=e.parent("li"),g=f.children("ul");return d.preventDefault(),f.hasClass(c)?b.hide(g):b.show(g),b.options.doubleTapToGo&&b.doubleTapToGo(e)&&"#"!==e.attr("href")&&""!==e.attr("href")?(d.stopPropagation(),void(document.location=e.attr("href"))):void 0})},e.prototype.doubleTapToGo=function(a){var b=this.$element;return a.hasClass("doubleTapToGo")?(a.removeClass("doubleTapToGo"),!0):a.parent().children("ul").length?(b.find(".doubleTapToGo").removeClass("doubleTapToGo"),a.addClass("doubleTapToGo"),!1):void 0},e.prototype.show=function(b){var c=this.options.activeClass,f=a(b),g=f.parent("li");if(!this.transitioning&&!f.hasClass("in")){g.addClass(c),this.options.toggle&&this.hide(g.siblings().children("ul.in")),f.removeClass("collapse").addClass("collapsing").height(0),this.transitioning=1;var h=function(){f.removeClass("collapsing").addClass("collapse in").height(""),this.transitioning=0};return d?void f.one("mmTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(e.TRANSITION_DURATION).height(f[0].scrollHeight):h.call(this)}},e.prototype.hide=function(b){var c=this.options.activeClass,f=a(b);if(!this.transitioning&&f.hasClass("in")){f.parent("li").removeClass(c),f.height(f.height())[0].offsetHeight,f.addClass("collapsing").removeClass("collapse").removeClass("in"),this.transitioning=1;var g=function(){this.transitioning=0,f.removeClass("collapsing").addClass("collapse")};return d?void f.height(0).one("mmTransitionEnd",a.proxy(g,this)).emulateTransitionEnd(e.TRANSITION_DURATION):g.call(this)}};var f=a.fn.metisMenu;a.fn.metisMenu=c,a.fn.metisMenu.Constructor=e,a.fn.metisMenu.noConflict=function(){return a.fn.metisMenu=f,this}}(jQuery);
File diff suppressed because one or more lines are too long
@@ -338,7 +338,7 @@ label.error {
.input-group label.error {
z-index:99;
right: 42px
right: 42px;
}
.input-group input.error + label.error + .input-group-addon>i {
@@ -347,10 +347,14 @@ label.error {
.input-group.date label.error {
z-index:99;
right: 3px
right: 42px;
}
.Validform_error,input.error,textarea.error,select.error {
.select2-hidden-accessible + label.error {
right: 38px;
}
.Validform_error,input.error,textarea.error,select.error,label.error+.select2-container--bootstrap .select2-selection--single {
background-color: #fbe2e2;
border-color: #c66161;
color: #c00
@@ -508,7 +512,7 @@ div.ztree-border {
left: calc(100% - 20px);
background-color: #33cabb
}
.toggle-switch.switch-solid span {
height: 20px;
}
@@ -843,7 +847,7 @@ label {
.table-bordered table>thead>tr>th:first-child, .table-bordered table>tbody>tr>td:first-child {
border-left: 1px solid #ddd;
}
.table-bordered table>thead>tr>th:last-child, .table-bordered table>tbody>tr>td:last-child {
border-right: 1px solid #ddd;
}
@@ -872,7 +876,7 @@ label {
background-color: #eff3f8;
}
.fixed-table-container thead th >.both{
.fixed-table-container thead th >.both{
display: inline-block
}
@@ -908,6 +912,9 @@ table.rc-table-resizing thead > th > a {
background-color: #fff;
box-sizing: border-box;
z-index: 1;
border-width: 0 0 0 1px;
-webkit-box-shadow: 0 0 10px rgba(0,0,0,.12);
box-shadow: 0 0 10px rgba(0,0,0,.12);
}
.fixed-columns {
@@ -948,6 +955,7 @@ table.rc-table-resizing thead > th > a {
.bootstrap-tree-table .table{border-bottom: 0px solid #e7eaec!important;}
.bootstrap-tree-table .table-bordered .treetable-thead th {border-left: 1px solid #e7eaec!important;}
.bootstrap-tree-table .table-bordered .treetable-tbody td {border-right: 1px solid #e7eaec!important;}
.bootstrap-tree-table .fixed-table-pagination .pagination-detail {margin-top: 10px;margin-bottom: 10px;}
/** 首页样式 **/
.ax_close_max {
@@ -1036,12 +1044,12 @@ table.rc-table-resizing thead > th > a {
}
/** 表格列拖拽样式 **/
.dragtable-sortable {
.dragtable-sortable {
list-style-type: none; margin: 0; padding: 0; -moz-user-select: none;
}
.dragtable-sortable li {
margin: 0; padding: 0; float: left; font-size: 1em; background: white;
margin: 0; padding: 0; float: left; font-size: 1em; background: white;
}
.dragtable-sortable th, .dragtable-sortable td{
@@ -1049,26 +1057,26 @@ table.rc-table-resizing thead > th > a {
}
.dragtable-sortable li:first-child th, .dragtable-sortable li:first-child td {
border-left: 1px solid #CCC;
border-left: 1px solid #CCC;
}
.ui-sortable-helper {
opacity: 0.7;filter: alpha(opacity=70);
}
.ui-sortable-placeholder {
.ui-sortable-placeholder {
-moz-box-shadow: 4px 5px 4px #C6C6C6 inset;
-webkit-box-shadow: 4px 5px 4px #C6C6C6 inset;
box-shadow: 4px 5px 4px #C6C6C6 inset;
border-bottom: 1px solid #CCCCCC;
border-top: 1px solid #CCCCCC;
visibility: visible !important;
background: #EFEFEF !important;
background: #EFEFEF !important;
visibility: visible !important;
}
.ui-sortable-placeholder * {
opacity: 0.0; visibility: hidden;
.ui-sortable-placeholder * {
opacity: 0.0; visibility: hidden;
}
/** 表格选中样式 **/
@@ -262,7 +262,7 @@ $(function() {
// 获取标识数据
var dataUrl = $(this).attr('href'),
dataIndex = $(this).data('index'),
menuName = $.trim($(this).text()),
menuName = $(this).data('title') || $.trim($(this).text()),
isRefresh = $(this).data("refresh"),
flag = true;
@@ -306,10 +306,10 @@ $(function() {
$('.menuTab').removeClass('active');
// 添加选项卡对应的iframe
var str1 = '<iframe class="RuoYi_iframe" name="iframe' + dataIndex + '" width="100%" height="100%" src="' + dataUrl + '" frameborder="0" data-id="' + dataUrl + '" seamless></iframe>';
var str1 = '<iframe class="RuoYi_iframe" name="iframe' + dataIndex + '" width="100%" height="100%" src="' + dataUrl + '" frameborder="0" data-id="' + dataUrl + '" data-refresh="' + isRefresh + '" seamless></iframe>';
$('.mainContent').find('iframe.RuoYi_iframe').hide().parents('.mainContent').append(str1);
$.modal.loading("数据加载中,请稍...");
$.modal.loading("数据加载中,请稍...");
$('.mainContent iframe:visible').on('load', function() {
$.modal.closeLoading();
@@ -434,15 +434,20 @@ $(function() {
function activeTab() {
if (!$(this).hasClass('active')) {
var currentId = $(this).data('id');
var isRefresh = false;
syncMenuTab(currentId);
// 显示tab对应的内容区
$('.mainContent .RuoYi_iframe').each(function() {
if ($(this).data('id') == currentId) {
$(this).show().siblings('.RuoYi_iframe').hide();
isRefresh = $.common.nullToDefault($(this).data('refresh'), false);
return false;
}
});
$(this).addClass('active').siblings('.menuTab').removeClass('active');
if (isRefresh) {
refreshTab();
}
scrollToTab(this);
}
}
@@ -601,7 +606,7 @@ $(function() {
callback: function(key, opt) {
setActiveTab(this);
this.nextAll('.menuTab').each(function() {
$('.menuTab[data-id="' + $(this).data('id') + '"]').remove();
$('.RuoYi_iframe[data-id="' + $(this).data('id') + '"]').remove();
$(this).remove();
});
}
@@ -630,7 +635,7 @@ $(function() {
setActiveTab(this);
var target = $('.RuoYi_iframe[data-id="' + this.data('id') + '"]');
var url = target.attr('src');
$.modal.loading("数据加载中,请稍...");
$.modal.loading("数据加载中,请稍...");
target.attr('src', url).on('load', function() {
$.modal.closeLoading();
});
@@ -645,5 +650,5 @@ $(function() {
}
},
}
})
});
});
@@ -68,6 +68,7 @@ $(function() {
endLayDate.config.min.month = '';
endLayDate.config.min.date = '';
}
$('#endTime').trigger('click');
}
});
endLayDate = laydate.render({
@@ -289,7 +290,7 @@ function createMenuItem(dataUrl, menuName, isRefresh) {
var str1 = '<iframe class="RuoYi_iframe" name="iframe' + dataIndex + '" width="100%" height="100%" src="' + dataUrl + '" frameborder="0" data-id="' + dataUrl + '" data-panel="' + panelUrl + '" seamless></iframe>';
$('.mainContent', topWindow).find('iframe.RuoYi_iframe').hide().parents('.mainContent').append(str1);
window.parent.$.modal.loading("数据加载中,请稍...");
window.parent.$.modal.loading("数据加载中,请稍...");
$('.mainContent iframe:visible', topWindow).on('load', function() {
window.parent.$.modal.closeLoading();
});
@@ -351,8 +352,10 @@ function calSumWidth(elements) {
function activeWindow() {
var topWindow = $(window.parent.document);
var currentId = $('.page-tabs-content', topWindow).find('.active').attr('data-id');
var activeWindow = $('.RuoYi_iframe[data-id="' + currentId + '"]', topWindow)[0].contentWindow;
return activeWindow;
if (!currentId) {
return window.parent;
}
return $('.RuoYi_iframe[data-id="' + currentId + '"]', topWindow)[0].contentWindow;
}
/** 密码规则范围验证 */
@@ -381,6 +384,32 @@ function checkpwd(chrtype, password) {
return true;
}
/** 开始时间/时分秒 */
function beginOfTime(date) {
if($.common.isNotEmpty(date)) {
return $.common.sprintf("%s 00:00:00", date);
}
}
/** 结束时间/时分秒 */
function endOfTime(date) {
if($.common.isNotEmpty(date)) {
return $.common.sprintf("%s 23:59:59", date);
}
}
/** 重置日期/年月日 */
function resetDate() {
if ($.common.isNotEmpty(startLayDate) && $.common.isNotEmpty(endLayDate)) {
endLayDate.config.min.year = '';
endLayDate.config.min.month = '';
endLayDate.config.min.date = '';
startLayDate.config.max.year = '2099';
startLayDate.config.max.month = '12';
startLayDate.config.max.date = '31';
}
}
// 日志打印封装处理
var log = {
log: function(msg) {
@@ -415,7 +444,7 @@ var storage = {
// 主子表操作封装处理
var sub = {
editColumn: function() {
editRow: function() {
var dataColumns = [];
for (var columnIndex = 0; columnIndex < table.options.columns.length; columnIndex++) {
if (table.options.columns[columnIndex].visible != false) {
@@ -426,7 +455,7 @@ var sub = {
var data = $("#" + table.options.id).bootstrapTable('getData');
var count = data.length;
for (var dataIndex = 0; dataIndex < count; dataIndex++) {
var columns = $('#' + table.options.id + ' tr[data-index="' + dataIndex + '"] td');
var columns = $('#' + table.options.id + ' tr[data-index="' + dataIndex + '"] td:visible');
var obj = new Object();
for (var i = 0; i < columns.length; i++) {
var inputValue = $(columns[i]).find('input');
@@ -440,7 +469,11 @@ var sub = {
} else if ($.common.isNotEmpty(textareaValue.val())) {
obj[key] = textareaValue.val();
} else {
obj[key] = "";
if (key == "index" && $.common.isNotEmpty(data[dataIndex].index)) {
obj[key] = data[dataIndex].index;
} else {
obj[key] = "";
}
}
}
var item = data[dataIndex];
@@ -449,8 +482,8 @@ var sub = {
}
$("#" + table.options.id).bootstrapTable("updateRow", params);
},
delColumn: function(column) {
sub.editColumn();
delRow: function(column) {
sub.editRow();
var subColumn = $.common.isEmpty(column) ? "index" : column;
var ids = $.table.selectColumns(subColumn);
if (ids.length == 0) {
@@ -459,15 +492,18 @@ var sub = {
}
$("#" + table.options.id).bootstrapTable('remove', { field: subColumn, values: ids });
},
addColumn: function(row, tableId) {
delRowByIndex: function(value, tableId) {
var currentId = $.common.isEmpty(tableId) ? table.options.id : tableId;
sub.editRow();
$("#" + currentId).bootstrapTable('remove', { field: "index", values: [value] });
sub.editRow();
},
addRow: function(row, tableId) {
var currentId = $.common.isEmpty(tableId) ? table.options.id : tableId;
table.set(currentId);
var count = $("#" + currentId).bootstrapTable('getData').length;
sub.editColumn();
$("#" + currentId).bootstrapTable('insertRow', {
index: count + 1,
row: row
});
sub.editRow();
$("#" + currentId).bootstrapTable('insertRow', { index: count + 1, row: row });
}
};
@@ -490,6 +526,44 @@ function loadJs(file, headElem) {
else document.getElementsByTagName('head')[0].appendChild(script);
}
// 禁止后退键(Backspace
window.onload = function() {
document.getElementsByTagName("body")[0].onkeydown = function() {
// 获取事件对象
var elem = event.relatedTarget || event.srcElement || event.target || event.currentTarget;
// 判断按键为backSpace键
if (event.keyCode == 8) {
// 判断是否需要阻止按下键盘的事件默认传递
var name = elem.nodeName;
var className = elem.className;
// 屏蔽特定的样式名称
if (className.indexOf('note-editable') != -1)
{
return true;
}
if (name != 'INPUT' && name != 'TEXTAREA') {
return _stopIt(event);
}
var type_e = elem.type.toUpperCase();
if (name == 'INPUT' && (type_e != 'TEXT' && type_e != 'TEXTAREA' && type_e != 'PASSWORD' && type_e != 'FILE' && type_e != 'SEARCH' && type_e != 'NUMBER' && type_e != 'EMAIL' && type_e != 'URL')) {
return _stopIt(event);
}
if (name == 'INPUT' && (elem.readOnly == true || elem.disabled == true)) {
return _stopIt(event);
}
}
};
};
function _stopIt(e) {
if (e.returnValue) {
e.returnValue = false;
}
if (e.preventDefault) {
e.preventDefault();
}
return false;
}
/** 设置全局ajax处理 */
$.ajaxSetup({
complete: function(XMLHttpRequest, textStatus) {
@@ -10,8 +10,8 @@ var table = {
options: {},
// 设置实例配置
set: function(id) {
if($.common.getLength(table.config) > 1) {
var tableId = $.common.isEmpty(id) ? $(event.currentTarget).parents(".bootstrap-table").find("table.table").attr("id") : id;
if ($.common.getLength(table.config) > 1 && $.common.isNotEmpty(event)) {
var tableId = $.common.isEmpty(id) ? $(event.currentTarget).parents(".bootstrap-table").find("table.table").attr("id") || $(event.currentTarget).parents(".bootstrap-tree-table").find("table.table").attr("id") : id;
if ($.common.isNotEmpty(tableId)) {
table.options = table.get(tableId);
}
@@ -73,7 +73,7 @@ var table = {
fixedNumber: 0,
fixedRightNumber: 0,
queryParams: $.table.queryParams,
rowStyle: undefined,
rowStyle: undefined
};
var options = $.extend(defaults, options);
table.options = options;
@@ -163,6 +163,7 @@ var table = {
},
// 查询条件
queryParams: function(params) {
table.set();
var curParams = {
// 传递参数查询参数
pageSize: params.limit,
@@ -179,14 +180,15 @@ var table = {
if (typeof table.get(this.id).responseHandler == "function") {
table.get(this.id).responseHandler(res);
}
var thisOptions = table.config[this.id];
if (res.code == web_status.SUCCESS) {
if ($.common.isNotEmpty(table.options.sidePagination) && table.options.sidePagination == 'client') {
if ($.common.isNotEmpty(thisOptions.sidePagination) && thisOptions.sidePagination == 'client') {
return res.rows;
} else {
if ($.common.isNotEmpty(table.options.rememberSelected) && table.options.rememberSelected) {
var column = $.common.isEmpty(table.options.uniqueId) ? table.options.columns[1].field : table.options.uniqueId;
if ($.common.isNotEmpty(thisOptions.rememberSelected) && thisOptions.rememberSelected) {
var column = $.common.isEmpty(thisOptions.uniqueId) ? thisOptions.columns[1].field : thisOptions.uniqueId;
$.each(res.rows, function(i, row) {
row.state = $.inArray(row[column], table.rememberSelectedIds[table.options.id]) !== -1;
row.state = $.inArray(row[column], table.rememberSelectedIds[thisOptions.id]) !== -1;
})
}
return { rows: res.rows, total: res.total };
@@ -219,13 +221,13 @@ var table = {
if ($.common.isNotEmpty(table.options.rememberSelected) && table.options.rememberSelected) {
func = $.inArray(e.type, ['check', 'check-all']) > -1 ? 'union' : 'difference';
var selectedIds = table.rememberSelectedIds[table.options.id];
if($.common.isNotEmpty(selectedIds)) {
if ($.common.isNotEmpty(selectedIds)) {
table.rememberSelectedIds[table.options.id] = _[func](selectedIds, rowIds);
} else {
table.rememberSelectedIds[table.options.id] = _[func]([], rowIds);
}
var selectedRows = table.rememberSelecteds[table.options.id];
if($.common.isNotEmpty(selectedRows)) {
if ($.common.isNotEmpty(selectedRows)) {
table.rememberSelecteds[table.options.id] = _[func](selectedRows, rows);
} else {
table.rememberSelecteds[table.options.id] = _[func]([], rows);
@@ -247,7 +249,7 @@ var table = {
$(optionsIds).off("click").on("click", '.img-circle', function() {
var src = $(this).attr('src');
var target = $(this).data('target');
if($.common.equals("self", target)) {
if ($.common.equals("self", target)) {
var height = $(this).data('height');
var width = $(this).data('width');
top.layer.open({
@@ -298,6 +300,9 @@ var table = {
var tableParams = $("#" + currentId).bootstrapTable('getOptions');
var pageSize = $.common.isNotEmpty(tableParams.pageSize) ? tableParams.pageSize: table.options.pageSize;
var pageNumber = $.common.isNotEmpty(tableParams.pageNumber) ? tableParams.pageNumber: table.options.pageNumber;
if (table.options.sidePagination == 'client') {
return index + 1;
}
return pageSize * (pageNumber - 1) + index + 1;
},
// 列超出指定长度浮动提示 target(copy单击复制文本 open弹窗打开文本)
@@ -358,7 +363,7 @@ var table = {
if ($.common.isNotEmpty(pageSize)) {
params.pageSize = pageSize;
}
if($.common.isNotEmpty(tableId)){
if ($.common.isNotEmpty(tableId)){
$("#" + tableId).bootstrapTable('refresh', params);
} else{
$("#" + table.options.id).bootstrapTable('refresh', params);
@@ -373,7 +378,7 @@ var table = {
var dataParam = $("#" + currentId).serializeArray();
dataParam.push({ "name": "orderByColumn", "value": params.sortName });
dataParam.push({ "name": "isAsc", "value": params.sortOrder });
$.modal.loading("正在导出数据,请稍...");
$.modal.loading("正在导出数据,请稍...");
$.post(table.options.exportUrl, dataParam, function(result) {
if (result.code == web_status.SUCCESS) {
window.location.href = ctx + "common/download?fileName=" + encodeURI(result.msg) + "&delete=" + true;
@@ -447,6 +452,9 @@ var table = {
$.modal.enable();
$.modal.alertError(result.msg);
}
},
complete: function () {
layero.find('#file').val('');
}
});
}
@@ -485,7 +493,7 @@ var table = {
});
if ($.common.isNotEmpty(table.options.rememberSelected) && table.options.rememberSelected) {
var selectedRows = table.rememberSelecteds[table.options.id];
if($.common.isNotEmpty(selectedRows)) {
if ($.common.isNotEmpty(selectedRows)) {
rows = $.map(table.rememberSelecteds[table.options.id], function (row) {
return $.common.getItemField(row, column);
});
@@ -514,7 +522,7 @@ var table = {
});
if ($.common.isNotEmpty(table.options.rememberSelected) && table.options.rememberSelected) {
var selectedRows = table.rememberSelecteds[table.options.id];
if($.common.isNotEmpty(selectedRows)) {
if ($.common.isNotEmpty(selectedRows)) {
rows = $.map(selectedRows, function (row) {
return $.common.getItemField(row, table.options.columns[1].field);
});
@@ -535,6 +543,9 @@ var table = {
return false;
}
});
if (actions.length === 0) {
actions.push($.common.sprintf("<span>%s</span>", value))
}
return actions.join('');
},
// 回显数据字典(字符串数组)
@@ -545,13 +556,18 @@ var table = {
var currentSeparator = $.common.isEmpty(separator) ? "," : separator;
var actions = [];
$.each(value.split(currentSeparator), function(i, val) {
var match = false
$.each(datas, function(index, dict) {
if (dict.dictValue == ('' + val)) {
var listClass = $.common.equals("default", dict.listClass) || $.common.isEmpty(dict.listClass) ? "" : "badge badge-" + dict.listClass;
actions.push($.common.sprintf("<span class='%s'>%s </span>", listClass, dict.dictLabel));
actions.push($.common.sprintf("<span class='%s'>%s</span>", listClass, dict.dictLabel));
match = true
return false;
}
});
if (!match) {
actions.push($.common.sprintf("<span> %s </span>", val));
}
});
return actions.join('');
},
@@ -584,10 +600,13 @@ var table = {
id: "bootstrap-tree-table",
type: 1, // 0 代表bootstrapTable 1代表bootstrapTreeTable
height: 0,
rootIdValue: null,
rootIdValue: 0,
ajaxParams: {},
toolbar: "toolbar",
striped: false,
pagination: false,
pageSize: 10,
pageList: [10, 25, 50],
expandColumn: 1,
showSearch: true,
showRefresh: true,
@@ -608,6 +627,10 @@ var table = {
ajaxParams: options.ajaxParams, // 请求数据的ajax的data属性
rootIdValue: options.rootIdValue, // 设置指定根节点id值
height: options.height, // 表格树的高度
pagination: options.pagination, // 是否显示分页
dataUrl: options.dataUrl, // 加载子节点异步请求数据url
pageSize: options.pageSize, // 每页的记录行数
pageList: options.pageList, // 可供选择的每页的行数
expandColumn: options.expandColumn, // 在哪一列上面显示展开按钮
striped: options.striped, // 是否显示行间隔色
bordered: options.bordered, // 是否显示边框
@@ -618,6 +641,7 @@ var table = {
expandAll: options.expandAll, // 是否全部展开
expandFirst: options.expandFirst, // 是否默认第一级展开--expandAll为false时生效
columns: options.columns, // 显示列信息(*
onClickRow: options.onClickRow, // 单击某行事件
responseHandler: $.treeTable.responseHandler, // 在加载服务器发送来的数据之前处理函数
onLoadSuccess: $.treeTable.onLoadSuccess // 当所有数据被加载时触发处理函数
});
@@ -626,7 +650,7 @@ var table = {
search: function(formId) {
var currentId = $.common.isEmpty(formId) ? $('form').attr('id') : formId;
var params = $.common.formToJSON(currentId);
$.bttTable.bootstrapTreeTable('refresh', params);
$.bttTable.bootstrapTreeTable('refresh', $.extend(params, table.options.ajaxParams));
},
// 刷新
refresh: function() {
@@ -670,24 +694,15 @@ var table = {
var tableId = $.common.isEmpty(tableId) ? table.options.id : tableId;
if (table.options.type == table_type.bootstrapTable) {
var params = $("#" + tableId).bootstrapTable('getOptions');
if ($.common.isNotEmpty(pageNumber)) {
params.pageNumber = pageNumber;
}
params.pageNumber = 1;
if ($.common.isNotEmpty(pageSize)) {
params.pageSize = pageSize;
}
$("#" + tableId).bootstrapTable('refresh', params);
} else if (table.options.type == table_type.bootstrapTreeTable) {
$("#" + tableId).bootstrapTreeTable('refresh', []);
$("#" + tableId).bootstrapTreeTable('refresh', table.options.ajaxParams);
}
if ($.common.isNotEmpty(startLayDate) && $.common.isNotEmpty(endLayDate)) {
endLayDate.config.min.year = '';
endLayDate.config.min.month = '';
endLayDate.config.min.date = '';
startLayDate.config.max.year = '2099';
startLayDate.config.max.month = '12';
startLayDate.config.max.date = '31';
}
resetDate();
},
// 获取选中复选框项
selectCheckeds: function(name) {
@@ -788,7 +803,7 @@ var table = {
},
// 获取iframe页的DOM
getChildFrame: function (index) {
if($.common.isEmpty(index)){
if ($.common.isEmpty(index)){
var index = parent.layer.getFrameIndex(window.name);
return parent.layer.getChildFrame('body', index);
} else {
@@ -797,7 +812,7 @@ var table = {
},
// 关闭窗体
close: function (index) {
if($.common.isEmpty(index)){
if ($.common.isEmpty(index)){
var index = parent.layer.getFrameIndex(window.name);
parent.layer.close(index);
} else {
@@ -859,6 +874,9 @@ var table = {
yes: callback,
cancel: function(index) {
return true;
},
success: function () {
$(':focus').blur();
}
});
},
@@ -880,7 +898,7 @@ var table = {
}
}
var btnCallback = {};
if(options.btn instanceof Array){
if (options.btn instanceof Array){
for (var i = 1, len = options.btn.length; i < len; i++) {
var btn = options["btn" + (i + 1)];
if (btn) {
@@ -889,6 +907,8 @@ var table = {
}
}
var index = top.layer.open($.extend({
id: options.id, // 唯一id
anim: options.anim, // 弹出动画 0-6
type: 2,
maxmin: $.common.isEmpty(options.maxmin) ? true : options.maxmin,
shade: 0.3,
@@ -903,10 +923,13 @@ var table = {
yes: options.yes,
cancel: function () {
return true;
},
success: function () {
$(':focus').blur();
}
}, btnCallback));
if ($.common.isNotEmpty(options.full) && options.full === true) {
layer.full(index);
top.layer.full(index);
}
},
// 弹出层全屏
@@ -946,6 +969,9 @@ var table = {
},
cancel: function(index) {
return true;
},
success: function () {
$(':focus').blur();
}
});
top.layer.full(index);
@@ -999,7 +1025,7 @@ var table = {
dataType: dataType,
data: data,
beforeSend: function () {
$.modal.loading("正在处理中,请稍...");
$.modal.loading("正在处理中,请稍...");
},
success: function(result) {
if (typeof callback == "function") {
@@ -1060,7 +1086,7 @@ var table = {
table.set();
$.modal.confirm("确定删除该条" + table.options.modalName + "信息吗?", function() {
var url = $.common.isEmpty(id) ? table.options.removeUrl : table.options.removeUrl.replace("{id}", id);
if(table.options.type == table_type.bootstrapTreeTable) {
if (table.options.type == table_type.bootstrapTreeTable) {
$.operate.get(url);
} else {
var data = { "ids": id };
@@ -1113,7 +1139,7 @@ var table = {
// 修改信息
edit: function(id) {
table.set();
if($.common.isEmpty(id) && table.options.type == table_type.bootstrapTreeTable) {
if ($.common.isEmpty(id) && table.options.type == table_type.bootstrapTreeTable) {
var row = $("#" + table.options.id).bootstrapTreeTable('getSelections')[0];
if ($.common.isEmpty(row)) {
$.modal.alertWarning("请至少选择一条记录");
@@ -1137,7 +1163,7 @@ var table = {
if ($.common.isNotEmpty(id)) {
url = table.options.updateUrl.replace("{id}", id);
} else {
if(table.options.type == table_type.bootstrapTreeTable) {
if (table.options.type == table_type.bootstrapTreeTable) {
var row = $("#" + table.options.id).bootstrapTreeTable('getSelections')[0];
if ($.common.isEmpty(row)) {
$.modal.alertWarning("请至少选择一条记录");
@@ -1174,7 +1200,7 @@ var table = {
dataType: "json",
data: data,
beforeSend: function () {
$.modal.loading("正在处理中,请稍...");
$.modal.loading("正在处理中,请稍...");
$.modal.disable();
},
success: function(result) {
@@ -1194,7 +1220,7 @@ var table = {
dataType: "json",
data: data,
beforeSend: function () {
$.modal.loading("正在处理中,请稍...");
$.modal.loading("正在处理中,请稍...");
},
success: function(result) {
if (typeof callback == "function") {
@@ -1220,7 +1246,7 @@ var table = {
dataType: "json",
data: data,
beforeSend: function () {
$.modal.loading("正在处理中,请稍...");
$.modal.loading("正在处理中,请稍...");
},
success: function(result) {
if (typeof callback == "function") {
@@ -1263,7 +1289,7 @@ var table = {
successCallback: function(result) {
if (result.code == web_status.SUCCESS) {
var parent = activeWindow();
if($.common.isEmpty(parent.table)) {
if ($.common.isEmpty(parent.table)) {
$.modal.msgSuccessReload(result.msg);
} else if (parent.table.options.type == table_type.bootstrapTable) {
$.modal.close();
@@ -1287,15 +1313,20 @@ var table = {
if (result.code == web_status.SUCCESS) {
var topWindow = $(window.parent.document);
var currentId = $('.page-tabs-content', topWindow).find('.active').attr('data-panel');
var $contentWindow = $('.RuoYi_iframe[data-id="' + currentId + '"]', topWindow)[0].contentWindow;
$.modal.close();
$contentWindow.$.modal.msgSuccess(result.msg);
$contentWindow.$(".layui-layer-padding").removeAttr("style");
if ($contentWindow.table.options.type == table_type.bootstrapTable) {
$contentWindow.$.table.refresh();
} else if ($contentWindow.table.options.type == table_type.bootstrapTreeTable) {
$contentWindow.$.treeTable.refresh();
var topWindow = $('.RuoYi_iframe[data-id="' + currentId + '"]', topWindow)[0];
if ($.common.isNotEmpty(topWindow) && $.common.isNotEmpty(currentId)) {
var $contentWindow = topWindow.contentWindow;
$contentWindow.$.modal.msgSuccess(result.msg);
$contentWindow.$(".layui-layer-padding").removeAttr("style");
if ($contentWindow.table.options.type == table_type.bootstrapTable) {
$contentWindow.$.table.refresh();
} else if ($contentWindow.table.options.type == table_type.bootstrapTreeTable) {
$contentWindow.$.treeTable.refresh();
}
} else {
$.modal.msgSuccess(result.msg);
}
$.modal.close();
$.modal.closeTab();
} else if (result.code == web_status.WARNING) {
$.modal.alertWarning(result.msg)
@@ -1307,13 +1338,6 @@ var table = {
},
// 校验封装处理
validate: {
// 判断返回标识是否唯一 false 不存在 true 存在
unique: function (value) {
if (value == "0") {
return true;
}
return false;
},
// 表单验证
form: function (formId) {
var currentId = $.common.isEmpty(formId) ? $('form').attr('id') : formId;
@@ -1378,7 +1402,7 @@ var table = {
var node = tree.getNodesByParam("id", treeId, null)[0];
$.tree.selectByIdName(treeId, node);
// 回调tree方法
if(typeof(options.callBack) === "function"){
if (typeof(options.callBack) === "function"){
options.callBack(tree);
}
});
@@ -1423,7 +1447,6 @@ var table = {
},
// 隐藏所有节点
hideAllNode: function(nodes) {
var tree = $.fn.zTree.getZTreeObj("tree");
var nodes = $._tree.transformToArray(nodes);
for (var i = nodes.length - 1; i >= 0; i--) {
$._tree.hideNode(nodes[i]);
@@ -1468,7 +1491,7 @@ var table = {
// 不允许根父节点选择
notAllowParents: function(_tree) {
var nodes = _tree.getSelectedNodes();
if(nodes.length == 0){
if (nodes.length == 0){
$.modal.msgError("请选择节点后提交");
return false;
}
@@ -1515,7 +1538,7 @@ var table = {
common: {
// 判断字符串是否为空
isEmpty: function (value) {
if (value == null || this.trim(value) == "") {
if (value == null || this.trim(value) == "" || value == undefined || value == "undefined") {
return true;
}
return false;
@@ -1524,6 +1547,10 @@ var table = {
isNotEmpty: function (value) {
return !$.common.isEmpty(value);
},
// 如果值是空,则返回指定默认字符串,否则返回字符串本身
nullToDefault: function (value, defaultValue) {
return $.common.isEmpty(value) ? defaultValue : value;
},
// 空对象转字符串
nullToStr: function(value) {
if ($.common.isEmpty(value)) {
@@ -1582,7 +1609,7 @@ var table = {
if (!format) format = "yyyy-MM-dd";
switch (typeof date) {
case "string":
date = new Date(date.replace(/-/, "/"));
date = new Date(date.replace(/-/g, "/"));
break;
case "number":
date = new Date(date);
@@ -1656,7 +1683,7 @@ var table = {
formToJSON: function(formId) {
var json = {};
$.each($("#" + formId).serializeArray(), function(i, field) {
if(json[field.name]) {
if (json[field.name]) {
json[field.name] += ("," + field.value);
} else {
json[field.name] = field.value;
@@ -33,11 +33,11 @@ function login() {
if (r.code == web_status.SUCCESS) {
location.href = ctx + 'index';
} else {
$.modal.closeLoading();
$('.imgcode').click();
$(".code").val("");
$.modal.msg(r.msg);
}
$.modal.closeLoading();
}
});
}
@@ -76,11 +76,11 @@ function validateKickout() {
if (top != self) {
top.location = self.location;
} else {
var url  =  location.search;
var url = location.search;
if (url) {
var oldUrl  = window.location.href;
var newUrl  = oldUrl.substring(0,  oldUrl.indexOf('?'));
self.location  = newUrl;
var oldUrl = window.location.href;
var newUrl = oldUrl.substring(0, oldUrl.indexOf('?'));
self.location = newUrl;
}
}
});
@@ -0,0 +1,91 @@
<!DOCTYPE html>
<html lang="zh">
<head>
<th:block th:include="include :: header('进度条')" />
</head>
<body class="gray-bg">
<div class="wrapper wrapper-content animated fadeInRight">
<div class="row">
<div class="col-sm-12">
<div class="ibox float-e-margins">
<div class="ibox-title">
<h5>进度条 (Progress Bars)</h5>
<div class="ibox-tools">
<a class="collapse-link">
<i class="fa fa-chevron-up"></i>
</a>
<a class="dropdown-toggle" data-toggle="dropdown" href="#">
<i class="fa fa-wrench"></i>
</a>
<ul class="dropdown-menu dropdown-user">
<li><a href="#">选项1</a>
</li>
<li><a href="#">选项2</a>
</li>
</ul>
<a class="close-link">
<i class="fa fa-times"></i>
</a>
</div>
</div>
<div class="ibox-content">
<!-- style: progress-bar-success/progress-bar-info/progress-bar-warning/progress-bar-danger -->
<h5>基本</h5>
<div class="progress">
<div style="width: 35%" aria-valuemax="100" aria-valuemin="0" aria-valuenow="35" role="progressbar" class="progress-bar progress-bar-success">
<span class="sr-only">35% Complete (success)</span>
</div>
</div>
<div class="progress progress-bar-default">
<div style="width: 43%" aria-valuemax="100" aria-valuemin="0" aria-valuenow="43" role="progressbar" class="progress-bar">
<span class="sr-only">43% Complete (success)</span>
</div>
</div>
<h5>条纹效果</h5>
<div class="progress progress-striped">
<div style="width: 50%" aria-valuemax="100" aria-valuemin="0" aria-valuenow="50" role="progressbar" class="progress-bar progress-bar-warning">
<span class="sr-only">50% Complete (success)</span>
</div>
</div>
<h5>动画效果</h5>
<div class="progress progress-striped active">
<div style="width: 75%" aria-valuemax="100" aria-valuemin="0" aria-valuenow="75" role="progressbar" class="progress-bar progress-bar-danger">
<span class="sr-only">75% Complete (success)</span>
</div>
</div>
<h5>堆叠效果</h5>
<div class="progress progress-striped active">
<div style="width: 30%" class="progress-bar progress-bar-success">
<span class="sr-only">30% Complete (success)</span>
</div>
<div style="width: 20%" class="progress-bar progress-bar-warning">
<span class="sr-only">20% Complete (warning)</span>
</div>
<div style="width: 40%" class="progress-bar progress-bar-danger">
<span class="sr-only">40% Complete (danger)</span>
</div>
</div>
<h5>带有提示标签的进度条</h5>
<div class="progress">
<div class="progress-bar" role="progressbar" aria-valuenow="95" aria-valuemin="0" aria-valuemax="100" style="width: 95%;">
95%
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<th:block th:include="include :: footer" />
<script type="text/javascript">
$("[data-toggle='tooltip']").tooltip();
$("[data-toggle=popover]").popover();
</script>
</body>
</html>
@@ -17,7 +17,7 @@
<h2>若依后台管理系统</h2>
<p>ruoyi是一个完全响应式,基于Bootstrap3.3.7最新版本开发的扁平化主题,她采用了主流的左右两栏式布局,使用了Html5+CSS3等现代技术,她提供了诸多的强大的可以重新组合的UI组件,并集成了最新的jQuery版本(v2.1.1),当然,也集成了很多功能强大,用途广泛的就jQuery插件,她可以用于所有的Web应用程序,如<b>网站管理后台</b><b>网站会员中心</b><b>CMS</b><b>CRM</b><b>OA</b>等等,当然,您也可以对她进行深度定制,以做出更强系统。</p>
<p>
<b>当前版本:</b>v4.7.0
<b>当前版本:</b>v4.7.7
</p>
<p>
<span class="label label-warning">免费开源</span>
@@ -56,7 +56,7 @@
<h3>你好,若依 </h3>
<p>H+是一个完全响应式,基于Bootstrap3.3.7最新版本开发的扁平化主题,她采用了主流的左右两栏式布局,使用了Html5+CSS3等现代技术,她提供了诸多的强大的可以重新组合的UI组件,并集成了最新的jQuery版本(v2.1.1),当然,也集成了很多功能强大,用途广泛的就jQuery插件,她可以用于所有的Web应用程序,如<b>网站管理后台</b><b>网站会员中心</b><b>CMS</b><b>CRM</b><b>OA</b>等等,当然,您也可以对她进行深度定制,以做出更强系统。</p>
<p>
<b>当前版本:</b>v4.7.0
<b>当前版本:</b>v4.7.7
</p>
<p>
<span class="label label-warning">开源免费</span>
@@ -50,6 +50,8 @@
var rsp = data.response;
log.info("return url" + rsp.url)
log.info("reutrn fileName" + rsp.fileName)
log.info("reutrn newFileName" + rsp.newFileName)
log.info("return originalFilename" + rsp.originalFilename)
}).on('fileremoved', function (event, id, index) {
$("input[name='" + event.currentTarget.id + "']").val('')
})
@@ -62,6 +64,8 @@
var rsp = data.response;
log.info("return urls" + rsp.urls)
log.info("reutrn fileNames" + rsp.fileNames)
log.info("reutrn newFileNames" + rsp.newFileNames)
log.info("return originalFilenames" + rsp.originalFilenames)
}).on('fileremoved', function (event, id, index) {
$("input[name='" + event.currentTarget.id + "']").val('')
})
@@ -161,8 +161,8 @@
</div>
<div id="step-3" class="tab-pane" role="tabpanel" aria-labelledby="step-3">
<div class="m-t-md">
<p>1、如果需要工具栏在页面底部显示, 将style中下面的部分取消注释<blockquote>.sw>.toolbar-bottom </blockquote></p>
<p>2、如果设置了自动调节高度为false, 将style中下面的部分取消注释<blockquote>.sw>.tab-content </blockquote></p>
<p>1、如果需要工具栏固定在页面底部, 将style中下面的部分取消注释<blockquote>.sw>.toolbar-bottom </blockquote></p>
<p>2、如果设置了自动调节高度(autoAdjustHeight)为true, 将style中下面的部分取消注释<blockquote>.sw>.tab-content </blockquote></p>
<p>3、工具栏的按钮样式会被表单插件中.btn样式覆盖导致bootstrap中的按钮样式无效, 如果需要改变按钮样式可以自己定义并提高优先级</blockquote></p>
</div>
</div>
@@ -181,7 +181,7 @@ $('#smartwizard').smartWizard({
enableURLhash: true, // Enable selection of the step based on url hash
transition: {
animation: 'none', // Effect on navigation, none/fade/slide-horizontal/slide-vertical/slide-swing
speed: '400', // Transion animation speed
speed: '400', // Transition animation speed
easing:'' // Transition animation easing. Not supported without a jQuery easing plugin
},
toolbarSettings: {
File diff suppressed because it is too large Load Diff
@@ -147,7 +147,7 @@
})
$("#button-msgReload").click(function(){
$.modal.msgReload("保存成功,正在刷新数据请稍……", modal_status.SUCCESS);
$.modal.msgReload("保存成功,正在刷新数据请稍……", modal_status.SUCCESS);
})
$("#button-open-1").click(function(){
@@ -24,49 +24,97 @@
<h5>弹层框</h5>
</div>
<div class="ibox-content" id="test">
<p>弹出复选框表格及单选框表格(点击提交后得到数据并回显到父窗体</p>
<button type="button" class="btn btn-info" onclick="selectUsersToParent()">弹出表格(复选框</button>
<button type="button" class="btn btn-warning" onclick="selectUsersToParentCallBack()">弹出表格(复选框)- 回调形式</button>
<p>弹出层,点击提交后得到数据并回显到父窗体。 </p>
<button type="button" class="btn btn-primary" onclick="selectUsersToParent()">弹出表格(方式一</button>
<button type="button" class="btn btn-success" onclick="selectUsersToParentCallBack2()">弹出表格(方式二)</button>
<button type="button" class="btn btn-info" onclick="selectUsersToParentCallBack3()">弹出表格(方式三)</button>
<p id="userids"> </p>
</div>
</div>
</div>
<div class="col-sm-12">
<div class="ibox">
<div class="ibox-title">
<h5>弹层框</h5>
</div>
<div class="ibox-content" id="test">
<p>多层弹出,点击提交后得到数据并回显到父窗体。 </p>
<button type="button" class="btn btn-primary" onclick="selectUsersToParent4()">弹出窗口(方式四)</button>
<p id="username"> </p>
</div>
</div>
</div>
</div>
</div>
<th:block th:include="include :: footer" />
<script type="text/javascript">
var prefix = ctx + "demo/modal";
function selectCheckUser(){
$.modal.open("选择用户", prefix + "/check");
}
function selectRadioUser(){
$.modal.open("选择用户", prefix + "/radio");
}
// 根据当前激活的选项卡获取(方式一)
function selectUsersToParent(){
$.modal.open("选择用户", prefix + "/parent");
}
function selectUsersToParentCallBack(){
// callBack获取父窗口方法(方式二)
function selectUsersToParentCallBack2(){
var options = {
title: '选择用户',
url: prefix + "/parent",
callBack: doSubmit
callBack: doSubmit2
};
$.modal.openOptions(options);
}
// callBack获取父窗口值(方式三)
function selectUsersToParentCallBack3(){
var options = {
title: '选择用户',
url: prefix + "/parent",
callBack: doSubmit3
};
$.modal.openOptions(options);
}
function doSubmit(index, layero){
// callBack获取父窗口值(方式四)
function selectUsersToParent4(){
var prefix = ctx + "demo/modal";
var options = {
title: '多层窗口A',
url: prefix + "/frame1",
callBack: doSubmit4
};
$.modal.openOptions(options);
}
function doSubmit2(index, layero){
var rows = layero.find("iframe")[0].contentWindow.getSelections();
if (rows.length == 0) {
$.modal.alertWarning("请至少选择一条记录");
return;
}
$('#userids').html(rows.join())
$('#userids').html('我是通过方式二来的:' + rows.join())
$.modal.close(index);
}
function doSubmit3(index, layero){
var body = $.modal.getChildFrame(index);
$("#userids").html('我是通过方式三来的:' + body.find('#rowIds').val());
$.modal.close(index);
}
function doSubmit4(index, layero){
var body = $.modal.getChildFrame(index);
$("#username").html('我是通过方式四来的:' + body.find('#name').val());
$.modal.close(index);
}
function selectUsers(){
alert(1);
@@ -0,0 +1,53 @@
<!DOCTYPE html>
<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
<head>
<th:block th:include="include :: header('多层窗口A')" />
</head>
<body class="gray-bg">
<div class="container-div">
<div class="row">
<form id="form-user-add" class="form-horizontal">
<div class="row">
<div class="col-sm-12" style="margin-top: 50px">
<div class="form-group">
<label class="col-sm-4 control-label">用户名称:</label>
<div class="col-sm-4">
<input id="name" placeholder="请输入用户名称" class="form-control" type="text">
</div>
<button type="button" class="btn btn-primary" onclick="selectUserToParentId()">选择</button>
</div>
</div>
</div>
</form>
</div>
</div>
<div th:include="include :: footer"></div>
<script th:inline="javascript">
/* 提交 */
function submitHandler() {
var name = $("#name").val();
activeWindow().$('#username').html(name);
$.modal.close();
}
// 根据父窗口ID获取
function selectUserToParentId(){
var prefix = ctx + "demo/modal";
var options = {
width: '100px',
height: '100px',
title: '多层窗口B',
url: prefix + "/frame2",
callBack: doSubmit
};
$.modal.openOptions(options);
}
function doSubmit(index, layero){
var body = $.modal.getChildFrame(index);
$("#name").val(body.find('#name').val());
$.modal.close(index);
}
</script>
</body>
</html>
@@ -0,0 +1,24 @@
<!DOCTYPE html>
<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
<head>
<th:block th:include="include :: header('多层窗口B')" />
</head>
<body class="gray-bg">
<div class="container-div">
<div class="row">
<form id="form-user-add" class="form-horizontal">
<div class="row">
<div class="col-sm-12" style="margin-top: 20px">
<div class="form-group">
<label class="col-sm-4 control-label">用户名称:</label>
<div class="col-sm-4">
<input id="name" placeholder="请输入用户名称" class="form-control" type="text">
</div>
</div>
</div>
</div>
</form>
</div>
</div>
</body>
</html>
@@ -4,6 +4,7 @@
<th:block th:include="include :: header('表格传值给父页面')" />
</head>
<body class="gray-bg">
<input type="hidden" id="rowIds">
<div class="container-div">
<div class="row">
<div class="col-sm-12 select-table table-striped">
@@ -81,15 +82,21 @@
}
$.modal.close();
// 父页面的方法
// parent.selectUsers();
// activeWindow().selectUsers();
// 父页面的变量
parent.$('#userids').html(rows.join());
activeWindow().$('#userids').html('我是通过方式一来的:' + rows.join());
}
/* 添加用户-选择用户-提交(回调形式-父页面调用子页面) */
function getSelections() {
return $.table.selectFirstColumns();
}
$("#bootstrap-table").on("check.bs.table check-all.bs.table uncheck.bs.table uncheck-all.bs.table", function (e, rowsAfter, rowsBefore) {
var rows = $.common.equals("uncheck-all", e.type) ? rowsBefore : rowsAfter;
var rowIds = $.table.affectedRowIds(rows);
$("#rowIds").val(rowIds);
});
</script>
</body>
</html>
@@ -59,7 +59,7 @@
type: "post",
success: function(result) {
if (result.code == web_status.SUCCESS) {
layer.msg("保存成功,正在刷新数据请稍……", {
layer.msg("保存成功,正在刷新数据请稍……", {
icon: 1,
time: 500,
shade: [0.1, '#8F8F8F']
@@ -6,9 +6,9 @@
<body class="gray-bg">
<div class="row border-bottom white-bg dashboard-header">
<div class="col-sm-12">
<p>ECharts开源来自百度商业前端数据可视化团队,基于html5 Canvas,是一个纯Javascript图表库,提供直观,生动,可交互,可个性化定制的数据可视化图表。创新的拖拽重计算、数据视图、值域漫游等特性大大增强了用户体验,赋予了用户对数据进行挖掘、整合的能力。 <a href="http://echarts.baidu.com/doc/about.html" target="_blank">了解更多</a>
<p>ECharts开源来自百度商业前端数据可视化团队,基于html5 Canvas,是一个纯Javascript图表库,提供直观,生动,可交互,可个性化定制的数据可视化图表。创新的拖拽重计算、数据视图、值域漫游等特性大大增强了用户体验,赋予了用户对数据进行挖掘、整合的能力。 <a href="https://echarts.apache.org/handbook/zh/get-started/" target="_blank">了解更多</a>
</p>
<p>ECharts官网:<a href="http://echarts.baidu.com/" target="_blank">http://echarts.baidu.com/</a>
<p>ECharts官网:<a href="https://echarts.apache.org/" target="_blank">https://echarts.apache.org/</a>
</p>
</div>
@@ -0,0 +1,85 @@
<!DOCTYPE html>
<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
<head>
<th:block th:include="include :: header('异步加载表格树')" />
</head>
<body class="gray-bg">
<div class="container-div">
<div class="row">
<div class="col-sm-12 search-collapse">
<form id="formId">
<div class="select-list">
<ul>
<li>
<label>区域名称:</label>
<input type="text" name="areaName"/>
</li>
<li>
<a class="btn btn-primary btn-rounded btn-sm" onclick="$.treeTable.search()"><i class="fa fa-search"></i>&nbsp;搜索</a>
<a class="btn btn-warning btn-rounded btn-sm" onclick="$.form.reset()"><i class="fa fa-refresh"></i>&nbsp;重置</a>
</li>
</ul>
</div>
</form>
</div>
<div class="btn-group-sm" id="toolbar" role="group">
<a class="btn btn-info" id="expandAllBtn">
<i class="fa fa-exchange"></i> 展开/折叠
</a>
</div>
<div class="col-sm-12 select-table table-striped">
<table id="bootstrap-tree-table"></table>
</div>
</div>
</div>
<th:block th:include="include :: footer" />
<script th:inline="javascript">
var prefix = ctx + "demo/table";
$(function() {
var options = {
code: "id",
parentCode: "parentId",
uniqueId: "id",
expandAll: false,
expandFirst: false,
expandColumn: 1,
pagination: true, // 开启分页
url: prefix + "/tree/list", // 列表请求
dataUrl: prefix + "/tree/listChild", // 子节点异步请求
onClickRow: onClickRow,
columns: [{
field: 'selectItem',
radio: true
},
{
field: 'areaName',
title: '区域名称',
align: 'left',
},
{
field: 'areaCode',
title: '区域代码',
align: 'left'
},
{
field: 'simplePy',
title: '首字母简拼',
align: 'left'
},
{
field: 'pinYin',
title: '名称全拼',
align: 'left'
}]
};
$.treeTable.init(options);
});
function onClickRow(row, $element){
// alert("单击行id" + row.id + " name" + row.name);
}
</script>
</body>
</html>
@@ -7,6 +7,9 @@
<div class="container-div">
<div class="row">
<div class="col-sm-12 select-table table-striped">
<!-- 点击事件的方式打开使用 detailViewIcon: false and detailViewByClick: true
data-detail-view-icon="false"
data-detail-view-by-click="true" -->
<table id="bootstrap-table"></table>
</div>
</div>
@@ -42,7 +42,7 @@
function ajaxColumns() {
var url = prefix + "/ajaxColumns";
var dataParam = $.common.formToJSON("table-form");
$.modal.loading("正在查询中,请稍...");
$.modal.loading("正在查询中,请稍...");
$.post(url, dataParam, function(result) {
if (result.code == web_status.SUCCESS) {
setColumns(result.data);
@@ -86,6 +86,7 @@
$(function() {
var options = {
id: "bootstrap-table1",
formId: "form1",
toolbar: "toolbar1",
url: prefix + "/list",
createUrl: prefix + "/add",
@@ -145,6 +146,7 @@
$(function() {
var options = {
id: "bootstrap-table2",
formId: "form2",
toolbar: "toolbar2",
url: prefix + "/list",
createUrl: prefix + "/add",
@@ -5,6 +5,11 @@
</head>
<body class="gray-bg">
<div class="container-div">
<div class="btn-group-sm" id="toolbar" role="group">
<a class="btn btn-primary" onclick="getData()">
<i class="fa fa-search"></i> 查询所有数据
</a>
</div>
<div class="row">
<div class="col-sm-12 select-table table-striped">
<p class="select-title">按住表格行拖拽</p>
@@ -27,9 +32,14 @@
showRefresh: false,
showToggle: false,
showColumns: false,
onReorderRow: function (data) {
//当拖拽结束后,data为整个表格的数据
console.log('拖拽结束' + JSON.stringify(data))
onReorderRow: function (data, newRow, oldRow, el) {
// 当拖拽结束后,data为整个表格的数据
console.table(data)
// 当sidePagination: "server"时,拖拽行后顺序错乱,需要重新调用加载数据方法
$("#" + table.options.id).bootstrapTable('load', {
total: el._xhr.responseJSON.total,
rows: data
});
return false;
},
columns: [{
@@ -70,6 +80,12 @@
};
$.table.init(options);
});
/* 查询表格所有数据值 */
function getData(){
var data = $("#" + table.options.id).bootstrapTable('getData');
alert(JSON.stringify(data.map( item => { return item.userId })))
}
</script>
</body>
</html>
@@ -1,8 +1,11 @@
<!DOCTYPE html>
<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
<head>
<th:block th:include="include :: header('主子表提交')" />
<th:block th:include="include :: header('主子表提交')" />
<th:block th:include="include :: datetimepicker-css" />
<style type="text/css">
table label.error{position: inherit;}select + label.error{z-index:1;right:40px;}
</style>
</head>
<body class="gray-bg">
<div class="main-content">
@@ -13,7 +16,7 @@
<div class="form-group">
<label class="col-sm-4 control-label is-required">客户名称:</label>
<div class="col-sm-8">
<input name="name" placeholder="请输入客户名称" class="form-control" type="text" maxlength="30">
<input name="name" placeholder="请输入客户名称" class="form-control" type="text" maxlength="30" required>
</div>
</div>
</div>
@@ -31,9 +34,9 @@
<div class="row">
<div class="col-sm-6">
<div class="form-group">
<label class="col-sm-4 control-label is-required">手机号码:</label>
<label class="col-sm-4 control-label">手机号码:</label>
<div class="col-sm-8">
<input id="phonenumber" name="phonenumber" placeholder="请输入手机号码" class="form-control" type="text" maxlength="11">
<input id="phonenumber" name="phonenumber" placeholder="请输入手机号码" class="form-control isPhone" type="text" maxlength="11">
</div>
</div>
</div>
@@ -62,8 +65,8 @@
<h4 class="form-header h4">商品数据</h4>
<div class="row">
<div class="col-sm-12">
<button type="button" class="btn btn-white btn-sm" onclick="addColumn()"><i class="fa fa-plus"> 增加</i></button>
<button type="button" class="btn btn-white btn-sm" onclick="sub.delColumn()"><i class="fa fa-minus"> 删除</i></button>
<button type="button" class="btn btn-white btn-sm" onclick="addRow()"><i class="fa fa-plus"> 增加</i></button>
<button type="button" class="btn btn-white btn-sm" onclick="sub.delRow()"><i class="fa fa-minus"> 删除</i></button>
<div class="col-sm-12 select-table table-striped">
<table id="bootstrap-table"></table>
</div>
@@ -127,7 +130,7 @@
align: 'center',
title: '商品名称',
formatter: function(value, row, index) {
var html = $.common.sprintf("<input class='form-control' type='text' name='goods[%s].name' value='%s'>", index, value);
var html = $.common.sprintf("<input class='form-control goodsName' type='text' name='goods[%s].name' value='%s'>", index, value);
return html;
}
},
@@ -136,7 +139,7 @@
align: 'center',
title: '商品重量',
formatter: function(value, row, index) {
var html = $.common.sprintf("<input class='form-control' type='text' name='goods[%s].weight' value='%s'>", index, value);
var html = $.common.sprintf("<input class='form-control goodsWeight' type='text' name='goods[%s].weight' value='%s'>", index, value);
return html;
}
},
@@ -166,16 +169,34 @@
var data = [{ index: index, type: value }];
return $("#goodsTypeTpl").tmpl(data).html();
}
}]
},
{
title: '操作',
align: 'center',
formatter: function(value, row, index) {
var value = $.common.isNotEmpty(row.index) ? row.index : $.table.serialNumber(index);
return '<a class="btn btn-danger btn-xs" href="javascript:void(0)" onclick="sub.delRowByIndex(\'' + value + '\')"><i class="fa fa-remove"></i>删除</a>';
}
}]
};
$.table.init(options);
});
/* 主子表-提交 */
$.validator.addMethod("goodsName", function(value, element) {
return !this.optional(element);
}, "商品名称必填。");
$.validator.addMethod("goodsWeight", function(value, element) {
return !this.optional(element) && (value <= 100 && value >= 0);
}, "商品重量长度区间0-100。");
/* 主子表-提交 */
function submitHandler(index, layero){
var data = $("#form-add").serializeArray();
alert(JSON.stringify(data))
$.operate.saveModal("/demo/operate/customer/add", data);
if ($.validate.form()) {
var data = $("#form-add").serializeArray();
alert(JSON.stringify(data))
$.operate.saveModal("/demo/operate/customer/add", data);
}
}
$("input[name='birthday']").datetimepicker({
@@ -184,15 +205,17 @@
autoclose: true
});
function addColumn() {
function addRow() {
var count = $("#" + table.options.id).bootstrapTable('getData').length;
var row = {
index: $.table.serialNumber(count),
name: "",
weight: "",
price: "",
date: "",
type: "",
}
sub.addColumn(row);
sub.addRow(row);
}
$("#bootstrap-table").on("post-body.bs.table", function (e, args) {
@@ -12,14 +12,14 @@
<link th:href="@{/ajax/libs/bootstrap-table/bootstrap-table.min.css?v=1.18.3}" rel="stylesheet"/>
<link th:href="@{/css/animate.min.css?v=20210831}" rel="stylesheet"/>
<link th:href="@{/css/style.min.css?v=20210831}" rel="stylesheet"/>
<link th:href="@{/ruoyi/css/ry-ui.css?v=4.7.0}" rel="stylesheet"/>
<link th:href="@{/ruoyi/css/ry-ui.css?v=4.7.7}" rel="stylesheet"/>
</head>
<!-- 通用JS -->
<div th:fragment="footer">
<script th:inline="javascript"> var ctx = [[@{/}]]; var lockscreen = [[${session.lockscreen}]]; if(lockscreen){window.top.location=ctx+"lockscreen";} </script>
<a id="scroll-up" href="#" class="btn btn-sm display"><i class="fa fa-angle-double-up"></i></a>
<script th:src="@{/js/jquery.min.js?v=3.6.0}"></script>
<script th:src="@{/js/jquery.min.js?v=3.6.3}"></script>
<script th:src="@{/js/bootstrap.min.js?v=3.3.7}"></script>
<!-- bootstrap-table 表格插件 -->
<script th:src="@{/ajax/libs/bootstrap-table/bootstrap-table.min.js?v=1.18.3}"></script>
@@ -35,9 +35,9 @@
<script th:src="@{/ajax/libs/blockUI/jquery.blockUI.js?v=2.70.0}"></script>
<script th:src="@{/ajax/libs/iCheck/icheck.min.js?v=1.0.3}"></script>
<script th:src="@{/ajax/libs/layer/layer.min.js?v=3.5.1}"></script>
<script th:src="@{/ajax/libs/layui/layui.min.js?v=2.6.8}"></script>
<script th:src="@{/ruoyi/js/common.js?v=4.7.0}"></script>
<script th:src="@{/ruoyi/js/ry-ui.js?v=4.7.0}"></script>
<script th:src="@{/ajax/libs/layui/layui.min.js?v=2.7.5}"></script>
<script th:src="@{/ruoyi/js/common.js?v=4.7.7}"></script>
<script th:src="@{/ruoyi/js/ry-ui.js?v=4.7.7}"></script>
</div>
<!-- ztree树插件 -->
@@ -108,10 +108,10 @@
<!-- fileinput文件上传插件 -->
<div th:fragment="bootstrap-fileinput-css">
<link th:href="@{/ajax/libs/bootstrap-fileinput/fileinput.min.css?v=5.2.3}" rel="stylesheet"/>
<link th:href="@{/ajax/libs/bootstrap-fileinput/fileinput.min.css?v=5.5.2}" rel="stylesheet"/>
</div>
<div th:fragment="bootstrap-fileinput-js">
<script th:src="@{/ajax/libs/bootstrap-fileinput/fileinput.min.js?v=5.2.3}"></script>
<script th:src="@{/ajax/libs/bootstrap-fileinput/fileinput.min.js?v=5.5.2}"></script>
</div>
<!-- duallistbox双列表框插件 -->
@@ -14,7 +14,8 @@
<link th:href="@{/css/animate.min.css}" rel="stylesheet"/>
<link th:href="@{/css/style.min.css}" rel="stylesheet"/>
<link th:href="@{/css/skins.css?v=20200902}" rel="stylesheet"/>
<link th:href="@{/ruoyi/css/ry-ui.css?v=4.7.0}" rel="stylesheet"/>
<link th:href="@{/ruoyi/css/ry-ui.css?v=4.7.7}" rel="stylesheet"/>
<style type="text/css">.fixed-sidebar .nav:not(.navbar-toolbar)>li.active{border-left:0px!important;}</style>
</head>
<body class="fixed-sidebar full-height-layout gray-bg" th:classappend="${isMobile} ? 'canvas-menu'" style="overflow: hidden">
<div id="wrapper">
@@ -98,6 +99,7 @@
<li><a class="menuItem" th:href="@{/demo/form/grid}">栅格</a></li>
<li><a class="menuItem" th:href="@{/demo/form/select}">下拉框</a></li>
<li><a class="menuItem" th:href="@{/demo/form/timeline}">时间轴</a></li>
<li><a class="menuItem" th:href="@{/demo/form/progress_bars}">进度条</a></li>
<li><a class="menuItem" th:href="@{/demo/form/basic}">基本表单</a></li>
<li><a class="menuItem" th:href="@{/demo/form/cards}">卡片列表</a></li>
<li><a class="menuItem" th:href="@{/demo/form/jasny}">功能扩展</a></li>
@@ -146,6 +148,7 @@
<li><a class="menuItem" th:href="@{/demo/table/print}">表格打印配置</a></li>
<li><a class="menuItem" th:href="@{/demo/table/dynamicColumns}">表格动态列</a></li>
<li><a class="menuItem" th:href="@{/demo/table/customView}">自定义视图分页</a></li>
<li><a class="menuItem" th:href="@{/demo/table/asynTree}">异步加载表格树</a></li>
<li><a class="menuItem" th:href="@{/demo/table/other}">表格其他操作</a></li>
</ul>
</li>
@@ -279,7 +282,7 @@
</ul>
</nav>
</div>
<div class="row content-tabs">
<div class="row content-tabs" th:classappend="${#bools.isFalse(tagsView)} ? |hide|">
<button class="roll-nav roll-left tabLeft">
<i class="fa fa-backward"></i>
</button>
@@ -296,12 +299,12 @@
<a id="ax_close_max" class="ax_close_max" href="#" title="关闭全屏"> <i class="fa fa-times-circle-o"></i> </a>
<div class="row mainContent" id="content-main" th:style="${#bools.isFalse(ignoreFooter)} ? |height: calc(100% - 91px)|">
<div class="row mainContent" id="content-main" th:classappend="${mainClass}">
<iframe class="RuoYi_iframe" name="iframe0" width="100%" height="100%" th:data-id="@{/system/main}"
th:src="@{/system/main}" frameborder="0" seamless></iframe>
th:src="@{/system/main}" frameborder="0" seamless></iframe>
</div>
<div th:if="${ignoreFooter}" class="footer">
<div th:if="${footer}" class="footer">
<div class="pull-right">© [[${copyrightYear}]] RuoYi Copyright </div>
</div>
</div>
@@ -315,8 +318,8 @@
<script th:src="@{/js/jquery.contextMenu.min.js}"></script>
<script th:src="@{/ajax/libs/blockUI/jquery.blockUI.js}"></script>
<script th:src="@{/ajax/libs/layer/layer.min.js}"></script>
<script th:src="@{/ruoyi/js/ry-ui.js?v=4.7.0}"></script>
<script th:src="@{/ruoyi/js/common.js?v=4.7.0}"></script>
<script th:src="@{/ruoyi/js/ry-ui.js?v=4.7.7}"></script>
<script th:src="@{/ruoyi/js/common.js?v=4.7.7}"></script>
<script th:src="@{/ruoyi/index.js?v=20201208}"></script>
<script th:src="@{/ajax/libs/fullscreen/jquery.fullscreen.js}"></script>
<script th:src="@{/js/resize-tabs.js}"></script>
@@ -14,7 +14,7 @@
<link th:href="@{/css/animate.min.css}" rel="stylesheet"/>
<link th:href="@{/css/style.min.css}" rel="stylesheet"/>
<link th:href="@{/css/skins.css}" rel="stylesheet"/>
<link th:href="@{/ruoyi/css/ry-ui.css?v=4.7.0}" rel="stylesheet"/>
<link th:href="@{/ruoyi/css/ry-ui.css?v=4.7.7}" rel="stylesheet"/>
</head>
<body class="fixed-sidebar full-height-layout gray-bg" th:classappend="${isMobile} ? 'canvas-menu'" style="overflow: hidden">
<div id="wrapper">
@@ -80,6 +80,7 @@
<li><a class="menuItem" th:href="@{/demo/form/grid}">栅格</a></li>
<li><a class="menuItem" th:href="@{/demo/form/select}">下拉框</a></li>
<li><a class="menuItem" th:href="@{/demo/form/timeline}">时间轴</a></li>
<li><a class="menuItem" th:href="@{/demo/form/progress_bars}">进度条</a></li>
<li><a class="menuItem" th:href="@{/demo/form/basic}">基本表单</a></li>
<li><a class="menuItem" th:href="@{/demo/form/cards}">卡片列表</a></li>
<li><a class="menuItem" th:href="@{/demo/form/jasny}">功能扩展</a></li>
@@ -127,6 +128,7 @@
<li><a class="menuItem" th:href="@{/demo/table/print}">表格打印配置</a></li>
<li><a class="menuItem" th:href="@{/demo/table/dynamicColumns}">表格动态列</a></li>
<li><a class="menuItem" th:href="@{/demo/table/customView}">自定义视图分页</a></li>
<li><a class="menuItem" th:href="@{/demo/table/asynTree}">异步加载表格树</a></li>
<li><a class="menuItem" th:href="@{/demo/table/other}">表格其他操作</a></li>
</ul>
</li>
@@ -226,7 +228,7 @@
</ul>
</nav>
</div>
<div class="row content-tabs">
<div class="row content-tabs" th:classappend="${#bools.isFalse(tagsView)} ? |hide|">
<button class="roll-nav roll-left tabLeft">
<i class="fa fa-backward"></i>
</button>
@@ -243,12 +245,12 @@
<a id="ax_close_max" class="ax_close_max" href="#" title="关闭全屏"> <i class="fa fa-times-circle-o"></i> </a>
<div class="row mainContent" id="content-main" th:style="${#bools.isFalse(ignoreFooter)} ? |height: calc(100% - 91px)|">
<div class="row mainContent" id="content-main" th:classappend="${mainClass}">
<iframe class="RuoYi_iframe" name="iframe0" width="100%" height="100%" th:data-id="@{/system/main}"
th:src="@{/system/main}" frameborder="0" seamless></iframe>
th:src="@{/system/main}" frameborder="0" seamless></iframe>
</div>
<div th:if="${ignoreFooter}" class="footer">
<div th:if="${footer}" class="footer">
<div class="pull-right">© [[${copyrightYear}]] RuoYi Copyright </div>
</div>
</div>
@@ -262,8 +264,8 @@
<script th:src="@{/js/jquery.contextMenu.min.js}"></script>
<script th:src="@{/ajax/libs/blockUI/jquery.blockUI.js}"></script>
<script th:src="@{/ajax/libs/layer/layer.min.js}"></script>
<script th:src="@{/ruoyi/js/ry-ui.js?v=4.7.0}"></script>
<script th:src="@{/ruoyi/js/common.js?v=4.7.0}"></script>
<script th:src="@{/ruoyi/js/ry-ui.js?v=4.7.7}"></script>
<script th:src="@{/ruoyi/js/common.js?v=4.7.7}"></script>
<script th:src="@{/ruoyi/index.js?v=20201208}"></script>
<script th:src="@{/ajax/libs/fullscreen/jquery.fullscreen.js}"></script>
<script th:inline="javascript">
@@ -29,16 +29,16 @@
</form>
</div>
<div class="help-block text-center" style="margin-top: 50px;">系统锁屏,请输入密码登!</div>
<div class="help-block text-center" style="margin-top: 50px;">系统锁屏,请输入密码登!</div>
<div class="text-center">
<a th:href="@{logout}">退出重新登</a>
<a th:href="@{logout}">退出重新登</a>
</div>
</div>
<script src="../static/js/jquery.min.js" th:src="@{/js/jquery.min.js}"></script>
<script src="../static/js/bootstrap.min.js" th:src="@{/js/bootstrap.min.js}"></script>
<script src="../static/js/three.min.js" th:src="@{/js/three.min.js}"></script>
<script src="../static/ajax/libs/layer/layer.min.js" th:src="@{/ajax/libs/layer/layer.min.js}"></script>
<script src="../static/ruoyi/js/ry-ui.js" th:src="@{/ruoyi/js/ry-ui.js?v=4.7.0}"></script>
<script src="../static/ruoyi/js/ry-ui.js" th:src="@{/ruoyi/js/ry-ui.js?v=4.7.7}"></script>
</body>
<script th:inline="javascript">
var ctx = [[@{/}]];
@@ -9,7 +9,7 @@
<link href="../static/css/font-awesome.min.css" th:href="@{/css/font-awesome.min.css}" rel="stylesheet"/>
<link href="../static/css/style.min.css" th:href="@{/css/style.min.css}" rel="stylesheet"/>
<link href="../static/css/login.min.css" th:href="@{/css/login.min.css}" rel="stylesheet"/>
<link href="../static/ruoyi/css/ry-ui.css" th:href="@{/ruoyi/css/ry-ui.css?v=4.7.0}" rel="stylesheet"/>
<link href="../static/ruoyi/css/ry-ui.css" th:href="@{/ruoyi/css/ry-ui.css?v=4.7.7}" rel="stylesheet"/>
<!-- 360浏览器急速模式 -->
<meta name="renderer" content="webkit">
<!-- 避免IE使用兼容模式 -->
@@ -59,13 +59,13 @@
<div class="checkbox-custom" th:if="${isRemembered}" th:classappend="${captchaEnabled==false} ? 'm-t'">
<input type="checkbox" id="rememberme" name="rememberme"> <label for="rememberme">记住我</label>
</div>
<button class="btn btn-success btn-block" id="btnSubmit" data-loading="正在验证登录,请稍...">登录</button>
<button class="btn btn-success btn-block" id="btnSubmit" data-loading="正在验证登录,请稍...">登录</button>
</form>
</div>
</div>
<div class="signup-footer">
<div class="pull-left">
Copyright © 2018-2021 ruoyi.vip All Rights Reserved. <br>
Copyright © 2018-2023 ruoyi.vip All Rights Reserved. <br>
</div>
</div>
</div>
@@ -76,7 +76,7 @@
<script src="../static/ajax/libs/validate/jquery.validate.min.js" th:src="@{/ajax/libs/validate/jquery.validate.min.js}"></script>
<script src="../static/ajax/libs/layer/layer.min.js" th:src="@{/ajax/libs/layer/layer.min.js}"></script>
<script src="../static/ajax/libs/blockUI/jquery.blockUI.js" th:src="@{/ajax/libs/blockUI/jquery.blockUI.js}"></script>
<script src="../static/ruoyi/js/ry-ui.js" th:src="@{/ruoyi/js/ry-ui.js?v=4.7.0}"></script>
<script src="../static/ruoyi/js/ry-ui.js" th:src="@{/ruoyi/js/ry-ui.js?v=4.7.7}"></script>
<script src="../static/ruoyi/login.js" th:src="@{/ruoyi/login.js}"></script>
</body>
</html>
@@ -79,7 +79,7 @@
<div class="ibox-content">
<p><i class="fa fa-send-o"></i> 官网:<a href="http://www.ruoyi.vip" target="_blank">http://www.ruoyi.vip</a>
</p>
<p><i class="fa fa-qq"></i> QQ群:<s>满1389287</s> <s>满1679294</s> <s>满1529866</s> <s>满1772718</s> <s>满1366522</s> <s>满1382251</s> <s>满1145125</s> <s>满86752435</s> <s>满134072510</s> <s>满210336300</s> <s>满339522636</s> <s>满130035985</s> <s>满143151071</s> <s>满158781320</s> <s>满201531282</s> <a href="https://jq.qq.com/?_wv=1027&k=0ARRrO9V" target="_blank">101526938</a>
<p><i class="fa fa-qq"></i> QQ群:<s>满1389287</s> <s>满1679294</s> <s>满1529866</s> <s>满1772718</s> <s>满1366522</s> <s>满1382251</s> <s>满1145125</s> <s>满86752435</s> <s>满134072510</s> <s>满210336300</s> <s>满339522636</s> <s>满130035985</s> <s>满143151071</s> <s>满158781320</s> <s>满201531282</s> <s>满101526938</s> <s>满264355400</s> <s>满298522656</s> <s>满139845794</s> <s>满185760789</s> <a href="https://jq.qq.com/?_wv=1027&k=7FplYUnR" target="_blank">175104288</a>
</p>
<p><i class="fa fa-weixin"></i> 微信:<a href="javascript:;">/ *若依</a>
</p>
@@ -96,13 +96,304 @@
<div class="ibox-content no-padding">
<div class="panel-body">
<div class="panel-group" id="version">
<div class="panel panel-default">
<div class="panel-heading">
<h5 class="panel-title">
<a data-toggle="collapse" data-parent="#version" href="#v477">v4.7.7</a><code class="pull-right">2023.04.14</code>
</h5>
</div>
<div id="v477" class="panel-collapse collapse in">
<div class="panel-body">
<ol>
<li>操作日志新增消耗时间属性</li>
<li>日志管理使用索引提升查询性能</li>
<li>日志注解支持排除指定的请求参数</li>
<li>新增监控页面图标显示</li>
<li>新增支持登录IP黑名单限制</li>
<li>更新fontawesome图标示例</li>
<li>屏蔽定时任务bean违规的字符</li>
<li>支持自定义隐藏属性列过滤子对象</li>
<li>连接池Druid支持新的配置connectTimeout和socketTimeout</li>
<li>升级jquery到最新版v3.6.3</li>
<li>升级layui到最新版本2.7.6</li>
<li>升级jasny-bootstrap到最新版4.0.0</li>
<li>升级oshi到最新版本6.4.1</li>
<li>升级druid到最新版本1.2.16</li>
<li>修复异步表格树子项排序问题</li>
<li>修复冻结列不支持IE浏览器的问题</li>
<li>修复主子表使用suggest插件无法新增问题</li>
<li>修复菜单栏快速点击导致展开折叠样式问题</li>
<li>修复用户多角色数据权限可能出现权限抬升的情况</li>
<li>修复异步加载表格树重置列表父节点展开异常问题</li>
<li>修复页签属性refresh为undefined时页面被刷新问题</li>
<li>移除apache/commons-fileupload依赖</li>
<li>优化前端属性提醒说明</li>
<li>优化用户导入更新时需获取用户编号问题</li>
<li>优化主子表根据序号删除方法加入表格ID参数</li>
<li>优化导出Excel时设置dictType属性重复查缓存问题</li>
<li>优化在线用户服务缓存改为从Bean容器获取不使用自动装配</li>
<li>优化表格示例行拖拽后列表底部总记录条数变成了undefined问题</li>
<li>其他细节优化</li>
</ol>
</div>
</div>
</div>
<div class="panel panel-default">
<div class="panel-heading">
<h5 class="panel-title">
<a data-toggle="collapse" data-parent="#version" href="#v476">v4.7.6</a><code class="pull-right">2022.12.16</code>
</h5>
</div>
<div id="v476" class="panel-collapse collapse">
<div class="panel-body">
<ol>
<li>定时任务违规的字符</li>
<li>忽略不必要的属性数据返回</li>
<li>导入更新用户数据前校验数据权限</li>
<li>修改参数键名时移除前缓存配置</li>
<li>修改用户登录账号进行重复验证</li>
<li>兼容Excel下拉框内容过多无法显示</li>
<li>升级oshi到最新版本6.4.0</li>
<li>升级kaptcha到最新版2.3.3</li>
<li>升级druid到最新版本1.2.15</li>
<li>升级shiro到最新版本1.10.1</li>
<li>升级pagehelper到最新版1.4.6</li>
<li>升级bootstrap-fileinput到最新版本5.5.2</li>
<li>修复sheet超出最大行数异常问题</li>
<li>修复关闭父页签后提交无法跳转的问题</li>
<li>修复操作日志类型多选导出不生效问题</li>
<li>修复导出包含空子列表数据异常的问题</li>
<li>优化树形表格层级显示</li>
<li>优化SQL关键字检查防止注入</li>
<li>优化用户管理重置时取消部门选择</li>
<li>优化代码生成同步后字典值NULL问题</li>
<li>优化导出对象的子列表为空会出现[]问题</li>
<li>优化select2搜索下拉后校验必填样式问题</li>
<li>其他细节优化</li>
</ol>
</div>
</div>
</div>
<div class="panel panel-default">
<div class="panel-heading">
<h5 class="panel-title">
<a data-toggle="collapse" data-parent="#version" href="#v475">v4.7.5</a><code class="pull-right">2022.09.05</code>
</h5>
</div>
<div id="v475" class="panel-collapse collapse">
<div class="panel-body">
<ol>
<li>Excel支持导出对象的子列表方法</li>
<li>数据逻辑删除不进行唯一验证</li>
<li>优化多角色数据权限匹配规则</li>
<li>新增主子表提交校验示例</li>
<li>支持自定义隐藏Excel属性列</li>
<li>Excel注解支持backgroundColor属性设置背景颜色</li>
<li>菜单配置刷新时Tab页签切换时刷新</li>
<li>增加对AjaxResult消息结果类型的判断</li>
<li>新增示例(进度条)</li>
<li>新增内容编码/解码方便插件集成使用</li>
<li>升级jquery到最新版3.6.1</li>
<li>升级layui到最新版本2.7.5</li>
<li>升级shiro到最新版本1.9.1</li>
<li>升级druid到最新版本1.2.11</li>
<li>升级pagehelper到最新版1.4.3</li>
<li>升级oshi到最新版本6.2.2</li>
<li>修复树表onLoadSuccess不生效的问题</li>
<li>修复用户分配角色大于默认页数丢失问题</li>
<li>定时任务支持执行父类方法</li>
<li>自动设置切换多个树表格实例配置</li>
<li>页签创建标题优先data-title属性</li>
<li>优化任务过期不执行调度</li>
<li>优化横向菜单下激活菜单样式</li>
<li>优化按钮打开窗口后按回车反复弹出</li>
<li>优化excel/scale属性导出单元格数值类型</li>
<li>优化druid开启wall过滤器出现的异常问题</li>
<li>优化多个相同角色数据导致权限SQL重复问题</li>
<li>其他细节优化</li>
</ol>
</div>
</div>
</div>
<div class="panel panel-default">
<div class="panel-heading">
<h5 class="panel-title">
<a data-toggle="collapse" data-parent="#version" href="#v474">v4.7.4</a><code class="pull-right">2022.06.01</code>
</h5>
</div>
<div id="v474" class="panel-collapse collapse">
<div class="panel-body">
<ol>
<li>用户头像上传图片格式限制</li>
<li>Excel注解支持color属性设置字体颜色</li>
<li>设置分页参数默认值</li>
<li>主子表操作列新增单个删除</li>
<li>定时任务检查Bean包名是否为白名单配置</li>
<li>升级spring-boot到最新版本2.5.14</li>
<li>升级shiro到最新版本1.9.0</li>
<li>升级oshi到最新版本6.1.6</li>
<li>升级fastjson到最新版1.2.83 安全修复版本</li>
<li>文件上传兼容Weblogic环境</li>
<li>新增清理分页的线程变量方法</li>
<li>新增获取不带后缀文件名称方法</li>
<li>用户缓存信息添加部门ancestors祖级列表</li>
<li>自定义ShiroFilterFactoryBean防止中文请求被拦截</li>
<li>字典类型必须以字母开头,且只能为(小写字母,数字,下滑线)</li>
<li>优化IP地址获取到多个的问题</li>
<li>优化表格冻结列阴影效果显示</li>
<li>优化菜单侧边栏滚动条尺寸及颜色</li>
<li>优化显示顺序orderNum类型为整型</li>
<li>优化接口使用泛型使其看到响应属性字段</li>
<li>优化导出数据LocalDateTime类型无数据问题</li>
<li>修复导入Excel时字典字段类型为Long转义为空问题</li>
<li>优化导出excel单元格验证,包含变更为开头.防止正常内容被替换</li>
<li>修复URL类型回退键被禁止问题</li>
<li>修复表格客户端分页序号显示错误问题</li>
<li>修复代码生成拖拽多次出现的排序不正确问题</li>
<li>修复表格打印组件不识别多层对象属性值问题</li>
<li>修复操作日志查询类型条件为0时会查到所有数据</li>
<li>修复Excel注解prompt/combo同时使用不生效问题</li>
<li>修复初始化多表格处理回调函数时获取的表格配置不一致问题</li>
<li>其他细节优化</li>
</ol>
</div>
</div>
</div>
<div class="panel panel-default">
<div class="panel-heading">
<h5 class="panel-title">
<a data-toggle="collapse" data-parent="#version" href="#v473">v4.7.3</a><code class="pull-right">2022.03.01</code>
</h5>
</div>
<div id="v473" class="panel-collapse collapse">
<div class="panel-body">
<ol>
<li>表格树支持分页/异步加载</li>
<li>代码生成预览支持复制内容</li>
<li>定时任务默认保存到内存中执行</li>
<li>代码生成同步保留必填/类型选项</li>
<li>页面若未匹配到字典标签则返回原字典值</li>
<li>用户访问控制时校验数据权限,防止越权</li>
<li>导出Excel时屏蔽公式,防止CSV注入风险</li>
<li>升级spring-boot到最新版本2.5.10</li>
<li>升级spring-boot-mybatis到最新版2.2.2</li>
<li>升级pagehelper到最新版1.4.1</li>
<li>升级oshi到最新版本6.1.2</li>
<li>升级bootstrap-table到最新版本1.19.1</li>
<li>服务监控新增运行参数信息显示</li>
<li>定时任务目标字符串验证包名白名单</li>
<li>文件上传接口新增原/新文件名返回参数</li>
<li>定时任务屏蔽违规的字符</li>
<li>分页数据新增分页参数合理化参数</li>
<li>表格父子视图添加点击事件打开示例</li>
<li>优化上传文件名称命名规则</li>
<li>优化加载字典缓存数据</li>
<li>优化任务队列满时任务拒绝策略</li>
<li>优化IE11上传预览不显示的问题</li>
<li>优化Excel格式化不同类型的日期对象</li>
<li>优化国际化配置多余的zh请求问题</li>
<li>优化新版Chrome浏览器回退出现的遮罩层</li>
<li>修复EMAIL类型回退键被禁止问题</li>
<li>修复Xss注解字段值为空时的异常问题</li>
<li>其他细节优化</li>
</ol>
</div>
</div>
</div>
<div class="panel panel-default">
<div class="panel-heading">
<h5 class="panel-title">
<a data-toggle="collapse" data-parent="#version" href="#v472">v4.7.2</a><code class="pull-right">2021.12.23</code>
</h5>
</div>
<div id="v472" class="panel-collapse collapse">
<div class="panel-body">
<ol>
<li>自定义xss校验注解实现</li>
<li>进入修改页面方法添加权限标识</li>
<li>代码生成创建按钮添加超级管理员权限</li>
<li>代码生成创建表检查关键字,防止注入风险</li>
<li>修复定时任务多参数逗号分隔的问题</li>
<li>修复表格插件一起使用出现的声明报错问题</li>
<li>修复代码生成主子表模板删除方法缺少事务</li>
<li>升级oshi到最新版本v5.8.6</li>
<li>升级velocity到最新版本2.3</li>
<li>升级fastjson到最新版1.2.79</li>
<li>升级log4j2到最新版2.17.0 防止漏洞风险</li>
<li>升级thymeleaf到最新版3.0.14 阻止远程代码执行漏洞</li>
<li>优化修改/授权角色实时生效</li>
<li>修整tomcat配置参数已过期问题</li>
<li>前端添加单独的二代身份证校验</li>
<li>优化新增部门时验证用户所属部门</li>
<li>优化查询用户的角色组&岗位组代码</li>
<li>请求分页方法设置成通用方便灵活调用</li>
<li>优化日期类型错误提示与图标重叠问题</li>
<li>其他细节优化</li>
</ol>
</div>
</div>
</div>
<div class="panel panel-default">
<div class="panel-heading">
<h5 class="panel-title">
<a data-toggle="collapse" data-parent="#version" href="#v471">v4.7.1</a><code class="pull-right">2021.11.10</code>
</h5>
</div>
<div id="v471" class="panel-collapse collapse">
<div class="panel-body">
<ol>
<li>新增是否开启页签功能</li>
<li>代码生成的模块增加创建表功能</li>
<li>Excel导入支持@Excels注解</li>
<li>Excel注解支持导入导出标题信息</li>
<li>Excel注解支持自定义数据处理器</li>
<li>日志注解新增是否保存响应参数</li>
<li>防重提交注解支持配置间隔时间/提示消息</li>
<li>网页部分操作禁止使用后退键(Backspace)</li>
<li>实例演示中增加多层窗口获取值</li>
<li>弹出层openOptions增加动画属性</li>
<li>升级spring-boot到最新版本2.5.6</li>
<li>升级spring-boot-mybatis到最新版2.2.0</li>
<li>升级pagehelper到最新版1.4.0</li>
<li>升级oshi到最新版本v5.8.2</li>
<li>升级druid到最新版1.2.8</li>
<li>升级fastjson到最新版1.2.78</li>
<li>升级thymeleaf-extras-shiro到最新版本v2.1.0</li>
<li>升级bootstrap-fileinput到最新版本v5.2.4</li>
<li>修改阿里云maven仓库地址为新版地址</li>
<li>定时任务屏蔽违规字符</li>
<li>增加sendGet无参请求方法</li>
<li>代码生成去掉多余的排序字段</li>
<li>优化启动脚本参数优化</li>
<li>优化页签关闭右侧清除iframe元素</li>
<li>优化多表格切换表单查询参数</li>
<li>优化表格实例切换event不能为空</li>
<li>优化mybatis全局默认的执行器</li>
<li>优化导入Excel数据关闭时清理file</li>
<li>优化Excel导入图片可能出现的异常</li>
<li>优化记录登录信息,防止不必要的修改</li>
<li>优化aop语法,使用spring自动注入注解</li>
<li>修复无法被反转义问题</li>
<li>修复拖拽行数据错位问题</li>
<li>修复新窗口打开页面关闭弹窗报错</li>
<li>修复富文本回退键被禁止&控制台报错问题</li>
<li>修复自定义弹出层全屏参数无效问题</li>
<li>修复树表代码生成短字段无法识别问题</li>
<li>修复apple/webkit浏览器时间无法格式化</li>
<li>修复后端主子表代码模板方法名生成错误问题</li>
<li>修复swagger没有指定dataTypeClass导致启动出现warn日志</li>
<li>其他细节优化</li>
</ol>
</div>
</div>
</div>
<div class="panel panel-default">
<div class="panel-heading">
<h5 class="panel-title">
<a data-toggle="collapse" data-parent="#version" href="#v470">v4.7.0</a><code class="pull-right">2021.09.01</code>
</h5>
</div>
<div id="v470" class="panel-collapse collapse in">
<div id="v470" class="panel-collapse collapse">
<div class="panel-body">
<ol>
<li>优化弹出层显示在顶层窗口</li>
@@ -11,7 +11,7 @@
<div class="col-sm-4">
<div class="ibox float-e-margins">
<div class="ibox-title">
<h5>缓存列表</h5>
<h5><i class="fa fa-bars"></i> 缓存列表</h5>
<div class="ibox-tools">
<a href="javascript:getCacheNames()"><i class="fa fa-refresh"></i></a>
</div>
@@ -39,7 +39,7 @@
<div class="col-sm-4">
<div class="ibox float-e-margins">
<div class="ibox-title">
<h5>键名列表</h5>
<h5><i class="fa fa-key"></i> 键名列表</h5>
<div class="ibox-tools">
<a href="javascript:getCacheKeys('', true)"><i class="fa fa-refresh"></i></a>
</div>
@@ -53,8 +53,8 @@
<th>操作</th>
</tr>
</thead>
<tbody id="cacheKyes">
<tr th:fragment="fragment-cache-kyes" th:each="cacheKey, stat : ${cacheKyes}">
<tbody id="cacheKeys">
<tr th:fragment="fragment-cache-kyes" th:each="cacheKey, stat : ${cacheKeys}">
<td>[[${stat.index + 1}]]</td>
<td style="word-wrap:break-word;word-break:break-all;" th:onclick="getCacheValue([[${cacheName}]], [[${cacheKey}]])">[[${cacheKey}]]</td>
<td style="width: 50px"><a href="#" th:onclick="clearCacheKey([[${cacheName}]], [[${cacheKey}]])" title="清空"><i class="fa fa-trash-o text-danger"></i></a></td>
@@ -68,7 +68,7 @@
<div class="col-sm-4">
<div class="ibox float-e-margins">
<div class="ibox-title">
<h5>缓存内容</h5>
<h5><i class="fa fa-file-text"></i> 缓存内容</h5>
<div class="ibox-tools">
<a href="javascript:clearAll()"><i class="fa fa-refresh"></i> 清理全部</a>
</div>
@@ -125,7 +125,7 @@ function getCacheKeys(cacheName, isMsg) {
"fragment": 'fragment-cache-kyes'
},
success: function(data) {
$("#cacheKyes").html(data);
$("#cacheKeys").html(data);
$("#cacheName").val(_cacheName);
if (isMsg) {
$.modal.msgSuccess("刷新键名列表成功");
@@ -174,7 +174,7 @@ function clearCacheKey(cacheName, cacheKey) {
function clearAll(){
$.get(prefix + "/clearAll", function(result) {
if (result.code == web_status.SUCCESS) {
$.modal.msgSuccess("清理缓存成功")
$.modal.msgSuccess("清理全部缓存成功")
} else {
$.modal.msgError(result.msg);
}
@@ -24,9 +24,9 @@
</li>
<li class="select-time">
<label>登录时间: </label>
<input type="text" class="time-input" id="startTime" placeholder="开始时间" name="params[beginTime]"/>
<input type="text" class="time-input" id="startTime" placeholder="开始时间"/>
<span>-</span>
<input type="text" class="time-input" id="endTime" placeholder="结束时间" name="params[endTime]"/>
<input type="text" class="time-input" id="endTime" placeholder="结束时间"/>
</li>
<li>
<a class="btn btn-primary btn-rounded btn-sm" onclick="$.table.search()"><i class="fa fa-search"></i>&nbsp;搜索</a>
@@ -69,6 +69,7 @@
cleanUrl: prefix + "/clean",
removeUrl: prefix + "/remove",
exportUrl: prefix + "/export",
queryParams: queryParams,
sortName: "loginTime",
sortOrder: "desc",
modalName: "登录日志",
@@ -90,7 +91,10 @@
},
{
field: 'ipaddr',
title: '登录地址'
title: '登录地址',
formatter: function(value, row, index) {
return $.table.tooltip(value);
}
},
{
field: 'loginLocation',
@@ -125,6 +129,15 @@
$.table.init(options);
});
function queryParams(params) {
var search = $.table.queryParams(params);
search.params = {
beginTime : beginOfTime($("#startTime").val()),
endTime : endOfTime($("#endTime").val())
};
return search;
}
function unlock() {
$.operate.post(prefix + "/unlock?loginName=" + $.table.selectColumns("loginName"));
}
@@ -19,12 +19,7 @@
</div>
<div class="form-group">
<label class="col-sm-2 control-label">请求地址:</label>
<div class="form-control-static" th:text="${operLog.operUrl}">
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">请求方式:</label>
<div class="form-control-static" th:text="${operLog.requestMethod}">
<div class="form-control-static" th:text="${operLog.requestMethod} + ' - ' + ${operLog.operUrl} + ' ' + '(' + '耗时' + ${operLog.costTime} + '毫秒)'">
</div>
</div>
<div class="form-group">
@@ -18,7 +18,7 @@
<label>操作人员: </label><input type="text" name="operName"/>
</li>
<li class="select-selectpicker">
<label>操作类型: </label><select id="businessTypes" th:with="type=${@dict.getType('sys_oper_type')}" class="selectpicker" data-none-selected-text="请选择" multiple>
<label>操作类型: </label><select id="businessTypes" name="businessTypes" th:with="type=${@dict.getType('sys_oper_type')}" class="selectpicker" data-none-selected-text="请选择" multiple>
<option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option>
</select>
</li>
@@ -30,9 +30,9 @@
</li>
<li class="select-time">
<label>操作时间: </label>
<input type="text" class="time-input" id="startTime" placeholder="开始时间" name="params[beginTime]"/>
<input type="text" class="time-input" id="startTime" placeholder="开始时间"/>
<span>-</span>
<input type="text" class="time-input" id="endTime" placeholder="结束时间" name="params[endTime]"/>
<input type="text" class="time-input" id="endTime" placeholder="结束时间"/>
</li>
<li>
<a class="btn btn-primary btn-rounded btn-sm" onclick="searchPre()"><i class="fa fa-search"></i>&nbsp;搜索</a>
@@ -92,14 +92,17 @@
},
{
field: 'title',
title: '系统模块'
},
title: '系统模块',
formatter: function(value, row, index) {
return $.table.tooltip(value);
}
},
{
field: 'businessType',
title: '操作类型',
align: 'center',
formatter: function(value, row, index) {
return $.table.selectDictLabel(datas, value);
return $.table.selectDictLabel(datas, value);
}
},
{
@@ -136,6 +139,14 @@
title: '操作时间',
sortable: true
},
{
field: 'costTime',
title: '消耗时间',
sortable: true,
formatter: function(value, row, index) {
return $.common.sprintf("%s毫秒", value);
}
},
{
title: '操作',
align: 'center',
@@ -151,6 +162,10 @@
function queryParams(params) {
var search = $.table.queryParams(params);
search.params = {
beginTime : beginOfTime($("#startTime").val()),
endTime : endOfTime($("#endTime").val())
};
search.businessTypes = $.common.join($('#businessTypes').selectpicker('val'));
return search;
}
@@ -160,6 +175,7 @@
}
function resetPre() {
resetDate();
$("#operlog-form")[0].reset();
$("#businessTypes").selectpicker('refresh');
$.table.search('operlog-form', 'bootstrap-table');
@@ -10,7 +10,7 @@
<div class="col-sm-6">
<div class="ibox float-e-margins">
<div class="ibox-title">
<h5>CPU</h5>
<h5><i class="fa fa-microchip"></i> CPU</h5>
<div class="ibox-tools">
<a class="collapse-link"><i class="fa fa-chevron-up"></i>
</a>
@@ -51,7 +51,7 @@
<div class="col-sm-6">
<div class="ibox float-e-margins">
<div class="ibox-title">
<h5>内存</h5>
<h5><i class="fa fa-ticket"></i> 内存</h5>
<div class="ibox-tools">
<a class="collapse-link"><i class="fa fa-chevron-up"></i></a>
<a class="close-link"><i class="fa fa-times"></i></a>
@@ -98,7 +98,7 @@
<div class="col-sm-12">
<div class="ibox float-e-margins">
<div class="ibox-title">
<h5>服务器信息</h5>
<h5><i class="fa fa-windows"></i> 服务器信息</h5>
<div class="ibox-tools">
<a class="collapse-link">
<i class="fa fa-chevron-up"></i>
@@ -138,7 +138,7 @@
<div class="col-sm-12">
<div class="ibox float-e-margins">
<div class="ibox-title">
<h5>Java虚拟机信息</h5>
<h5><i class="fa fa-coffee"></i> Java虚拟机信息</h5>
<div class="ibox-tools">
<a class="collapse-link">
<i class="fa fa-chevron-up"></i>
@@ -152,7 +152,7 @@
<div class="row">
<div class="col-sm-12">
<table class="table table-hover margin bottom">
<table class="table table-hover margin bottom" style="table-layout:fixed;">
<tbody>
<tr>
<td>Java名称</td>
@@ -174,6 +174,10 @@
<td colspan="1">项目路径</td>
<td colspan="3" th:text="${server.sys.userDir}"></td>
</tr>
<tr>
<td colspan="1">运行参数</td>
<td colspan="3" th:text="${server.jvm.inputArgs}"></td>
</tr>
</tbody>
</table>
</div>
@@ -187,7 +191,7 @@
<div class="col-sm-12">
<div class="ibox float-e-margins">
<div class="ibox-title">
<h5>磁盘状态</h5>
<h5><i class="fa fa-hdd-o"></i> 磁盘状态</h5>
<div class="ibox-tools">
<a class="collapse-link">
<i class="fa fa-chevron-up"></i>
@@ -9,7 +9,7 @@
<link href="../static/css/font-awesome.min.css" th:href="@{/css/font-awesome.min.css}" rel="stylesheet"/>
<link href="../static/css/style.min.css" th:href="@{/css/style.min.css}" rel="stylesheet"/>
<link href="../static/css/login.min.css" th:href="@{/css/login.min.css}" rel="stylesheet"/>
<link href="../static/ruoyi/css/ry-ui.css" th:href="@{/ruoyi/css/ry-ui.css?v=4.7.0}" rel="stylesheet"/>
<link href="../static/ruoyi/css/ry-ui.css" th:href="@{/ruoyi/css/ry-ui.css?v=4.7.7}" rel="stylesheet"/>
<!-- 360浏览器急速模式 -->
<meta name="renderer" content="webkit">
<!-- 避免IE使用兼容模式 -->
@@ -58,13 +58,13 @@
<input type="checkbox" id="acceptTerm" name="acceptTerm"> <label for="acceptTerm">我已阅读并同意</label>
<a href="https://gitee.com/y_project/RuoYi/blob/master/README.md" target="_blank">使用条款</a>
</div>
<button class="btn btn-success btn-block" id="btnSubmit" data-loading="正在验证注册,请稍...">注册</button>
<button class="btn btn-success btn-block" id="btnSubmit" data-loading="正在验证注册,请稍...">注册</button>
</form>
</div>
</div>
<div class="signup-footer">
<div class="pull-left">
&copy; 2019 All Rights Reserved. RuoYi <br>
&copy; 2018-2023 All Rights Reserved. RuoYi <br>
</div>
</div>
</div>
@@ -74,7 +74,7 @@
<script src="../static/ajax/libs/validate/jquery.validate.min.js" th:src="@{/ajax/libs/validate/jquery.validate.min.js}"></script>
<script src="../static/ajax/libs/layer/layer.min.js" th:src="@{/ajax/libs/layer/layer.min.js}"></script>
<script src="../static/ajax/libs/blockUI/jquery.blockUI.js" th:src="@{/ajax/libs/blockUI/jquery.blockUI.js}"></script>
<script src="../static/ruoyi/js/ry-ui.js" th:src="@{/ruoyi/js/ry-ui.js?v=4.7.0}"></script>
<script src="../static/ruoyi/js/ry-ui.js" th:src="@{/ruoyi/js/ry-ui.js?v=4.7.7}"></script>
<script src="../static/ruoyi/register.js" th:src="@{/ruoyi/register.js}"></script>
</body>
</html>
@@ -140,7 +140,7 @@
</ul>
</body>
<script th:src="@{/js/jquery.min.js}"></script>
<script th:src="@{/ruoyi/js/common.js?v=4.7.0}"></script>
<script th:src="@{/ruoyi/js/common.js?v=4.7.7}"></script>
<script type="text/javascript">
//皮肤样式列表
var skins = ["skin-blue", "skin-green", "skin-purple", "skin-red", "skin-yellow"];
@@ -21,7 +21,7 @@
<div class="form-group">
<label class="col-sm-3 control-label is-required">参数键值:</label>
<div class="col-sm-8">
<input id="configValue" name="configValue" class="form-control" type="text" required>
<textarea id="configValue" name="configValue" class="form-control" rows="4" required></textarea>
</div>
</div>
<div class="form-group">
@@ -57,9 +57,6 @@
"configKey": function() {
return $.common.trim($("#configKey").val());
}
},
dataFilter: function(data, type) {
return $.validate.unique(data);
}
}
},
@@ -87,26 +87,30 @@
field: 'configName',
title: '参数名称',
formatter: function(value, row, index) {
return $.table.tooltip(value);
return $.table.tooltip(value);
}
},
{
field: 'configKey',
title: '参数键名',
formatter: function(value, row, index) {
return $.table.tooltip(value);
return $.table.tooltip(value);
}
},
{
field: 'configValue',
title: '参数键值'
title: '参数键值',
align: 'center',
formatter: function(value, row, index) {
return $.table.tooltip(value, 10, "open");
}
},
{
field: 'configType',
title: '系统内置',
align: 'center',
formatter: function(value, row, index) {
return $.table.selectDictLabel(datas, value);
return $.table.selectDictLabel(datas, value);
}
},
{
@@ -114,7 +118,7 @@
title: '备注',
align: 'center',
formatter: function(value, row, index) {
return $.table.tooltip(value, 10, "open");
return $.table.tooltip(value, 10, "open");
}
},
{
@@ -22,7 +22,7 @@
<div class="form-group">
<label class="col-sm-3 control-label is-required">参数键值:</label>
<div class="col-sm-8">
<input id="configValue" name="configValue" th:field="*{configValue}" class="form-control" type="text" required>
<textarea id="configValue" name="configValue" class="form-control" rows="4" required>[[*{configValue}]]</textarea>
</div>
</div>
<div class="form-group">
@@ -61,9 +61,6 @@
"configKey": function() {
return $.common.trim($("#configKey").val());
}
},
dataFilter: function(data, type) {
return $.validate.unique(data);
}
}
},
@@ -6,12 +6,12 @@
<body class="white-bg">
<div class="wrapper wrapper-content animated fadeInRight ibox-content">
<form class="form-horizontal m" id="form-dept-add">
<input id="treeId" name="parentId" type="hidden" th:value="${dept.deptId}" />
<input id="treeId" name="parentId" type="hidden" th:value="${dept?.deptId}" />
<div class="form-group">
<label class="col-sm-3 control-label">上级部门:</label>
<label class="col-sm-3 control-label is-required">上级部门:</label>
<div class="col-sm-8">
<div class="input-group">
<input class="form-control" type="text" onclick="selectDeptTree()" id="treeName" readonly="true" th:value="${dept.deptName}">
<input class="form-control" type="text" onclick="selectDeptTree()" id="treeName" readonly="true" th:value="${dept?.deptName}" required>
<span class="input-group-addon"><i class="fa fa-search"></i></span>
</div>
</div>
@@ -76,9 +76,6 @@
"deptName" : function() {
return $.common.trim($("#deptName").val());
}
},
dataFilter: function(data, type) {
return $.validate.unique(data);
}
}
},
@@ -108,10 +105,15 @@
/*部门管理-新增-选择父部门树*/
function selectDeptTree() {
var treeId = $("#treeId").val();
if ($.common.isEmpty(treeId)) {
$.modal.alertWarning("请先添加用户所属的部门!");
return;
}
var options = {
title: '部门选择',
width: "380",
url: prefix + "/selectDeptTree/" + $("#treeId").val(),
url: prefix + "/selectDeptTree/" + treeId + "/0",
callBack: doSubmit
};
$.modal.openOptions(options);
@@ -80,9 +80,6 @@
"deptName": function() {
return $.common.trim($("#deptName").val());
}
},
dataFilter: function(data, type) {
return $.validate.unique(data);
}
}
},

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