135 Commits
Author SHA1 Message Date
RuoYi d872c66d19 若依3.2 2019-01-16 23:14:37 +08:00
yuteland若依 1042b40cfc !65 代码生成包名修改
Merge pull request !65 from yutel/master
2019-01-16 18:08:19 +08:00
yutel 070f7bc6bd 更新 Controller.java.vm
解决代码生成时找不到ExcelUtil.java类的问题
2019-01-16 18:02:16 +08:00
RuoYi 4f1c99293f pom 3.2 2019-01-16 15:28:32 +08:00
RuoYi 57fa243747 若依3.2 2019-01-16 14:56:27 +08:00
GeBronand若依 04f2607398 !64 去掉注释中多余参数说明
Merge pull request !64 from GeBron/master
2019-01-16 13:24:46 +08:00
GeBron 01caa02f5e 去掉注释中多余参数说明 2019-01-16 12:58:21 +08:00
RuoYi e37ec9f8fa 用户管理移动端默认隐藏左侧布局 2019-01-13 12:26:09 +08:00
RuoYi 122e8b61a0 详细信息弹出层显示在顶层 2019-01-12 12:08:41 +08:00
RuoYi 2345dfdf42 调整初始密码位置 2019-01-11 10:34:34 +08:00
RuoYi 77550e2f11 用户导入初始密码 2019-01-11 10:14:31 +08:00
RuoYi ca5b4bc852 用户导入 2019-01-11 09:50:16 +08:00
RuoYi 5fc9a63231 新增用户导入权限 2019-01-10 19:51:31 +08:00
ziryand若依 958be505c9 !62 修改样式文件小BUG及改用接口ISysUserOnlineService
Merge pull request !62 from ziry/master
2019-01-10 19:09:55 +08:00
RuoYi ec8c7f1d79 支持用户数据导入 2019-01-10 19:06:15 +08:00
ziry 030b61bc37 修改样式文件小BUG 2019-01-10 15:50:43 +08:00
RuoYi 619e1d241a 升级summernote到最新版本v0.8.11 2019-01-09 16:22:45 +08:00
RuoYi dc07b97cdb 字典数据根据选择下拉新增 2019-01-08 19:30:24 +08:00
RuoYi dd37524b04 修复个人信息修改漏洞 2019-01-08 15:56:49 +08:00
ziry 8c0ebd008e 更新 SysUserOnlineController.java ,改用接口ISysUserOnlineService 2019-01-08 15:42:08 +08:00
RuoYi 0c76d45349 新增修改全屏/确认取消按钮 2019-01-04 11:37:35 +08:00
若依 6237ddb3dc !60 SysJobMapper.deleteJobById改为通过ID删除及修改注释与方法参数对应
Merge pull request !60 from ziry/master
2018-12-29 17:47:01 +08:00
ziry 8643dde074 改为通过ID删除 2018-12-29 16:32:17 +08:00
ziry d22fa29b65 修改注释与方法参数对应 2018-12-29 16:28:54 +08:00
ziry b66097c004 更新 banner.txt
修复启动佛祖保佑图小瑕疵
2018-12-29 15:25:32 +08:00
RuoYi d30dc35e59 代码格式化 2018-12-29 15:18:28 +08:00
RuoYi 87c38706cd Merge branch 'master' of https://gitee.com/y_project/RuoYi 2018-12-29 15:05:53 +08:00
RuoYi f04c1fed50 线程池代码优化 2018-12-29 15:05:29 +08:00
xjt283525476and若依 4474c533e6 !59 修复驼峰转下划线拼接时,简称缩写作为前缀时,转换后首字母后追加了下划线,同时做了代码优化,利于阅读
Merge pull request !59 from xjt283525476/master
2018-12-29 14:25:47 +08:00
xjt283525476 4374a24f79 修复驼峰转下划线拼接时,简称缩写作为前缀时,转换后首字母后追加了下划线 2018-12-29 14:04:16 +08:00
RuoYi 383d082194 类位置迁移 2018-12-29 12:25:46 +08:00
RuoYi e9a7cc7bc7 去除序号居中 2018-12-29 12:04:53 +08:00
xjt283525476and若依 8b07f8925f !57 因笔误导致无意义的判断,同时还会出现空指针异常
Merge pull request !57 from xjt283525476/master
2018-12-29 10:21:58 +08:00
j3eastand若依 2af817d8dc !58 解决tomcat无法退出问题
Merge pull request !58 from j3east/j3east
2018-12-29 10:21:17 +08:00
cj 0e240cb244 代码风格和项目保持一致 2018-12-28 23:05:53 +08:00
cj fc834b35cb 一键打war包 2018-12-28 22:55:31 +08:00
cj 4fa795dee9 确保应用退出时能关闭后台线程 2018-12-28 22:54:38 +08:00
RuoYi 33788ecd02 ry-ui新增序列号生成方法 2018-12-28 17:33:15 +08:00
RuoYi 3d3017804d Excel注解支持多级获取 2018-12-28 16:15:56 +08:00
wangchl 63ee2ba2e7 修复会出现空指针异常 2018-12-28 14:23:23 +08:00
xjt283525476 aac46aa353 修复明显笔误 2018-12-27 19:41:56 +08:00
RuoYi c6e4daedd4 摸版edit缺少; 2018-12-27 11:43:16 +08:00
GeBronand若依 6b9b8ed889 !56 修改注释中的参数名称
Merge pull request !56 from GeBron/master
2018-12-25 23:29:09 +08:00
RuoYi 1f000d9f84 Merge branch 'master' of https://gitee.com/y_project/RuoYi 2018-12-25 23:26:52 +08:00
RuoYi 9d5a702e1f 新增方法$.operate.get(url) 2018-12-25 23:24:38 +08:00
GeBron bb1831f609 修改注释中的参数名称 2018-12-25 20:35:18 +08:00
RuoYi c628cf7ee7 去掉多余; 2018-12-25 17:16:27 +08:00
RuoYi 1de73da333 会话检查优化 2018-12-25 11:56:16 +08:00
RuoYi c404de1773 reset 2018-12-20 19:41:56 +08:00
wangchl cfcd48b6b2 取消配置文件配置从数据源,改为直接从数据库中直接读取 2018-12-20 14:24:02 +08:00
RuoYi a87e1d019d 修正getSubject命名 2018-12-19 18:10:44 +08:00
RuoYi ef91e71d7b 修正登录必填项位置偏移 2018-12-19 14:58:06 +08:00
zhangmritand若依 3bacfc5951 !55 模板
Merge pull request !55 from zhangmrit/ruoyi
2018-12-19 14:54:18 +08:00
zhangmrit b5cd54da66 时区 2018-12-19 14:51:08 +08:00
zhangmrit 0e9925a481 mysql时区和模板修复 2018-12-19 13:55:27 +08:00
RuoYi 7943b765ca 升级MYSQL驱动 2018-12-18 18:16:29 +08:00
RuoYi a74e58f7d5 升级SpringBoot到最新版本2.1.1 2018-12-17 22:32:37 +08:00
RuoYi ea58f8db9c 添加群号 2018-12-14 17:25:04 +08:00
RuoYi 89e21eecea 验证码配置补齐注释 2018-12-14 12:43:31 +08:00
RuoYi 35df1dbcdf 验证码文本字符间距修正 2018-12-14 12:30:33 +08:00
RuoYi 0972bba763 Merge branch 'master' of https://gitee.com/y_project/RuoYi 2018-12-12 13:26:16 +08:00
RuoYi 583b06ca9a 登录界面去除iCheck插件改为自定义css(提升响应速度及部分背景图不适应) 2018-12-12 13:26:01 +08:00
RuoYi 6a4b1898b1 Merge branch 'master' of https://gitee.com/y_project/RuoYi 2018-12-08 23:11:16 +08:00
RuoYi 268f0a6321 陆陆续续收到一些打赏,为了更好的体验已用于演示服务器升级。谢谢各位小伙伴
(2核8G云服务器5M带宽)
2018-12-08 23:11:02 +08:00
RuoYi e56a7e7e57 磁盘(光驱)验证除数不为零 2018-12-06 11:44:20 +08:00
RuoYi 9d225fecb9 修正部门菜单排序字段无效 2018-12-03 20:47:33 +08:00
RuoYi d24481f9a5 部门修改不允许最后层级节点选择 2018-12-01 18:39:54 +08:00
RuoYi 6a592827e8 若依 3.1 2018-12-01 16:14:19 +08:00
RuoYi 451caf12fc 修正选中菜单项无效 2018-11-30 11:37:50 +08:00
zhangmritand若依 7517b1baa9 !46 多余的标签
Merge pull request !46 from zhangmrit/ruoyi
2018-11-28 19:03:37 +08:00
zhangmrit 5d582331d3 多余的标签 2018-11-28 18:32:55 +08:00
tenchiwuyoand若依 2d99d2c286 !45 补全@Override注解;修正注释中参数项;
Merge pull request !45 from tenchiwuyo/master
2018-11-28 16:47:42 +08:00
andy d881d45829 补全@Override注解;修正注释中参数项; 2018-11-28 16:19:53 +08:00
chenzzand若依 66aabcd2b4 !43 修复菜单,部门管理tree控件展开/折叠不可用问题
Merge pull request !43 from chenzz/Branch_bug_fix
2018-11-26 15:37:18 +08:00
chenzz 6128d816de 修复菜单,部门管理tree控件展开/折叠不可用问题 2018-11-26 15:35:37 +08:00
RuoYi 553358aa12 新增提交静默更新表格方法 2018-11-25 17:27:57 +08:00
RuoYi 650f89ac13 任务日志新增详细 2018-11-24 16:13:35 +08:00
RuoYi 1292dcf579 Excel注解新增 height/width/suffix/defaultValue 2018-11-24 08:54:01 +08:00
RuoYi 1c1078565a Merge branch 'master' of https://gitee.com/y_project/RuoYi 2018-11-23 22:43:53 +08:00
RuoYi 4d2d5defb9 Excel注解新增 dateFormat日期格式/readConverterExp读取内容转表达式 2018-11-23 22:43:20 +08:00
wangchl 75f27dc536 删出冗余代码 2018-11-23 17:16:48 +08:00
RuoYi aa06f1adc5 代码生成datas变量全局 2018-11-23 13:26:03 +08:00
RuoYi a42c824e92 文件路径保持与packageName一致 2018-11-22 21:33:57 +08:00
RuoYi 67e87bde94 在线用户服务修改 2018-11-22 13:03:57 +08:00
若依 a2735adc57 !39 ruoyi-system模块下SysUserOnlineServiceImpl未实现ISysUserOnlineService
Merge pull request !39 from TyroneGo/master
2018-11-22 12:35:11 +08:00
Tyrone 80bda1909c SysUserOnlineServiceImpl类没有实现ISysUserOnlineService 2018-11-22 10:27:16 +08:00
RuoYi a46738dd9d 会话获取Principal 2018-11-22 09:28:06 +08:00
RuoYi c96b73bbda 代码生成优化 2018-11-21 23:37:09 +08:00
RuoYi 4fed9a1e50 Merge branch 'master' of https://gitee.com/y_project/RuoYi 2018-11-19 18:05:57 +08:00
RuoYi b0495c23a6 修复热部署引起Null 2018-11-19 18:05:44 +08:00
若依 007a4e5275 !36 注解丢失
Merge pull request !36 from 麦洛/master
2018-11-19 17:06:20 +08:00
麦洛 bf01219420 添加丢失的 @Override注解 2018-11-19 15:43:18 +08:00
RuoYi bcb7ba19f9 系统用户会话命名sysUser 2018-11-18 18:17:40 +08:00
RuoYi d870710af1 系统用户会话命名sysUser 2018-11-18 18:02:20 +08:00
RuoYi 6244e6bf18 全局ajax提示 2018-11-15 18:34:05 +08:00
RuoYi c1be1659ea 增加关闭全屏 2018-11-15 15:33:03 +08:00
RuoYi 6cda301f43 选项卡新增全屏显示 2018-11-15 13:35:41 +08:00
wangchl e5b314cc96 修复定时任务无法删除参数问题 2018-11-15 12:07:20 +08:00
RuoYi 3383418837 新增打包文件 2018-11-15 08:58:54 +08:00
RuoYi 3a44c4e765 日志详细优化 2018-11-14 23:08:52 +08:00
RuoYi 0c5da2cf17 上传头像提交修改 2018-11-14 18:29:59 +08:00
CharlesSongand若依 ecfba42651 !34 BaseController迁移到framework模块的com.ruoyi.web.base路径下
Merge pull request !34 from CharlesSong/master
2018-11-13 16:55:24 +08:00
CharlesSong 26b4f598e2 为了便于二次开发依赖framework项目
1.BaseController迁移到framework com.ruoyi.web.base中
2.admin中的properties 放到root pom中
2018-11-13 16:48:44 +08:00
RuoYi 737c2d8515 前台日期格式转化 2018-11-13 13:07:00 +08:00
RuoYi 8a005a088d 2018年度最受欢迎中国开源软件评选
请给若依/RuoYi 投票,谢谢支持。
https://www.oschina.net/project/top_cn_2018?sort=1
2018-11-12 10:57:54 +08:00
RuoYi dcc534bb2d 2018年度最受欢迎中国开源软件评选
请给若依/RuoYi 投票,谢谢支持。
https://www.oschina.net/project/top_cn_2018?sort=1
2018-11-12 10:55:37 +08:00
RuoYi ebc6a1ade2 登录失败清空验证码 2018-11-07 22:25:36 +08:00
RuoYi 834089ef08 Merge branch 'master' of https://gitee.com/y_project/RuoYi 2018-11-01 17:49:35 +08:00
RuoYi d30b66b633 阿里云双11活动1折团 2018-11-01 17:49:23 +08:00
RuoYi 6a4894e9d1 Merge branch 'master' of https://gitee.com/y_project/RuoYi 2018-10-27 21:39:36 +08:00
RuoYi a44aa5db42 校验cron表达式是否有效 2018-10-27 21:39:01 +08:00
RuoYi 71c3274333 修改finalName 2018-10-26 13:29:07 +08:00
RuoYi 1961ca5197 添加warName 2018-10-26 13:21:40 +08:00
RuoYi ba2d7f418d 部署war包启动说明 2018-10-26 13:01:30 +08:00
RuoYi 83b4c25137 扫描路径修改 2018-10-18 16:48:05 +08:00
RuoYi 6ee8053a9b 内网不查询地址 2018-10-16 20:21:59 +08:00
Skqingand若依 7b0e1c46c5 !32 判断如果是内网IP则不去获取IP地址
Merge pull request !32 from Skqing/master
2018-10-16 19:57:55 +08:00
tenchiwuyoand若依 6c99bc1059 !33 修正参数名称
Merge pull request !33 from tenchiwuyo/master
2018-10-16 19:54:17 +08:00
andy f0dadb0123 Merge remote-tracking branch 'origin/master' 2018-10-16 16:19:16 +08:00
andy 6afaae0c05 修正参数名称,deptId改为operId 2018-10-16 16:17:24 +08:00
Skqing e4b9638bd5 判断如果是内网IP则不去获取IP地址 2018-10-16 12:47:09 +08:00
Administrator 27dee2a63a 增加16号段的电话号码验证 2018-10-15 20:38:16 +08:00
RuoYi 260feb7cef 优化一些细节 2018-10-12 14:10:25 +08:00
tenchiwuyoand若依 c778cd2ac9 !31 表格增加行间隔色配置项
Merge pull request !31 from tenchiwuyo/master
2018-10-12 13:28:59 +08:00
andy 9660e30ca5 增加表格是否行间隔色的option配置项 2018-10-12 13:21:08 +08:00
RuoYi 5285003dee 修复个人信息-修改密码 2018-10-11 20:27:34 +08:00
RuoYi b5e8432e2f 代码生成路径调整 2018-10-10 21:56:19 +08:00
j3eastand若依 4ac96a8348 !30 gitignore更新
Merge pull request !30 from j3east/master
2018-10-09 17:25:02 +08:00
cj f7a0c94c16 不能直接忽略所有名为build的文件夹,因为源代码目录中含也有名为build的文件夹, 2018-10-09 15:39:01 +08:00
RuoYi 16dc6ab57e 父部门不能选择&选择树自适应 2018-10-08 13:41:45 +08:00
j3eastand若依 5b2664a87a !29 添加gitignore
Merge pull request !29 from j3east/master
2018-10-07 23:26:20 +08:00
cj 5070f1325f 添加 gitignore 2018-10-07 23:22:16 +08:00
RuoYi bc48c80240 swagger2-UI 2018-10-07 23:10:09 +08:00
kuangbx ebe67e7bde Merge remote-tracking branch 'origin/master'
# Conflicts:
#	ruoyi-admin/pom.xml
#	ruoyi-framework/pom.xml
2018-10-07 22:29:19 +08:00
kuangbx 211a0ab746 [修改内容]调整Pom依赖,目前ruoyi-admin只依赖ruoyi-framework,ruoyi-framework依赖ruoyi-system,ruoyi-generator,ruoyi-quartz。ruoyi-common为基础模块。
[修改人]匡宝旭
[修改时间]2018-10-07 22:06
[备注]编译,打包,测试均通过
2018-10-07 22:06:58 +08:00
205 changed files with 14845 additions and 21607 deletions
+43
View File
@@ -0,0 +1,43 @@
######################################################################
# Build Tools
.gradle
/build/
!gradle/wrapper/gradle-wrapper.jar
target/
!.mvn/wrapper/maven-wrapper.jar
######################################################################
# IDE
### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
### NetBeans ###
nbproject/private/
build/*
nbbuild/
dist/
nbdist/
.nb-gradle/
######################################################################
# Others
*.log
*.xml.versionsBackup
!*/build/*.java
!*/build/*.html
!*/build/*.xml
+22 -22
View File
@@ -2,17 +2,13 @@
一直想做一款后台管理系统,看了很多优秀的开源项目但是发现没有合适的。于是利用空闲休息时间开始自己写了一套后台系统。如此有了若依。她可以用于所有的Web应用程序,如网站管理后台,网站会员中心,CMS,CRM,OA。所有前端后台代码封装过后十分精简易上手,出错概率低。同时支持移动客户端访问。系统会陆续更新一些实用功能。
性别男,若依是女儿的名字
性别男,若依是给还没有出生女儿的名字(寓意:你若不离不弃,我必生死相依)
若依基于hplus和inspinia两套后台系统模板开发。有需要可自行到群内下载。
http://www.zi-han.net/theme/hplus
http://webapplayers.com/inspinia_admin-v2.7.1
> RuoYi从3.0开始,进行模块拆分,将原先的单应用转变为多模块,如需单应用,请移步 [RuoYi-fast](https://gitee.com/y_project/RuoYi-fast)
> 推荐使用阿里云部署,通用云产品代金券 :[点我领取](https://promotion.aliyun.com/ntms/yunparter/invite.html?userCode=brki8iof)
> 推荐使用阿里云部署,通用云产品代金券 :[点我领取](https://promotion.aliyun.com/ntms/yunparter/invite.html?userCode=brki8iof)
## 内置功能
@@ -30,43 +26,47 @@ http://webapplayers.com/inspinia_admin-v2.7.1
12. 定时任务:在线(添加、修改、删除)任务调度包含执行结果日志。
13. 代码生成:前后端代码的生成(java、html、xml、sql)支持CRUD下载 。
14. 系统接口:根据业务代码自动生成相关的api接口文档。
15. 在线构建器:拖动表单元素生成相应的HTML代码
16. 连接池监视:监视当期系统数据库连接池状态,可进行分析SQL找出系统性能瓶颈
15. 服务监控:监视当前系统CPU、内存、磁盘、堆栈等相关信息
16. 在线构建器:拖动表单元素生成相应的HTML代码
17. 连接池监视:监视当前系统数据库连接池状态,可进行分析SQL找出系统性能瓶颈。
## 在线体验
> admin/admin123
> admin/admin123
> 陆陆续续收到一些打赏,为了更好的体验已用于演示服务器升级。谢谢各位小伙伴。
地址:http://www.ruoyi.vip
演示地址:http://ruoyi.vip
文档地址:http://doc.ruoyi.vip
## 演示图
<table>
<tr>
<td><img src="https://oscimg.oschina.net/oscnet/25b5e333768d013d45a990c152dbe4d9d6e.jpg"/></td>
<td><img src="https://static.oschina.net/uploads/space/2018/1005/194326_GBIJ_1438828.png"/></td>
<td><img src="https://oscimg.oschina.net/oscnet/dfadf4d864242745486aa0167110dfcbeb8.jpg"/></td>
</tr>
<tr>
<td><img src="https://static.oschina.net/uploads/space/2018/1005/194443_Qyuq_1438828.png"/></td>
<td><img src="https://static.oschina.net/uploads/space/2018/1005/194501_U7gT_1438828.png"/></td>
<td><img src="https://oscimg.oschina.net/oscnet/2e1ed87df9b476ed73ed650df20cf009b78.jpg"/></td>
<td><img src="https://oscimg.oschina.net/oscnet/91bef110740ba9e36ff00804f8748a787fb.jpg"/></td>
</tr>
<tr>
<td><img src="https://static.oschina.net/uploads/space/2018/1005/194525_PApp_1438828.png"/></td>
<td><img src="https://static.oschina.net/uploads/space/2018/1005/194535_3EM0_1438828.png"/></td>
<td><img src="https://oscimg.oschina.net/oscnet/9a2851988f4e7433c9322154534865f57d7.jpg"/></td>
<td><img src="https://oscimg.oschina.net/oscnet/396293f80b1e8cce8671f56c296bee78a3a.jpg"/></td>
</tr>
<tr>
<td><img src="https://static.oschina.net/uploads/space/2018/1005/194612_kJ4F_1438828.png"/></td>
<td><img src="https://static.oschina.net/uploads/space/2018/1005/194623_YEXO_1438828.png"/></td>
<td><img src="https://oscimg.oschina.net/oscnet/787b3b06430a403655b48b9bcd1fa829555.jpg"/></td>
<td><img src="https://oscimg.oschina.net/oscnet/a51820009836276b778bc89d4d0e217e26d.jpg"/></td>
</tr>
<tr>
<td><img src="https://static.oschina.net/uploads/space/2018/0902/132548_ne4U_1438828.png"/></td>
<td><img src="https://static.oschina.net/uploads/space/2018/1005/194643_MsxF_1438828.png"/></td>
<td><img src="https://oscimg.oschina.net/oscnet/5fb138478adeda6825e206d21f67ecd0625.jpg"/></td>
<td><img src="https://oscimg.oschina.net/oscnet/fa2f027a10707a4eb4fc47d5ea1c3d2b772.jpg"/></td>
</tr>
<tr>
<td><img src="https://static.oschina.net/uploads/space/2018/1005/194658_40L4_1438828.png"/></td>
<td><img src="https://static.oschina.net/uploads/space/2018/1005/194712_2ma3_1438828.png"/></td>
<td><img src="https://oscimg.oschina.net/oscnet/a714056081523b7dfa782cda866e8be4adc.jpg"/></td>
<td><img src="https://oscimg.oschina.net/oscnet/ab4b5797dfb2bc68c4974ad5458bd5f5bcf.jpg"/></td>
</tr>
</table>
## 若依交流群
QQ群: [![加入QQ群](https://img.shields.io/badge/已满-1389287-blue.svg)](https://jq.qq.com/?_wv=1027&k=5HBAaYN) [![加入QQ群](https://img.shields.io/badge/QQ群-1679294-blue.svg)](https://jq.qq.com/?_wv=1027&k=5cHeRVW) 点击按钮入群。
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/QQ群-1529866-blue.svg)](https://jq.qq.com/?_wv=1027&k=53R0L5Z) 点击按钮入群。
+14
View File
@@ -0,0 +1,14 @@
@echo off
echo.
echo [信息] 清理生成路径。
echo.
pause
echo.
cd %~dp0
cd..
call mvn clean
cd bin
pause
+13
View File
@@ -0,0 +1,13 @@
@echo off
echo.
echo [信息] 打包工程,生成jar包文件。
echo.
pause
echo.
cd %~dp0
cd..
call mvn clean package -Dmaven.test.skip=true
pause
+25 -4
View File
@@ -6,14 +6,14 @@
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi</artifactId>
<version>3.0</version>
<version>3.2</version>
<name>ruoyi</name>
<url>http://www.ruoyi.vip</url>
<description>若依管理系统</description>
<properties>
<ruoyi.version>3.0</ruoyi.version>
<ruoyi.version>3.2</ruoyi.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
@@ -24,6 +24,8 @@
<bitwalker.version>1.19</bitwalker.version>
<kaptcha.version>2.3.2</kaptcha.version>
<swagger.version>2.7.0</swagger.version>
<pagehelper.boot.version>1.2.5</pagehelper.boot.version>
<oshi.version>3.9.1</oshi.version>
</properties>
<dependencyManagement>
@@ -31,7 +33,7 @@
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.0.5.RELEASE</version>
<version>2.1.1.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
@@ -50,7 +52,26 @@
<dependencies>
<!--Spring框架基本的核心工具-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
<!-- SpringBoot集成mybatis框架 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis.boot.version}</version>
</dependency>
<!-- Mysql驱动包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
+79 -107
View File
@@ -1,108 +1,80 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>ruoyi</artifactId>
<groupId>com.ruoyi</groupId>
<version>3.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>ruoyi-admin</artifactId>
<description>
web服务入口
</description>
<properties>
<pagehelper.boot.version>1.2.5</pagehelper.boot.version>
<swagger.version>2.7.0</swagger.version>
</properties>
<dependencies>
<!-- SpringBoot Web容器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- SpringBoot集成thymeleaf模板 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!-- spring-boot-devtools -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional> <!-- 表示依赖不会传递 -->
</dependency>
<!-- pagehelper 分页插件 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>${pagehelper.boot.version}</version>
</dependency>
<!-- swagger2-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>${swagger.version}</version>
</dependency>
<!-- swagger2-UI-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>${swagger.version}</version>
</dependency>
<!-- 核心模块-->
<dependency>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-framework</artifactId>
<version>${ruoyi.version}</version>
</dependency>
<!-- 定时任务-->
<dependency>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-quartz</artifactId>
<version>${ruoyi.version}</version>
</dependency>
<!-- 代码生成-->
<dependency>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-generator</artifactId>
<version>${ruoyi.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork> <!-- 如果没有该配置,devtools不会生效 -->
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
<finalName>ruoyi-${ruoyi.version}</finalName>
</build>
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>ruoyi</artifactId>
<groupId>com.ruoyi</groupId>
<version>3.2</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<packaging>jar</packaging>
<artifactId>ruoyi-admin</artifactId>
<description>
web服务入口
</description>
<dependencies>
<!-- spring-boot-devtools -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional> <!-- 表示依赖不会传递 -->
</dependency>
<!-- swagger2-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>${swagger.version}</version>
</dependency>
<!-- swagger2-UI-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>${swagger.version}</version>
</dependency>
<!-- 核心模块-->
<dependency>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-framework</artifactId>
<version>${ruoyi.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork> <!-- 如果没有该配置,devtools不会生效 -->
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
<warName>${artifactId}</warName>
</configuration>
</plugin>
</plugins>
<finalName>${artifactId}</finalName>
</build>
</project>
@@ -6,10 +6,17 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import com.ruoyi.common.base.AjaxResult;
import com.ruoyi.common.config.Global;
import com.ruoyi.common.utils.file.FileUtils;
import com.ruoyi.framework.config.ServerConfig;
import com.ruoyi.framework.util.FileUploadUtils;
/**
* 通用请求处理
@@ -21,7 +28,21 @@ public class CommonController
{
private static final Logger log = LoggerFactory.getLogger(CommonController.class);
@RequestMapping("common/download")
/**
* 文件上传路径
*/
public static final String UPLOAD_PATH = "/profile/upload/";
@Autowired
private ServerConfig serverConfig;
/**
* 通用下载请求
*
* @param fileName 文件名称
* @param delete 是否删除
*/
@GetMapping("common/download")
public void fileDownload(String fileName, Boolean delete, HttpServletResponse response, HttpServletRequest request)
{
String realFileName = System.currentTimeMillis() + fileName.substring(fileName.indexOf("_") + 1);
@@ -31,7 +52,8 @@ public class CommonController
response.setCharacterEncoding("utf-8");
response.setContentType("multipart/form-data");
response.setHeader("Content-Disposition", "attachment;fileName=" + setFileDownloadHeader(request, realFileName));
response.setHeader("Content-Disposition",
"attachment;fileName=" + setFileDownloadHeader(request, realFileName));
FileUtils.writeBytes(filePath, response.getOutputStream());
if (delete)
{
@@ -44,6 +66,31 @@ public class CommonController
}
}
/**
* 通用上传请求
*/
@PostMapping("/common/upload")
@ResponseBody
public AjaxResult uploadFile(MultipartFile file) throws Exception
{
try
{
// 上传文件路径
String filePath = Global.getUploadPath();
// 上传并返回新文件名称
String fileName = FileUploadUtils.upload(filePath, file);
String url = serverConfig.getUrl() + UPLOAD_PATH + fileName;
AjaxResult ajax = AjaxResult.success();
ajax.put("fileName", fileName);
ajax.put("url", url);
return ajax;
}
catch (Exception e)
{
return AjaxResult.error(e.getMessage());
}
}
public String setFileDownloadHeader(HttpServletRequest request, String fileName) throws UnsupportedEncodingException
{
final String agent = request.getHeader("USER-AGENT");
@@ -4,7 +4,7 @@ import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import com.ruoyi.web.core.base.BaseController;
import com.ruoyi.framework.web.base.BaseController;
/**
* druid 监控
@@ -0,0 +1,31 @@
package com.ruoyi.web.controller.monitor;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import com.ruoyi.framework.web.base.BaseController;
import com.ruoyi.framework.web.domain.Server;
/**
* 服务器监控
*
* @author ruoyi
*/
@Controller
@RequestMapping("/monitor/server")
public class ServerController extends BaseController
{
private String prefix = "monitor/server";
@RequiresPermissions("monitor:server:view")
@GetMapping()
public String server(ModelMap mmap) throws Exception
{
Server server = new Server();
server.copyTo();
mmap.put("server", server);
return prefix + "/server";
}
}
@@ -13,12 +13,12 @@ import org.springframework.web.bind.annotation.ResponseBody;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.base.AjaxResult;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.ExcelUtil;
import com.ruoyi.common.page.TableDataInfo;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.util.ShiroUtils;
import com.ruoyi.framework.web.page.TableDataInfo;
import com.ruoyi.quartz.domain.SysJob;
import com.ruoyi.quartz.service.ISysJobService;
import com.ruoyi.web.core.base.BaseController;
import com.ruoyi.framework.web.base.BaseController;
/**
* 调度任务信息操作处理
@@ -27,7 +27,7 @@ import com.ruoyi.web.core.base.BaseController;
*/
@Controller
@RequestMapping("/monitor/job")
public class JobController extends BaseController
public class SysJobController extends BaseController
{
private String prefix = "monitor/job";
@@ -59,7 +59,7 @@ public class JobController extends BaseController
{
List<SysJob> list = jobService.selectJobList(job);
ExcelUtil<SysJob> util = new ExcelUtil<SysJob>(SysJob.class);
return util.exportExcel(list, "job");
return util.exportExcel(list, "定时任务");
}
@Log(title = "定时任务", businessType = BusinessType.DELETE)
@@ -80,6 +80,15 @@ public class JobController extends BaseController
}
}
@RequiresPermissions("monitor:job:detail")
@GetMapping("/detail/{jobId}")
public String detail(@PathVariable("jobId") Long jobId, ModelMap mmap)
{
mmap.put("name", "job");
mmap.put("job", jobService.selectJobById(jobId));
return prefix + "/detail";
}
/**
* 任务调度状态修改
*/
@@ -149,4 +158,14 @@ public class JobController extends BaseController
job.setUpdateBy(ShiroUtils.getLoginName());
return toAjax(jobService.updateJobCron(job));
}
/**
* 校验cron表达式是否有效
*/
@PostMapping("/checkCronExpressionIsValid")
@ResponseBody
public boolean checkCronExpressionIsValid(SysJob job)
{
return jobService.checkCronExpressionIsValid(job.getCronExpression());
}
}
@@ -4,18 +4,20 @@ import java.util.List;
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.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
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.base.AjaxResult;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.ExcelUtil;
import com.ruoyi.framework.web.page.TableDataInfo;
import com.ruoyi.common.page.TableDataInfo;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.web.base.BaseController;
import com.ruoyi.quartz.domain.SysJobLog;
import com.ruoyi.quartz.service.ISysJobLogService;
import com.ruoyi.web.core.base.BaseController;
/**
* 调度日志操作处理
@@ -24,7 +26,7 @@ import com.ruoyi.web.core.base.BaseController;
*/
@Controller
@RequestMapping("/monitor/jobLog")
public class JobLogController extends BaseController
public class SysJobLogController extends BaseController
{
private String prefix = "monitor/job";
@@ -56,7 +58,7 @@ public class JobLogController extends BaseController
{
List<SysJobLog> list = jobLogService.selectJobLogList(jobLog);
ExcelUtil<SysJobLog> util = new ExcelUtil<SysJobLog>(SysJobLog.class);
return util.exportExcel(list, "jobLog");
return util.exportExcel(list, "调度日志");
}
@Log(title = "调度日志", businessType = BusinessType.DELETE)
@@ -67,7 +69,16 @@ public class JobLogController extends BaseController
{
return toAjax(jobLogService.deleteJobLogByIds(ids));
}
@RequiresPermissions("monitor:job:detail")
@GetMapping("/detail/{jobLogId}")
public String detail(@PathVariable("jobLogId") Long jobLogId, ModelMap mmap)
{
mmap.put("name", "jobLog");
mmap.put("jobLog", jobLogService.selectJobLogById(jobLogId));
return prefix + "/detail";
}
@Log(title = "调度日志", businessType = BusinessType.CLEAN)
@RequiresPermissions("monitor:job:remove")
@PostMapping("/clean")
@@ -11,11 +11,11 @@ import org.springframework.web.bind.annotation.ResponseBody;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.base.AjaxResult;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.ExcelUtil;
import com.ruoyi.framework.web.page.TableDataInfo;
import com.ruoyi.common.page.TableDataInfo;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.system.domain.SysLogininfor;
import com.ruoyi.system.service.ISysLogininforService;
import com.ruoyi.web.core.base.BaseController;
import com.ruoyi.framework.web.base.BaseController;
/**
* 系统访问记录
@@ -24,7 +24,7 @@ import com.ruoyi.web.core.base.BaseController;
*/
@Controller
@RequestMapping("/monitor/logininfor")
public class LogininforController extends BaseController
public class SysLogininforController extends BaseController
{
private String prefix = "monitor/logininfor";
@@ -56,7 +56,7 @@ public class LogininforController extends BaseController
{
List<SysLogininfor> list = logininforService.selectLogininforList(logininfor);
ExcelUtil<SysLogininfor> util = new ExcelUtil<SysLogininfor>(SysLogininfor.class);
return util.exportExcel(list, "logininfor");
return util.exportExcel(list, "登陆日志");
}
@RequiresPermissions("monitor:logininfor:remove")
@@ -13,11 +13,11 @@ import org.springframework.web.bind.annotation.ResponseBody;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.base.AjaxResult;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.ExcelUtil;
import com.ruoyi.framework.web.page.TableDataInfo;
import com.ruoyi.common.page.TableDataInfo;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.system.domain.SysOperLog;
import com.ruoyi.system.service.ISysOperLogService;
import com.ruoyi.web.core.base.BaseController;
import com.ruoyi.framework.web.base.BaseController;
/**
* 操作日志记录
@@ -26,7 +26,7 @@ import com.ruoyi.web.core.base.BaseController;
*/
@Controller
@RequestMapping("/monitor/operlog")
public class OperlogController extends BaseController
public class SysOperlogController extends BaseController
{
private String prefix = "monitor/operlog";
@@ -58,7 +58,7 @@ public class OperlogController extends BaseController
{
List<SysOperLog> list = operLogService.selectOperLogList(operLog);
ExcelUtil<SysOperLog> util = new ExcelUtil<SysOperLog>(SysOperLog.class);
return util.exportExcel(list, "operLog");
return util.exportExcel(list, "操作日志");
}
@RequiresPermissions("monitor:operlog:remove")
@@ -71,9 +71,9 @@ public class OperlogController extends BaseController
@RequiresPermissions("monitor:operlog:detail")
@GetMapping("/detail/{operId}")
public String detail(@PathVariable("operId") Long deptId, ModelMap mmap)
public String detail(@PathVariable("operId") Long operId, ModelMap mmap)
{
mmap.put("operLog", operLogService.selectOperLogById(deptId));
mmap.put("operLog", operLogService.selectOperLogById(operId));
return prefix + "/detail";
}
@@ -13,13 +13,13 @@ import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.base.AjaxResult;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.enums.OnlineStatus;
import com.ruoyi.common.page.TableDataInfo;
import com.ruoyi.framework.shiro.session.OnlineSession;
import com.ruoyi.framework.shiro.session.OnlineSessionDAO;
import com.ruoyi.framework.util.ShiroUtils;
import com.ruoyi.framework.web.page.TableDataInfo;
import com.ruoyi.system.domain.SysUserOnline;
import com.ruoyi.system.service.impl.SysUserOnlineServiceImpl;
import com.ruoyi.web.core.base.BaseController;
import com.ruoyi.system.service.ISysUserOnlineService;
import com.ruoyi.framework.web.base.BaseController;
/**
* 在线用户监控
@@ -28,12 +28,12 @@ import com.ruoyi.web.core.base.BaseController;
*/
@Controller
@RequestMapping("/monitor/online")
public class UserOnlineController extends BaseController
public class SysUserOnlineController extends BaseController
{
private String prefix = "monitor/online";
@Autowired
private SysUserOnlineServiceImpl userOnlineService;
private ISysUserOnlineService userOnlineService;
@Autowired
private OnlineSessionDAO onlineSessionDAO;
@@ -14,7 +14,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import com.google.code.kaptcha.Constants;
import com.google.code.kaptcha.Producer;
import com.ruoyi.web.core.base.BaseController;
import com.ruoyi.framework.web.base.BaseController;
/**
* 图片验证码支持算术形式
@@ -23,7 +23,7 @@ import com.ruoyi.web.core.base.BaseController;
*/
@Controller
@RequestMapping("/captcha")
public class CaptchaController extends BaseController
public class SysCaptchaController extends BaseController
{
@Resource(name = "captchaProducer")
private Producer captchaProducer;
@@ -13,12 +13,12 @@ import org.springframework.web.bind.annotation.ResponseBody;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.base.AjaxResult;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.ExcelUtil;
import com.ruoyi.common.page.TableDataInfo;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.util.ShiroUtils;
import com.ruoyi.framework.web.page.TableDataInfo;
import com.ruoyi.system.domain.SysConfig;
import com.ruoyi.system.service.ISysConfigService;
import com.ruoyi.web.core.base.BaseController;
import com.ruoyi.framework.web.base.BaseController;
/**
* 参数配置 信息操作处理
@@ -27,7 +27,7 @@ import com.ruoyi.web.core.base.BaseController;
*/
@Controller
@RequestMapping("/system/config")
public class ConfigController extends BaseController
public class SysConfigController extends BaseController
{
private String prefix = "system/config";
@@ -62,7 +62,7 @@ public class ConfigController extends BaseController
{
List<SysConfig> list = configService.selectConfigList(config);
ExcelUtil<SysConfig> util = new ExcelUtil<SysConfig>(SysConfig.class);
return util.exportExcel(list, "config");
return util.exportExcel(list, "参数数据");
}
/**
@@ -11,6 +11,7 @@ import org.springframework.web.bind.annotation.PathVariable;
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.utils.StringUtils;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.base.AjaxResult;
import com.ruoyi.common.enums.BusinessType;
@@ -18,7 +19,7 @@ import com.ruoyi.framework.util.ShiroUtils;
import com.ruoyi.system.domain.SysDept;
import com.ruoyi.system.domain.SysRole;
import com.ruoyi.system.service.ISysDeptService;
import com.ruoyi.web.core.base.BaseController;
import com.ruoyi.framework.web.base.BaseController;
/**
* 部门信息
@@ -27,7 +28,7 @@ import com.ruoyi.web.core.base.BaseController;
*/
@Controller
@RequestMapping("/system/dept")
public class DeptController extends BaseController
public class SysDeptController extends BaseController
{
private String prefix = "system/dept";
@@ -79,7 +80,12 @@ public class DeptController extends BaseController
@GetMapping("/edit/{deptId}")
public String edit(@PathVariable("deptId") Long deptId, ModelMap mmap)
{
mmap.put("dept", deptService.selectDeptById(deptId));
SysDept dept = deptService.selectDeptById(deptId);
if (StringUtils.isNotNull(dept) && 100L == deptId)
{
dept.setParentName("");
}
mmap.put("dept", dept);
return prefix + "/edit";
}
@@ -143,7 +149,7 @@ public class DeptController extends BaseController
@ResponseBody
public List<Map<String, Object>> treeData()
{
List<Map<String, Object>> tree = deptService.selectDeptTree();
List<Map<String, Object>> tree = deptService.selectDeptTree(new SysDept());
return tree;
}
@@ -13,12 +13,12 @@ import org.springframework.web.bind.annotation.ResponseBody;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.base.AjaxResult;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.ExcelUtil;
import com.ruoyi.common.page.TableDataInfo;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.util.ShiroUtils;
import com.ruoyi.framework.web.page.TableDataInfo;
import com.ruoyi.system.domain.SysDictData;
import com.ruoyi.system.service.ISysDictDataService;
import com.ruoyi.web.core.base.BaseController;
import com.ruoyi.framework.web.base.BaseController;
/**
* 数据字典信息
@@ -27,7 +27,7 @@ import com.ruoyi.web.core.base.BaseController;
*/
@Controller
@RequestMapping("/system/dict/data")
public class DictDataController extends BaseController
public class SysDictDataController extends BaseController
{
private String prefix = "system/dict/data";
@@ -59,7 +59,7 @@ public class DictDataController extends BaseController
{
List<SysDictData> list = dictDataService.selectDictDataList(dictData);
ExcelUtil<SysDictData> util = new ExcelUtil<SysDictData>(SysDictData.class);
return util.exportExcel(list, "dictData");
return util.exportExcel(list, "字典数据");
}
/**
@@ -13,12 +13,12 @@ import org.springframework.web.bind.annotation.ResponseBody;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.base.AjaxResult;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.ExcelUtil;
import com.ruoyi.common.page.TableDataInfo;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.util.ShiroUtils;
import com.ruoyi.framework.web.page.TableDataInfo;
import com.ruoyi.system.domain.SysDictType;
import com.ruoyi.system.service.ISysDictTypeService;
import com.ruoyi.web.core.base.BaseController;
import com.ruoyi.framework.web.base.BaseController;
/**
* 数据字典信息
@@ -27,7 +27,7 @@ import com.ruoyi.web.core.base.BaseController;
*/
@Controller
@RequestMapping("/system/dict")
public class DictTypeController extends BaseController
public class SysDictTypeController extends BaseController
{
private String prefix = "system/dict/type";
@@ -60,7 +60,7 @@ public class DictTypeController extends BaseController
List<SysDictType> list = dictTypeService.selectDictTypeList(dictType);
ExcelUtil<SysDictType> util = new ExcelUtil<SysDictType>(SysDictType.class);
return util.exportExcel(list, "dictType");
return util.exportExcel(list, "字典类型");
}
/**
@@ -9,7 +9,7 @@ import com.ruoyi.common.config.Global;
import com.ruoyi.system.domain.SysMenu;
import com.ruoyi.system.domain.SysUser;
import com.ruoyi.system.service.ISysMenuService;
import com.ruoyi.web.core.base.BaseController;
import com.ruoyi.framework.web.base.BaseController;
/**
* 首页 业务处理
@@ -17,7 +17,7 @@ import com.ruoyi.web.core.base.BaseController;
* @author ruoyi
*/
@Controller
public class IndexController extends BaseController
public class SysIndexController extends BaseController
{
@Autowired
private ISysMenuService menuService;
@@ -27,7 +27,7 @@ public class IndexController extends BaseController
public String index(ModelMap mmap)
{
// 取身份信息
SysUser user = getUser();
SysUser user = getSysUser();
// 根据用户id取出菜单
List<SysMenu> menus = menuService.selectMenusByUser(user);
mmap.put("menus", menus);
@@ -13,7 +13,7 @@ import org.springframework.web.bind.annotation.ResponseBody;
import com.ruoyi.common.base.AjaxResult;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.framework.util.ServletUtils;
import com.ruoyi.web.core.base.BaseController;
import com.ruoyi.framework.web.base.BaseController;
/**
* 登录验证
@@ -21,7 +21,7 @@ import com.ruoyi.web.core.base.BaseController;
* @author ruoyi
*/
@Controller
public class LoginController extends BaseController
public class SysLoginController extends BaseController
{
@GetMapping("/login")
public String login(HttpServletRequest request, HttpServletResponse response)
@@ -18,7 +18,7 @@ import com.ruoyi.framework.util.ShiroUtils;
import com.ruoyi.system.domain.SysMenu;
import com.ruoyi.system.domain.SysRole;
import com.ruoyi.system.service.ISysMenuService;
import com.ruoyi.web.core.base.BaseController;
import com.ruoyi.framework.web.base.BaseController;
/**
* 菜单信息
@@ -27,7 +27,7 @@ import com.ruoyi.web.core.base.BaseController;
*/
@Controller
@RequestMapping("/system/menu")
public class MenuController extends BaseController
public class SysMenuController extends BaseController
{
private String prefix = "system/menu";
@@ -13,11 +13,11 @@ import org.springframework.web.bind.annotation.ResponseBody;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.base.AjaxResult;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.page.TableDataInfo;
import com.ruoyi.framework.util.ShiroUtils;
import com.ruoyi.framework.web.page.TableDataInfo;
import com.ruoyi.system.domain.SysNotice;
import com.ruoyi.system.service.ISysNoticeService;
import com.ruoyi.web.core.base.BaseController;
import com.ruoyi.framework.web.base.BaseController;
/**
* 公告 信息操作处理
@@ -26,7 +26,7 @@ import com.ruoyi.web.core.base.BaseController;
*/
@Controller
@RequestMapping("/system/notice")
public class NoticeController extends BaseController
public class SysNoticeController extends BaseController
{
private String prefix = "system/notice";
@@ -13,12 +13,12 @@ import org.springframework.web.bind.annotation.ResponseBody;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.base.AjaxResult;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.ExcelUtil;
import com.ruoyi.common.page.TableDataInfo;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.util.ShiroUtils;
import com.ruoyi.framework.web.page.TableDataInfo;
import com.ruoyi.system.domain.SysPost;
import com.ruoyi.system.service.ISysPostService;
import com.ruoyi.web.core.base.BaseController;
import com.ruoyi.framework.web.base.BaseController;
/**
* 岗位信息操作处理
@@ -27,7 +27,7 @@ import com.ruoyi.web.core.base.BaseController;
*/
@Controller
@RequestMapping("/system/post")
public class PostController extends BaseController
public class SysPostController extends BaseController
{
private String prefix = "system/post";
@@ -59,7 +59,7 @@ public class PostController extends BaseController
{
List<SysPost> list = postService.selectPostList(post);
ExcelUtil<SysPost> util = new ExcelUtil<SysPost>(SysPost.class);
return util.exportExcel(list, "post");
return util.exportExcel(list, "岗位数据");
}
@RequiresPermissions("system:post:remove")
@@ -1,13 +1,11 @@
package com.ruoyi.web.controller.system;
import org.apache.shiro.crypto.hash.Md5Hash;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
@@ -17,11 +15,14 @@ import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.base.AjaxResult;
import com.ruoyi.common.config.Global;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.framework.shiro.service.SysPasswordService;
import com.ruoyi.framework.util.FileUploadUtils;
import com.ruoyi.framework.util.ShiroUtils;
import com.ruoyi.system.domain.SysUser;
import com.ruoyi.system.service.ISysDictDataService;
import com.ruoyi.system.service.ISysUserService;
import com.ruoyi.web.core.base.BaseController;
import com.ruoyi.framework.web.base.BaseController;
/**
* 个人信息 业务处理
@@ -30,14 +31,17 @@ import com.ruoyi.web.core.base.BaseController;
*/
@Controller
@RequestMapping("/system/user/profile")
public class ProfileController extends BaseController
public class SysProfileController extends BaseController
{
private static final Logger log = LoggerFactory.getLogger(ProfileController.class);
private static final Logger log = LoggerFactory.getLogger(SysProfileController.class);
private String prefix = "system/user/profile";
@Autowired
private ISysUserService userService;
@Autowired
private SysPasswordService passwordService;
@Autowired
private ISysDictDataService dictDataService;
@@ -48,7 +52,7 @@ public class ProfileController extends BaseController
@GetMapping()
public String profile(ModelMap mmap)
{
SysUser user = getUser();
SysUser user = getSysUser();
user.setSex(dictDataService.selectDictLabel("sys_user_sex", user.getSex()));
mmap.put("user", user);
mmap.put("roleGroup", userService.selectUserRoleGroup(user.getUserId()));
@@ -60,53 +64,64 @@ public class ProfileController extends BaseController
@ResponseBody
public boolean checkPassword(String password)
{
SysUser user = getUser();
String encrypt = new Md5Hash(user.getLoginName() + password + user.getSalt()).toHex().toString();
if (user.getPassword().equals(encrypt))
SysUser user = getSysUser();
if (passwordService.matches(user, password))
{
return true;
}
return false;
}
@GetMapping("/resetPwd/{userId}")
public String resetPwd(@PathVariable("userId") Long userId, ModelMap mmap)
@GetMapping("/resetPwd")
public String resetPwd(ModelMap mmap)
{
mmap.put("user", userService.selectUserById(userId));
SysUser user = getSysUser();
mmap.put("user", userService.selectUserById(user.getUserId()));
return prefix + "/resetPwd";
}
@Log(title = "重置密码", businessType = BusinessType.UPDATE)
@PostMapping("/resetPwd")
@ResponseBody
public AjaxResult resetPwd(SysUser user)
public AjaxResult resetPwd(String oldPassword, String newPassword)
{
int rows = userService.resetUserPwd(user);
if (rows > 0)
SysUser user = getSysUser();
if (StringUtils.isNotEmpty(newPassword) && passwordService.matches(user, oldPassword))
{
setUser(userService.selectUserById(user.getUserId()));
return success();
user.setSalt(ShiroUtils.randomSalt());
user.setPassword(passwordService.encryptPassword(user.getLoginName(), newPassword, user.getSalt()));
if (userService.resetUserPwd(user) > 0)
{
setSysUser(userService.selectUserById(user.getUserId()));
return success();
}
return error();
}
else
{
return error("修改密码失败,旧密码错误");
}
return error();
}
/**
* 修改用户
*/
@GetMapping("/edit/{userId}")
public String edit(@PathVariable("userId") Long userId, ModelMap mmap)
@GetMapping("/edit")
public String edit(ModelMap mmap)
{
mmap.put("user", userService.selectUserById(userId));
SysUser user = getSysUser();
mmap.put("user", userService.selectUserById(user.getUserId()));
return prefix + "/edit";
}
/**
* 修改头像
*/
@GetMapping("/avatar/{userId}")
public String avatar(@PathVariable("userId") Long userId, ModelMap mmap)
@GetMapping("/avatar")
public String avatar(ModelMap mmap)
{
mmap.put("user", userService.selectUserById(userId));
SysUser user = getSysUser();
mmap.put("user", userService.selectUserById(user.getUserId()));
return prefix + "/avatar";
}
@@ -118,9 +133,14 @@ public class ProfileController extends BaseController
@ResponseBody
public AjaxResult update(SysUser user)
{
if (userService.updateUserInfo(user) > 0)
SysUser currentUser = getSysUser();
currentUser.setUserName(user.getUserName());
currentUser.setEmail(user.getEmail());
currentUser.setPhonenumber(user.getPhonenumber());
currentUser.setSex(user.getSex());
if (userService.updateUserInfo(currentUser) > 0)
{
setUser(userService.selectUserById(user.getUserId()));
setSysUser(userService.selectUserById(currentUser.getUserId()));
return success();
}
return error();
@@ -132,17 +152,18 @@ public class ProfileController extends BaseController
@Log(title = "个人信息", businessType = BusinessType.UPDATE)
@PostMapping("/updateAvatar")
@ResponseBody
public AjaxResult updateAvatar(SysUser user, @RequestParam("avatarfile") MultipartFile file)
public AjaxResult updateAvatar(@RequestParam("avatarfile") MultipartFile file)
{
SysUser currentUser = getSysUser();
try
{
if (!file.isEmpty())
{
String avatar = FileUploadUtils.upload(Global.getAvatarPath(), file);
user.setAvatar(avatar);
if (userService.updateUserInfo(user) > 0)
currentUser.setAvatar(avatar);
if (userService.updateUserInfo(currentUser) > 0)
{
setUser(userService.selectUserById(user.getUserId()));
setSysUser(userService.selectUserById(currentUser.getUserId()));
return success();
}
}
@@ -14,12 +14,12 @@ import org.springframework.web.bind.annotation.ResponseBody;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.base.AjaxResult;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.ExcelUtil;
import com.ruoyi.common.page.TableDataInfo;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.util.ShiroUtils;
import com.ruoyi.framework.web.page.TableDataInfo;
import com.ruoyi.system.domain.SysRole;
import com.ruoyi.system.service.ISysRoleService;
import com.ruoyi.web.core.base.BaseController;
import com.ruoyi.framework.web.base.BaseController;
/**
* 角色信息
@@ -28,7 +28,7 @@ import com.ruoyi.web.core.base.BaseController;
*/
@Controller
@RequestMapping("/system/role")
public class RoleController extends BaseController
public class SysRoleController extends BaseController
{
private String prefix = "system/role";
@@ -60,7 +60,7 @@ public class RoleController extends BaseController
{
List<SysRole> list = roleService.selectRoleList(role);
ExcelUtil<SysRole> util = new ExcelUtil<SysRole>(SysRole.class);
return util.exportExcel(list, "role");
return util.exportExcel(list, "角色数据");
}
/**
@@ -181,4 +181,16 @@ public class RoleController extends BaseController
{
return prefix + "/tree";
}
/**
* 角色状态修改
*/
@Log(title = "角色管理", businessType = BusinessType.UPDATE)
@RequiresPermissions("system:role:edit")
@PostMapping("/changeStatus")
@ResponseBody
public AjaxResult changeStatus(SysRole role)
{
return toAjax(roleService.changeStatus(role));
}
}
@@ -11,19 +11,20 @@ import org.springframework.web.bind.annotation.PathVariable;
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.annotation.Log;
import com.ruoyi.common.base.AjaxResult;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.ExcelUtil;
import com.ruoyi.common.page.TableDataInfo;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.framework.shiro.service.PasswordService;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.shiro.service.SysPasswordService;
import com.ruoyi.framework.util.ShiroUtils;
import com.ruoyi.framework.web.page.TableDataInfo;
import com.ruoyi.framework.web.base.BaseController;
import com.ruoyi.system.domain.SysUser;
import com.ruoyi.system.service.ISysPostService;
import com.ruoyi.system.service.ISysRoleService;
import com.ruoyi.system.service.ISysUserService;
import com.ruoyi.web.core.base.BaseController;
/**
* 用户信息
@@ -32,7 +33,7 @@ import com.ruoyi.web.core.base.BaseController;
*/
@Controller
@RequestMapping("/system/user")
public class UserController extends BaseController
public class SysUserController extends BaseController
{
private String prefix = "system/user";
@@ -46,7 +47,7 @@ public class UserController extends BaseController
private ISysPostService postService;
@Autowired
private PasswordService passwordService;
private SysPasswordService passwordService;
@RequiresPermissions("system:user:view")
@GetMapping()
@@ -73,7 +74,29 @@ public class UserController extends BaseController
{
List<SysUser> list = userService.selectUserList(user);
ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);
return util.exportExcel(list, "user");
return util.exportExcel(list, "用户数据");
}
@Log(title = "用户管理", businessType = BusinessType.IMPORT)
@RequiresPermissions("system:user:import")
@PostMapping("/importData")
@ResponseBody
public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception
{
ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);
List<SysUser> userList = util.importExcel(file.getInputStream());
String operName = getSysUser().getLoginName();
String message = userService.importUser(userList, updateSupport, operName);
return AjaxResult.success(message);
}
@RequiresPermissions("system:user:view")
@GetMapping("/importTemplate")
@ResponseBody
public AjaxResult importTemplate()
{
ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);
return util.importTemplateExcel("用户数据");
}
/**
@@ -202,4 +225,16 @@ public class UserController extends BaseController
{
return userService.checkEmailUnique(user);
}
/**
* 用户状态修改
*/
@Log(title = "用户管理", businessType = BusinessType.UPDATE)
@RequiresPermissions("system:user:edit")
@PostMapping("/changeStatus")
@ResponseBody
public AjaxResult changeStatus(SysUser user)
{
return toAjax(userService.changeStatus(user));
}
}
@@ -4,7 +4,7 @@ import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import com.ruoyi.web.core.base.BaseController;
import com.ruoyi.framework.web.base.BaseController;
/**
* build 表单构建
@@ -14,11 +14,11 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.page.TableDataInfo;
import com.ruoyi.common.support.Convert;
import com.ruoyi.framework.web.page.TableDataInfo;
import com.ruoyi.generator.domain.TableInfo;
import com.ruoyi.generator.service.IGenService;
import com.ruoyi.web.core.base.BaseController;
import com.ruoyi.framework.web.base.BaseController;
/**
* 代码生成 操作处理
@@ -4,7 +4,7 @@ import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import com.ruoyi.web.core.base.BaseController;
import com.ruoyi.framework.web.base.BaseController;
/**
* swagger 接口
@@ -11,7 +11,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.base.AjaxResult;
import com.ruoyi.web.core.base.BaseController;
import com.ruoyi.framework.web.base.BaseController;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
@@ -2,11 +2,11 @@
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.jdbc.Driver
driverClassName: com.mysql.cj.jdbc.Driver
druid:
# 主库数据源
master:
url: jdbc:mysql://localhost:3306/ry?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true
url: jdbc:mysql://localhost:3306/ry?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: root
password: password
# 从库数据源
@@ -17,32 +17,33 @@ spring:
username:
password:
# 初始连接数
initial-size: 10
# 最大连接池数量
max-active: 100
initialSize: 5
# 最小连接池数量
min-idle: 10
minIdle: 10
# 最大连接池数量
maxActive: 20
# 配置获取连接等待超时的时间
max-wait: 60000
# 打开PSCache,并且指定每个连接上PSCache的大小
pool-prepared-statements: true
max-pool-prepared-statement-per-connection-size: 20
maxWait: 60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
timeBetweenEvictionRunsMillis: 60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
min-evictable-idle-time-millis: 300000
validation-query: SELECT 1 FROM DUAL
test-while-idle: true
test-on-borrow: false
test-on-return: false
stat-view-servlet:
minEvictableIdleTimeMillis: 300000
# 配置一个连接在池中最大生存的时间,单位是毫秒
maxEvictableIdleTimeMillis: 900000
# 配置检测连接是否有效
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
statViewServlet:
enabled: true
url-pattern: /monitor/druid/*
filter:
stat:
# 慢SQL记录
log-slow-sql: true
slow-sql-millis: 1000
merge-sql: false
merge-sql: true
wall:
config:
multi-statement-allow: true
@@ -3,9 +3,9 @@ ruoyi:
# 名称
name: RuoYi
# 版本
version: 3.0.0
version: 3.2.0
# 版权年份
copyrightYear: 2018
copyrightYear: 2019
# 文件上传路径
profile: D:/profile/
# 获取ip地址开关
@@ -72,7 +72,7 @@ mybatis:
# 搜索指定包别名
typeAliasesPackage: com.ruoyi
# 配置mapper的扫描,找到所有的mapper.xml映射文件
mapperLocations: classpath:mapper/system/*Mapper.xml,classpath:mapper/quartz/*Mapper.xml,classpath:mapper/generator/*Mapper.xml
mapperLocations: classpath*:mapper/**/*Mapper.xml
# 加载全局的配置文件
configLocation: classpath:mapper/mybatis-config.xml
@@ -126,8 +126,8 @@ xss:
gen:
# 作者
author: ruoyi
# 默认生成包路径 module 需改成自己的模块名称 如 system monitor tool
packageName: com.ruoyi.project.module
# 默认生成包路径 system 需改成自己的模块名称 如 system monitor tool
packageName: com.ruoyi.system
# 自动去除表前缀,默认是true
autoRemovePre: true
# 表前缀(类名不会包含表前缀)
+1 -1
View File
@@ -20,5 +20,5 @@ Spring Boot Version: ${spring-boot.version}
// ========`-.____`-.___\_____/___.-`____.-'======== //
// `=---=' //
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ //
// 佛祖保佑 永不宕机 永无BUG //
// 佛祖保佑 永不宕机 永无BUG //
////////////////////////////////////////////////////////////////////
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<ehcache name="ruoyi">
<ehcache name="ruoyi" updateCheck="false">
<!-- 磁盘缓存位置 -->
<diskStore path="java.io.tmpdir"/>
@@ -6,8 +6,8 @@ user.password.not.match=用户不存在/密码错误
user.password.retry.limit.count=密码输入错误{0}次
user.password.retry.limit.exceed=密码输入错误{0}次,帐户锁定10分钟
user.password.delete=对不起,您的账号已被删除
user.blocked=用户已封禁,原因:{0}
role.blocked=角色已封禁,原因:{0}
user.blocked=用户已封禁,请联系管理员
role.blocked=角色已封禁,请联系管理员
user.logout.success=退出成功
length.not.valid=长度必须在{min}到{max}个字符之间
@@ -1,44 +1,35 @@
/**
* @author: Dennis Hernández
* @webSite: http://djhvscf.github.io/Blog
* @version: v1.1.0
* 基于bootstrap-table-mobile修改
* 修正部分iPhone手机不显示卡片视图
* Copyright (c) 2019 ruoyi
*/
!function ($) {
'use strict';
var showHideColumns = function (that, checked) {
if (that.options.columnsHidden.length > 0 ) {
$.each(that.columns, function (i, column) {
if (that.options.columnsHidden.indexOf(column.field) !== -1) {
if (column.visible !== checked) {
that.toggleColumn($.fn.bootstrapTable.utils.getFieldIndex(that.columns, column.field), checked, true);
}
}
});
}
};
var resetView = function (that) {
if (that.options.height || that.options.showFooter) {
setTimeout(function(){
that.resetView.call(that);
}, 1);
setTimeout(that.resetView(), 1);
}
};
// 判断是否 iphone
var isIPhone = function () {
let browserName = navigator.userAgent.toLowerCase();
return /(iphone)/i.test(browserName);
};
var changeView = function (that, width, height) {
if (that.options.minHeight) {
if ((width <= that.options.minWidth) && (height <= that.options.minHeight)) {
if (checkValuesLessEqual(width, that.options.minWidth) && checkValuesLessEqual(height, that.options.minHeight)) {
conditionCardView(that);
} else if ((width > that.options.minWidth) && (height > that.options.minHeight)) {
} else if (checkValuesGreater(width, that.options.minWidth) && checkValuesGreater(height, that.options.minHeight)) {
conditionFullView(that);
}
} else {
if (width <= that.options.minWidth) {
if (checkValuesLessEqual(width, that.options.minWidth) || isIPhone()) {
conditionCardView(that);
} else if (width > that.options.minWidth) {
} else if (checkValuesGreater(width, that.options.minWidth)) {
conditionFullView(that);
}
}
@@ -46,14 +37,20 @@
resetView(that);
};
var checkValuesLessEqual = function (currentValue, targetValue) {
return currentValue <= targetValue;
};
var checkValuesGreater = function (currentValue, targetValue) {
return currentValue > targetValue;
};
var conditionCardView = function (that) {
changeTableView(that, false);
showHideColumns(that, false);
};
var conditionFullView = function (that) {
changeTableView(that, true);
showHideColumns(that, true);
};
var changeTableView = function (that, cardViewState) {
@@ -61,27 +58,12 @@
that.toggleView();
};
var debounce = function(func,wait) {
var timeout;
return function() {
var context = this,
args = arguments;
var later = function() {
timeout = null;
func.apply(context,args);
};
clearTimeout(timeout);
timeout = setTimeout(later, wait);
};
};
$.extend($.fn.bootstrapTable.defaults, {
mobileResponsive: false,
minWidth: 562,
minHeight: undefined,
heightThreshold: 100, // just slightly larger than mobile chrome's auto-hiding toolbar
checkOnInit: true,
columnsHidden: []
toggled: false
});
var BootstrapTable = $.fn.bootstrapTable.Constructor,
@@ -98,39 +80,13 @@
return;
}
if (this.options.minWidth < 100 && this.options.resizable) {
console.log("The minWidth when the resizable extension is active should be greater or equal than 100");
this.options.minWidth = 100;
}
var that = this,
old = {
width: $(window).width(),
height: $(window).height()
};
$(window).on('resize orientationchange',debounce(function (evt) {
// reset view if height has only changed by at least the threshold.
var height = $(this).height(),
width = $(this).width();
if (Math.abs(old.height - height) > that.options.heightThreshold || old.width != width) {
changeView(that, width, height);
old = {
width: width,
height: height
};
}
},200));
var that = this;
$(window).resize(function () {
changeView(that, $(this).width(), $(this).height())
});
if (this.options.checkOnInit) {
var height = $(window).height(),
width = $(window).width();
changeView(this, width, height);
old = {
width: width,
height: height
};
changeView(this, $(window).width(), $(window).height());
}
};
}(jQuery);
@@ -1,7 +0,0 @@
/*
* bootstrap-table - v1.11.0 - 2016-07-02
* https://github.com/wenzhixin/bootstrap-table
* Copyright (c) 2016 zhixin wen
* Licensed MIT License
*/
!function(a){"use strict";var b=function(b,c){b.options.columnsHidden.length>0&&a.each(b.columns,function(d,e){-1!==b.options.columnsHidden.indexOf(e.field)&&e.visible!==c&&b.toggleColumn(a.fn.bootstrapTable.utils.getFieldIndex(b.columns,e.field),c,!0)})},c=function(a){(a.options.height||a.options.showFooter)&&setTimeout(function(){a.resetView.call(a)},1)},d=function(a,b,d){a.options.minHeight?b<=a.options.minWidth&&d<=a.options.minHeight?e(a):b>a.options.minWidth&&d>a.options.minHeight&&f(a):b<=a.options.minWidth?e(a):b>a.options.minWidth&&f(a),c(a)},e=function(a){g(a,!1),b(a,!1)},f=function(a){g(a,!0),b(a,!0)},g=function(a,b){a.options.cardView=b,a.toggleView()},h=function(a,b){var c;return function(){var d=this,e=arguments,f=function(){c=null,a.apply(d,e)};clearTimeout(c),c=setTimeout(f,b)}};a.extend(a.fn.bootstrapTable.defaults,{mobileResponsive:!1,minWidth:562,minHeight:void 0,heightThreshold:100,checkOnInit:!0,columnsHidden:[]});var i=a.fn.bootstrapTable.Constructor,j=i.prototype.init;i.prototype.init=function(){if(j.apply(this,Array.prototype.slice.apply(arguments)),this.options.mobileResponsive&&this.options.minWidth){this.options.minWidth<100&&this.options.resizable&&(console.log("The minWidth when the resizable extension is active should be greater or equal than 100"),this.options.minWidth=100);var b=this,c={width:a(window).width(),height:a(window).height()};if(a(window).on("resize orientationchange",h(function(){var e=a(this).height(),f=a(this).width();(Math.abs(c.height-e)>b.options.heightThreshold||c.width!=f)&&(d(b,f,e),c={width:f,height:e})},200)),this.options.checkOnInit){var e=a(window).height(),f=a(window).width();d(this,f,e),c={width:f,height:e}}}}}(jQuery);
@@ -240,32 +240,32 @@
item.isShow = false;
// 这里兼容几种常见Root节点写法
// 默认的几种判断
var _defaultRootFlag = item[options.parentId] == '0' ||
item[options.parentId] == 0 ||
item[options.parentId] == null ||
item[options.parentId] == '';
if (!item[options.parentId] || (_root ? (item[options.parentId] == options.rootIdValue) : _defaultRootFlag)) {
var _defaultRootFlag = item[options.parentCode] == '0' ||
item[options.parentCode] == 0 ||
item[options.parentCode] == null ||
item[options.parentCode] == '';
if (!item[options.parentCode] || (_root ? (item[options.parentCode] == options.rootIdValue) : _defaultRootFlag)) {
if (!target.data_list["_root_"]) {
target.data_list["_root_"] = [];
}
if (!target.data_obj["id_" + item[options.id]]) {
if (!target.data_obj["id_" + item[options.code]]) {
target.data_list["_root_"].push(item);
}
} else {
if (!target.data_list["_n_" + item[options.parentId]]) {
target.data_list["_n_" + item[options.parentId]] = [];
if (!target.data_list["_n_" + item[options.parentCode]]) {
target.data_list["_n_" + item[options.parentCode]] = [];
}
if (!target.data_obj["id_" + item[options.id]]) {
target.data_list["_n_" + item[options.parentId]].push(item);
if (!target.data_obj["id_" + item[options.code]]) {
target.data_list["_n_" + item[options.parentCode]].push(item);
}
}
target.data_obj["id_" + item[options.id]] = item;
target.data_obj["id_" + item[options.code]] = item;
});
}
// 递归获取子节点并且设置子节点
var recursionNode = function(parentNode, lv, row_id, p_id) {
var $tbody = target.find("tbody");
var _ls = target.data_list["_n_" + parentNode[options.id]];
var _ls = target.data_list["_n_" + parentNode[options.code]];
var $tr = renderRow(parentNode, _ls ? true : false, lv, row_id, p_id);
$tbody.append($tr);
if (_ls) {
@@ -307,11 +307,11 @@
target.hasSelectItem = true;
var $td = $('<td style="text-align:center;width:36px"></td>');
if (column.radio) {
var _ipt = $('<input name="select_item" type="radio" value="' + item[options.id] + '"></input>');
var _ipt = $('<input name="select_item" type="radio" value="' + item[options.code] + '"></input>');
$td.append(_ipt);
}
if (column.checkbox) {
var _ipt = $('<input name="select_item" type="checkbox" value="' + item[options.id] + '"></input>');
var _ipt = $('<input name="select_item" type="checkbox" value="' + item[options.code] + '"></input>');
$td.append(_ipt);
}
$tr.append($td);
@@ -441,9 +441,9 @@
target.appendData = function(data) {
// 下边的操作主要是为了查询时让一些没有根节点的节点显示
$.each(data, function(i, item) {
var _data = target.data_obj["id_" + item[options.id]];
var _p_data = target.data_obj["id_" + item[options.parentId]];
var _c_list = target.data_list["_n_" + item[options.parentId]];
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]];
var row_id = ""; //行id
var p_id = ""; //父行id
var _lv = 1; //如果没有父就是1默认显示
@@ -643,26 +643,26 @@
};
$.fn.bootstrapTreeTable.defaults = {
id: 'id', // 选取记录返回的值,用于设置父子关系
parentId: 'parentId', // 用于设置父子关系
rootIdValue: null, // 设置根节点id值----可指定根节点,默认为null,"",0,"0"
data: null, // 构造table的数据集合
type: "GET", // 请求数据的ajax类型
url: null, // 请求数据的ajax的url
ajaxParams: {}, // 请求数据的ajax的data属性
expandColumn: 0, // 在哪一列上面显示展开按钮
expandAll: false, // 是否全部展开
expandFirst: true, // 是否默认第一级展开--expandAll为false时生效
striped: false, // 是否各行渐变色
bordered: true, // 是否显示边框
hover: true, // 是否鼠标悬停
condensed: false, // 是否紧缩表格
columns: [], // 列
toolbar: null, // 顶部工具条
height: 0, // 表格高度
showTitle: true, // 是否采用title属性显示字段内容(被formatter格式化的字段不会显示)
showColumns: true, // 是否显示内容列下拉框
showRefresh: true, // 是否显示刷新按钮
code: 'code', // 选取记录返回的值,用于设置父子关系
parentCode: 'parentCode', // 用于设置父子关系
rootIdValue: null, // 设置根节点id值----可指定根节点,默认为null,"",0,"0"
data: null, // 构造table的数据集合
type: "GET", // 请求数据的ajax类型
url: null, // 请求数据的ajax的url
ajaxParams: {}, // 请求数据的ajax的data属性
expandColumn: 0, // 在哪一列上面显示展开按钮
expandAll: false, // 是否全部展开
expandFirst: true, // 是否默认第一级展开--expandAll为false时生效
striped: false, // 是否各行渐变色
bordered: true, // 是否显示边框
hover: true, // 是否鼠标悬停
condensed: false, // 是否紧缩表格
columns: [], // 列
toolbar: null, // 顶部工具条
height: 0, // 表格高度
showTitle: true, // 是否采用title属性显示字段内容(被formatter格式化的字段不会显示)
showColumns: true, // 是否显示内容列下拉框
showRefresh: true, // 是否显示刷新按钮
expanderExpandedClass: 'glyphicon glyphicon-chevron-down', // 展开的按钮的图标
expanderCollapsedClass: 'glyphicon glyphicon-chevron-right' // 缩起的按钮的图标
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

@@ -0,0 +1,138 @@
/**
* layer皮肤
* Copyright (c) 2019 ruoyi
*/
html #layui_layer_skinmoonstylecss {
display: none;
position: absolute;
width: 1989px;
}
body .layer-ext-moon[type="dialog"] {
min-width: 320px;
}
body .layer-ext-moon-msg[type="dialog"]{min-width:200px;}
body .layer-ext-moon .layui-layer-title {
background: #F8F8F8;
color: #333;
font-size: 14px;
height: 42px;
line-height: 42px;
border-bottom: 1px solid #eee;
}
body .layer-ext-moon .layui-layer-content .layui-layer-ico {
height: 32px;
width: 32px;
top:18.5px;
}
body .layer-ext-moon .layui-layer-ico0 {
background: url(default.png) no-repeat -96px 0;
;
}
body .layer-ext-moon .layui-layer-ico1 {
background: url(default.png) no-repeat -224px 0;
;
}
body .layer-ext-moon .layui-layer-ico2 {
background: url(default.png) no-repeat -192px 0;
}
body .layer-ext-moon .layui-layer-ico3 {
background: url(default.png) no-repeat -160px 0;
}
body .layer-ext-moon .layui-layer-ico4 {
background: url(default.png) no-repeat -320px 0;
}
body .layer-ext-moon .layui-layer-ico5 {
background: url(default.png) no-repeat -288px 0;
}
body .layer-ext-moon .layui-layer-ico6 {
background: url(default.png) -256px 0;
}
body .layer-ext-moon .layui-layer-ico7 {
background: url(default.png) no-repeat -128px 0;
}
body .layer-ext-moon .layui-layer-setwin {
top: 15px;
right: 15px;
}
body .layer-ext-moon .layui-layer-setwin a {
width: 16px;
height: 16px;
}
body .layer-ext-moon .layui-layer-setwin .layui-layer-min cite:hover {
background-color: #56abe4;
}
body .layer-ext-moon .layui-layer-setwin .layui-layer-max {
background: url(default.png) no-repeat -80px 0;
}
body .layer-ext-moon .layui-layer-setwin .layui-layer-max:hover {
background: url(default.png) no-repeat -64px 0;
}
body .layer-ext-moon .layui-layer-setwin .layui-layer-maxmin {
background: url(default.png) no-repeat -32px 0;
}
body .layer-ext-moon .layui-layer-setwin .layui-layer-maxmin:hover {
background: url(default.png) no-repeat -16px 0;
}
body .layer-ext-moon .layui-layer-setwin .layui-layer-close1,body .layer-ext-moon .layui-layer-setwin .layui-layer-close2 {
background: url(default.png) 0 0;
}
body .layer-ext-moon .layui-layer-setwin .layui-layer-close1:hover,body .layer-ext-moon .layui-layer-setwin .layui-layer-close2:hover {
background: url(default.png) -48px 0;
}
body .layer-ext-moon .layui-layer-padding{padding-top: 24px;}
body .layer-ext-moon .layui-layer-btn {
text-align: right;
padding: 10px 15px 12px;
background: #f0f4f7;
border-top: 1px #c7c7c7 solid;
}
body .layer-ext-moon .layui-layer-btn a {
font-size: 12px;
font-weight: normal;
margin: 0 3px;
margin-right: 7px;
margin-left: 7px;
padding: 0 15px;
color: #fff;
border: 1px solid #0064b6;
background: #0071ce;
border-radius: 3px;
display: inline-block;
height: 30px;
line-height: 30px;
text-align: center;
vertical-align: middle;
background-repeat: no-repeat;
text-decoration: none;
outline: none;
-moz-box-sizing: content-box;
-webkit-box-sizing: content-box;
box-sizing: content-box;
}
body .layer-ext-moon .layui-layer-btn .layui-layer-btn0 {
background: #0071ce;
}
body .layer-ext-moon .layui-layer-btn .layui-layer-btn1 {
background: #fff;
color: #404a58;
border: 1px solid #c0c4cd;
border-radius: 3px;
}
body .layer-ext-moon .layui-layer-btn .layui-layer-btn2 {
background: #f60;
color: #fff;
border: 1px solid #f60;
border-radius: 3px;
}
body .layer-ext-moon .layui-layer-btn .layui-layer-btn3 {
background: #f00;
color: #fff;
border: 1px solid #f00;
border-radius: 3px;
}
body .layer-ext-moon .layui-layer-title span.layui-layer-tabnow{
height:47px;
}
File diff suppressed because one or more lines are too long
@@ -1,28 +1,46 @@
(function ($) {
(function($) {
$.extend($.summernote.lang, {
'zh-CN': {
font: {
bold: '粗体',
italic: '斜体',
underline: '下划线',
strikethrough: '删除线',
clear: '清除格式',
height: '行高',
name: '字体',
strikethrough: '删除线',
subscript: '下标',
superscript: '上标',
size: '字号'
},
image: {
image: '图片',
insert: '插入图片',
resizeFull: '调整至 100%',
resizeHalf: '调整至 50%',
resizeQuarter: '调整至 25%',
floatLeft: '左浮动',
floatRight: '右浮动',
floatNone: '浮动',
dragImageHere: '将图片拖至此处',
resizeFull: '缩放至 100%',
resizeHalf: '缩放至 50%',
resizeQuarter: '缩放至 25%',
floatLeft: '左浮动',
floatRight: '右浮动',
floatNone: '取消浮动',
shapeRounded: '形状: 圆角',
shapeCircle: '形状: 圆',
shapeThumbnail: '形状: 缩略图',
shapeNone: '形状: 无',
dragImageHere: '将图片拖拽至此处',
dropImage: '拖拽图片或文本',
selectFromFiles: '从本地上传',
url: '图片地址'
maximumFileSize: '文件大小最大值',
maximumFileSizeError: '文件大小超出最大值。',
url: '图片地址',
remove: '移除图片',
original: '原始图片'
},
video: {
video: '视频',
videoLink: '视频链接',
insert: '插入视频',
url: '视频地址',
providers: '(优酷, 腾讯, Instagram, DailyMotion, Youtube等)'
},
link: {
link: '链接',
@@ -33,22 +51,22 @@
url: '链接地址',
openInNewWindow: '在新窗口打开'
},
video: {
video: '视频',
videoLink: '视频链接',
insert: '插入视频',
url: '视频地址',
providers: '(优酷, Instagram, DailyMotion, Youtube等)'
},
table: {
table: '表格'
table: '表格',
addRowAbove: '在上方插入行',
addRowBelow: '在下方插入行',
addColLeft: '在左侧插入列',
addColRight: '在右侧插入列',
delRow: '删除行',
delCol: '删除列',
delTable: '删除表格'
},
hr: {
insert: '水平线'
},
style: {
style: '样式',
normal: '普通',
p: '普通',
blockquote: '引用',
pre: '代码',
h1: '标题 1',
@@ -92,11 +110,45 @@
textFormatting: '文本格式',
action: '动作',
paragraphFormatting: '段落格式',
documentStyle: '文档样式'
documentStyle: '文档样式',
extraKeys: '额外按键'
},
help: {
insertParagraph: '插入段落',
undo: '撤销',
redo: '重做',
tab: '增加缩进',
untab: '减少缩进',
bold: '粗体',
italic: '斜体',
underline: '下划线',
strikethrough: '删除线',
removeFormat: '清除格式',
justifyLeft: '左对齐',
justifyCenter: '居中对齐',
justifyRight: '右对齐',
justifyFull: '两端对齐',
insertUnorderedList: '无序列表',
insertOrderedList: '有序列表',
outdent: '减少缩进',
indent: '增加缩进',
formatPara: '设置选中内容样式为 普通',
formatH1: '设置选中内容样式为 标题1',
formatH2: '设置选中内容样式为 标题2',
formatH3: '设置选中内容样式为 标题3',
formatH4: '设置选中内容样式为 标题4',
formatH5: '设置选中内容样式为 标题5',
formatH6: '设置选中内容样式为 标题6',
insertHorizontalRule: '插入水平线',
'linkDialog.show': '显示链接对话框'
},
history: {
undo: '撤销',
redo: '重做'
},
specialChar: {
specialChar: '特殊字符',
select: '选取特殊字符'
}
}
});
@@ -1,3 +1,3 @@
/*! Summernote v0.8.8 | (c) 2013- Alan Hong and other contributors | MIT license */
/*! Summernote v0.8.11 | (c) 2013- Alan Hong and other contributors | MIT license */
!function(a){a.extend(a.summernote.lang,{"zh-CN":{font:{bold:"粗体",italic:"斜体",underline:"下划线",clear:"清除格式",height:"行高",name:"字体",strikethrough:"删除线",subscript:"下标",superscript:"上标",size:"字号"},image:{image:"图片",insert:"插入图片",resizeFull:"缩放至 100%",resizeHalf:"缩放至 50%",resizeQuarter:"缩放至 25%",floatLeft:"靠左浮动",floatRight:"靠右浮动",floatNone:"取消浮动",shapeRounded:"形状: 圆角",shapeCircle:"形状: 圆",shapeThumbnail:"形状: 缩略图",shapeNone:"形状: 无",dragImageHere:"将图片拖拽至此处",selectFromFiles:"从本地上传",maximumFileSize:"文件大小最大值",maximumFileSizeError:"文件大小超出最大值。",url:"图片地址",remove:"移除图片"},video:{video:"视频",videoLink:"视频链接",insert:"插入视频",url:"视频地址",providers:"(优酷, 腾讯, Instagram, DailyMotion, Youtube等)"},link:{link:"链接",insert:"插入链接",unlink:"去除链接",edit:"编辑链接",textToDisplay:"显示文本",url:"链接地址",openInNewWindow:"在新窗口打开"},table:{table:"表格"},hr:{insert:"水平线"},style:{style:"样式",p:"普通",blockquote:"引用",pre:"代码",h1:"标题 1",h2:"标题 2",h3:"标题 3",h4:"标题 4",h5:"标题 5",h6:"标题 6"},lists:{unordered:"无序列表",ordered:"有序列表"},options:{help:"帮助",fullscreen:"全屏",codeview:"源代码"},paragraph:{paragraph:"段落",outdent:"减少缩进",indent:"增加缩进",left:"左对齐",center:"居中对齐",right:"右对齐",justify:"两端对齐"},color:{recent:"最近使用",more:"更多",background:"背景",foreground:"前景",transparent:"透明",setTransparent:"透明",reset:"重置",resetToDefault:"默认"},shortcut:{shortcuts:"快捷键",close:"关闭",textFormatting:"文本格式",action:"动作",paragraphFormatting:"段落格式",documentStyle:"文档样式",extraKeys:"额外按键"},history:{undo:"撤销",redo:"重做"},help:{insertParagraph:"插入段落",undo:"撤销",redo:"重做",tab:"增加缩进",untab:"减少缩进",bold:"粗体",italic:"斜体",underline:"下划线",strikethrough:"删除线",removeFormat:"清除格式",justifyLeft:"左对齐",justifyCenter:"居中对齐",justifyRight:"右对齐",justifyFull:"两端对齐",insertUnorderedList:"无序列表",insertOrderedList:"有序列表",outdent:"减少缩进",indent:"增加缩进",formatPara:"设置选中内容样式为 普通",formatH1:"设置选中内容样式为 标题1",formatH2:"设置选中内容样式为 标题2",formatH3:"设置选中内容样式为 标题3",formatH4:"设置选中内容样式为 标题4",formatH5:"设置选中内容样式为 标题5",formatH6:"设置选中内容样式为 标题6",insertHorizontalRule:"插入水平线","linkDialog.show":"显示链接对话框"}}})}(jQuery);
!function(e){e.extend(e.summernote.lang,{"zh-CN":{font:{bold:"粗体",italic:"斜体",underline:"下划线",clear:"清除格式",height:"行高",name:"字体",strikethrough:"删除线",subscript:"下标",superscript:"上标",size:"字号"},image:{image:"图片",insert:"插入图片",resizeFull:"缩放至 100%",resizeHalf:"缩放至 50%",resizeQuarter:"缩放至 25%",floatLeft:"靠左浮动",floatRight:"靠右浮动",floatNone:"取消浮动",shapeRounded:"形状: 圆角",shapeCircle:"形状: 圆",shapeThumbnail:"形状: 缩略图",shapeNone:"形状: 无",dragImageHere:"将图片拖拽至此处",dropImage:"拖拽图片或文本",selectFromFiles:"从本地上传",maximumFileSize:"文件大小最大值",maximumFileSizeError:"文件大小超出最大值。",url:"图片地址",remove:"移除图片",original:"原始图片"},video:{video:"视频",videoLink:"视频链接",insert:"插入视频",url:"视频地址",providers:"(优酷, 腾讯, Instagram, DailyMotion, Youtube等)"},link:{link:"链接",insert:"插入链接",unlink:"去除链接",edit:"编辑链接",textToDisplay:"显示文本",url:"链接地址",openInNewWindow:"在新窗口打开"},table:{table:"表格",addRowAbove:"在上方插入行",addRowBelow:"在下方插入行",addColLeft:"在左侧插入列",addColRight:"在右侧插入列",delRow:"删除行",delCol:"删除列",delTable:"删除表格"},hr:{insert:"水平线"},style:{style:"样式",p:"普通",blockquote:"引用",pre:"代码",h1:"标题 1",h2:"标题 2",h3:"标题 3",h4:"标题 4",h5:"标题 5",h6:"标题 6"},lists:{unordered:"无序列表",ordered:"有序列表"},options:{help:"帮助",fullscreen:"全屏",codeview:"源代码"},paragraph:{paragraph:"段落",outdent:"减少缩进",indent:"增加缩进",left:"左对齐",center:"居中对齐",right:"右对齐",justify:"两端对齐"},color:{recent:"最近使用",more:"更多",background:"背景",foreground:"前景",transparent:"透明",setTransparent:"透明",reset:"重置",resetToDefault:"默认"},shortcut:{shortcuts:"快捷键",close:"关闭",textFormatting:"文本格式",action:"动作",paragraphFormatting:"段落格式",documentStyle:"文档样式",extraKeys:"额外按键"},help:{insertParagraph:"插入段落",undo:"撤销",redo:"重做",tab:"增加缩进",untab:"减少缩进",bold:"粗体",italic:"斜体",underline:"下划线",strikethrough:"删除线",removeFormat:"清除格式",justifyLeft:"左对齐",justifyCenter:"居中对齐",justifyRight:"右对齐",justifyFull:"两端对齐",insertUnorderedList:"无序列表",insertOrderedList:"有序列表",outdent:"减少缩进",indent:"增加缩进",formatPara:"设置选中内容样式为 普通",formatH1:"设置选中内容样式为 标题1",formatH2:"设置选中内容样式为 标题2",formatH3:"设置选中内容样式为 标题3",formatH4:"设置选中内容样式为 标题4",formatH5:"设置选中内容样式为 标题5",formatH6:"设置选中内容样式为 标题6",insertHorizontalRule:"插入水平线","linkDialog.show":"显示链接对话框"},history:{undo:"撤销",redo:"重做"},specialChar:{specialChar:"特殊字符",select:"选取特殊字符"}}})}(jQuery);
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
@@ -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|7|8][0-9]\d{8}$/;
var phone=/^1[3|4|5|6|7|8][0-9]\d{8}$/;
return this.optional(element)||(length == 11 && phone.test(value));
},"请填写正确的11位手机号");
//电话号码验证
@@ -84,3 +84,65 @@ body.signin {
width:auto
}
}
/*
登录界面check样式
*/
.checkbox-custom {
position: relative;
padding: 0 15px 0 25px;
margin-bottom: 7px;
margin-top: 0;
display: inline-block;
}
/*
将初始的checkbox的样式改变
*/
.checkbox-custom input[type="checkbox"] {
opacity: 0;/*将初始的checkbox隐藏起来*/
position: absolute;
cursor: pointer;
z-index: 2;
margin: -6px 0 0 0;
top: 50%;
left: 3px;
}
/*
设计新的checkbox,位置
*/
.checkbox-custom label:before {
content: '';
position: absolute;
top: 50%;
left: 0;
margin-top: -9px;
width: 18px;
height: 17px;
display: inline-block;
border-radius: 2px;
border: 1px solid #bbb;
background: #fff;
}
/*
点击初始的checkbox,将新的checkbox关联起来
*/
.checkbox-custom input[type="checkbox"]:checked +label:after {
position: absolute;
display: inline-block;
font-family: 'Glyphicons Halflings';
content: "\e013";
top: 42%;
left: 3px;
margin-top: -5px;
font-size: 11px;
line-height: 1;
width: 16px;
height: 16px;
color: #333;
}
.checkbox-custom label {
cursor: pointer;
line-height: 1.2;
font-weight: normal;/*改变了rememberme的字体*/
margin-bottom: 0;
text-align: left;
}
+1 -1
View File
@@ -1 +1 @@
html{height:100%}body.signin{height:auto;background:url(../img/login-background.jpg) no-repeat center fixed;-webkit-background-size:cover;-moz-background-size:cover;-o-background-size:cover;background-size:cover;color:rgba(255,255,255,.95)}.signinpanel{width:750px;margin:10% auto 0}.signinpanel .logopanel{float:none;width:auto;padding:0;background:0 0}.signinpanel .signin-info ul{list-style:none;padding:0;margin:20px 0}.signinpanel .form-control{display:block;margin-top:15px}.signinpanel .uname{background:#fff url(../img/user.png) no-repeat 95% center;color:#333}.signinpanel .pword{background:#fff url(../img/locked.png) no-repeat 95% center;color:#333}.signinpanel .code{background:#fff no-repeat 95% center;color:#333;margin:0 0 15px 0}.signinpanel .btn{margin-top:15px}.signinpanel form{background:rgba(255,255,255,.2);border:1px solid rgba(255,255,255,.3);-moz-box-shadow:0 3px 0 rgba(12,12,12,.03);-webkit-box-shadow:0 3px 0 rgba(12,12,12,.03);box-shadow:0 3px 0 rgba(12,12,12,.03);-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;padding:30px}.signup-footer{border-top:solid 1px rgba(255,255,255,.3);margin:20px 0;padding-top:15px}@media screen and (max-width:768px){.signinpanel,.signuppanel{margin:0 auto;width:420px!important;padding:20px}.signinpanel form{margin-top:20px}.signup-footer,.signuppanel .form-control{margin-bottom:10px}.signup-footer .pull-left,.signup-footer .pull-right{float:none!important;text-align:center}.signinpanel .signin-info ul{display:none}}@media screen and (max-width:320px){.signinpanel,.signuppanel{margin:0 20px;width:auto}}
html{height:100%}body.signin{height:auto;background:url(../img/login-background.jpg) no-repeat center fixed;-webkit-background-size:cover;-moz-background-size:cover;-o-background-size:cover;background-size:cover;color:rgba(255,255,255,.95)}.signinpanel{width:750px;margin:10% auto 0}.signinpanel .logopanel{float:none;width:auto;padding:0;background:0}.signinpanel .signin-info ul{list-style:none;padding:0;margin:20px 0}.signinpanel .form-control{display:block;margin-top:15px}.signinpanel .uname{background:#fff url(../img/user.png) no-repeat 95% center;color:#333}.signinpanel .pword{background:#fff url(../img/locked.png) no-repeat 95% center;color:#333}.signinpanel .code{background:#fff no-repeat 95% center;color:#333;margin:0 0 15px 0}.signinpanel .btn{margin-top:15px}.signinpanel form{background:rgba(255,255,255,.2);border:1px solid rgba(255,255,255,.3);-moz-box-shadow:0 3px 0 rgba(12,12,12,.03);-webkit-box-shadow:0 3px 0 rgba(12,12,12,.03);box-shadow:0 3px 0 rgba(12,12,12,.03);-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;padding:30px}.signup-footer{border-top:solid 1px rgba(255,255,255,.3);margin:20px 0;padding-top:15px}@media screen and (max-width:768px){.signinpanel,.signuppanel{margin:0 auto;width:420px!important;padding:20px}.signinpanel form{margin-top:20px}.signup-footer,.signuppanel .form-control{margin-bottom:10px}.signup-footer .pull-left,.signup-footer .pull-right{float:none!important;text-align:center}.signinpanel .signin-info ul{display:none}}@media screen and (max-width:320px){.signinpanel,.signuppanel{margin:0 20px;width:auto}}.checkbox-custom{position:relative;padding:0 15px 0 25px;margin-bottom:7px;margin-top:0;display:inline-block}.checkbox-custom input[type="checkbox"]{opacity:0;position:absolute;cursor:pointer;z-index:2;margin:-6px 0 0 0;top:50%;left:3px}.checkbox-custom label:before{content:'';position:absolute;top:50%;left:0;margin-top:-9px;width:18px;height:17px;display:inline-block;border-radius:2px;border:1px solid #bbb;background:#fff}.checkbox-custom input[type="checkbox"]:checked+label:after{position:absolute;display:inline-block;font-family:'Glyphicons Halflings';content:"\e013";top:42%;left:3px;margin-top:-5px;font-size:11px;line-height:1;width:16px;height:16px;color:#333}.checkbox-custom label{cursor:pointer;line-height:1.2;font-weight:normal;margin-bottom:0;text-align:left}
@@ -0,0 +1,822 @@
/*
*
* SKIN blue 若依管理系统
* NAME - blue/green/purple/red/yellow
*
*/
/** 蓝色主题 skin-blue **/
.skin-blue .navbar {
background-color: #3c8dbc
}
.skin-blue .navbar .nav>li>a {
color: #fff
}
.skin-blue .navbar .nav>li>a:hover,
.skin-blue .navbar .nav>li>a:active,
.skin-blue .navbar .nav>li>a:focus,
.skin-blue .navbar .nav .open>a,
.skin-blue .navbar .nav .open>a:hover,
.skin-blue .navbar .nav .open>a:focus,
.skin-blue .navbar .nav>.active>a {
background: rgba(0, 0, 0, 0.1);
color: #f6f6f6
}
.skin-blue .navbar .sidebar-toggle {
color: #fff
}
.skin-blue .navbar .sidebar-toggle:hover {
color: #f6f6f6;
background: rgba(0, 0, 0, 0.1)
}
.skin-blue .navbar .sidebar-toggle {
color: #fff
}
.skin-blue .navbar .sidebar-toggle:hover {
background-color: #367fa9
}
@media ( max-width :767px) {
.skin-blue .navbar .dropdown-menu li.divider {
background-color: rgba(255, 255, 255, 0.1)
}
.skin-blue .navbar .dropdown-menu li a {
color: #fff
}
.skin-blue .navbar .dropdown-menu li a:hover {
background: #367fa9
}
}
.skin-blue .logo {
background-color: #367fa9;
color: #fff;
border-bottom: 0 solid transparent
}
.skin-blue .logo:hover {
background-color: #357ca5
}
.skin-blue li.user-header {
background-color: #3c8dbc
}
.skin-blue .content-header {
background: transparent
}
.skin-blue .wrapper,
.skin-blue .main-sidebar,
.skin-blue .left-side {
background-color: #222d32
}
.skin-blue .user-panel>.info,
.skin-blue .user-panel>.info>a {
color: #fff
}
.skin-blue .nav>li.header {
color: #4b646f;
background: #1a2226
}
.skin-blue .nav>li.active {
color: #fff;
background: #293846;
border-left: 3px solid #3c8dbc;
}
.skin-blue .nav>li.active:last-child {
border-left: none;
}
.skin-blue .nav>li>.treeview-menu {
margin: 0 1px;
background: #2c3b41
}
.skin-blue .sidebar a {
color: #b8c7ce
}
.skin-blue .sidebar a:hover {
text-decoration: none
}
.skin-blue .treeview-menu>li>a {
color: #8aa4af
}
.skin-blue .treeview-menu>li.active>a,
.skin-blue .treeview-menu>li>a:hover {
color: #fff
}
.skin-blue .sidebar-form {
border-radius: 3px;
border: 1px solid #374850;
margin: 10px 10px
}
.skin-blue .sidebar-form input[type="text"],
.skin-blue .sidebar-form .btn {
box-shadow: none;
background-color: #374850;
border: 1px solid transparent;
height: 35px
}
.skin-blue .sidebar-form input[type="text"] {
color: #666;
border-top-left-radius: 2px;
border-top-right-radius: 0;
border-bottom-right-radius: 0;
border-bottom-left-radius: 2px
}
.skin-blue .sidebar-form input[type="text"]:focus,
.skin-blue .sidebar-form input[type="text"]:focus+.input-group-btn .btn {
background-color: #fff;
color: #666
}
.skin-blue .sidebar-form input[type="text"]:focus+.input-group-btn .btn {
border-left-color: #fff
}
.skin-blue .sidebar-form .btn {
color: #999;
border-top-left-radius: 0;
border-top-right-radius: 2px;
border-bottom-right-radius: 2px;
border-bottom-left-radius: 0
}
.skin-blue.layout-top-nav>.logo {
background-color: #3c8dbc;
color: #fff;
border-bottom: 0 solid transparent
}
.skin-blue.layout-top-nav>.logo:hover {
background-color: #3b8ab8
}
.skin-blue .content-tabs {
border-bottom: solid 2px #e7eaec;
}
.skin-blue.layout-top-nav>.logo {
background-color: #3c8dbc;
color: #fff;
border-bottom: 0 solid transparent
}
.skin-blue.layout-top-nav>.logo:hover {
background-color: #3b8ab8
}
/** 绿色主题 skin-green **/
.skin-green .navbar {
background-color: #00a65a;
}
.skin-green .content-tabs {
border-bottom: solid 2px #e7eaec;
}
.skin-green .navbar .nav>li>a {
color: #fff
}
.skin-green .navbar .nav>li>a:hover,
.skin-green .navbar .nav>li>a:active,
.skin-green .navbar .nav>li>a:focus,
.skin-green .navbar .nav .open>a,
.skin-green .navbar .nav .open>a:hover,
.skin-green .navbar .nav .open>a:focus,
.skin-green .navbar .nav>.active>a {
background: rgba(0, 0, 0, 0.1);
color: #f6f6f6
}
.skin-green .navbar .sidebar-toggle {
color: #fff
}
.skin-green .navbar .sidebar-toggle:hover {
color: #f6f6f6;
background: rgba(0, 0, 0, 0.1)
}
.skin-green .navbar .sidebar-toggle {
color: #fff
}
.skin-green .navbar .sidebar-toggle:hover {
background-color: #008d4c
}
@media ( max-width :767px) {
.skin-green .navbar .dropdown-menu li.divider {
background-color: rgba(255, 255, 255, 0.1)
}
.skin-green .navbar .dropdown-menu li a {
color: #fff
}
.skin-green .navbar .dropdown-menu li a:hover {
background: #008d4c
}
}
.skin-green .logo {
background-color: #008d4c;
color: #fff;
border-bottom: 0 solid transparent
}
.skin-green .logo:hover {
background-color: #008749
}
.skin-green li.user-header {
background-color: #00a65a
}
.skin-green .content-header {
background: transparent
}
.skin-green .wrapper,
.skin-green .main-sidebar,
.skin-green .left-side {
background-color: #222d32
}
.skin-green .user-panel>.info,
.skin-green .user-panel>.info>a {
color: #fff
}
.skin-green .nav>li.header {
color: #4b646f;
background: #1a2226;
}
.skin-green .nav>li.active {
color: #fff;
background: #293846;
border-left: 3px solid #00a65a;
}
.skin-green .nav>li.active:last-child {
border-left: none;
}
.skin-green .nav>li>.treeview-menu {
margin: 0 1px;
background: #2c3b41
}
.skin-green .sidebar a {
color: #b8c7ce
}
.skin-green .sidebar a:hover {
text-decoration: none
}
.skin-green .treeview-menu>li>a {
color: #8aa4af
}
.skin-green .treeview-menu>li.active>a,
.skin-green .treeview-menu>li>a:hover {
color: #fff
}
.skin-green .sidebar-form {
border-radius: 3px;
border: 1px solid #374850;
margin: 10px 10px
}
.skin-green .sidebar-form input[type="text"],
.skin-green .sidebar-form .btn {
box-shadow: none;
background-color: #374850;
border: 1px solid transparent;
height: 35px
}
.skin-green .sidebar-form input[type="text"] {
color: #666;
border-top-left-radius: 2px;
border-top-right-radius: 0;
border-bottom-right-radius: 0;
border-bottom-left-radius: 2px
}
.skin-green .sidebar-form input[type="text"]:focus,
.skin-green .sidebar-form input[type="text"]:focus+.input-group-btn .btn {
background-color: #fff;
color: #666
}
.skin-green .sidebar-form input[type="text"]:focus+.input-group-btn .btn {
border-left-color: #fff
}
.skin-green .sidebar-form .btn {
color: #999;
border-top-left-radius: 0;
border-top-right-radius: 2px;
border-bottom-right-radius: 2px;
border-bottom-left-radius: 0
}
/** 红色主题 skin-red **/
.skin-red .navbar {
background-color: #dd4b39
}
.skin-red .navbar .nav>li>a {
color: #fff
}
.skin-red .navbar .nav>li>a:hover,
.skin-red .navbar .nav>li>a:active,
.skin-red .navbar .nav>li>a:focus,
.skin-red .navbar .nav .open>a,
.skin-red .navbar .nav .open>a:hover,
.skin-red .navbar .nav .open>a:focus,
.skin-red .navbar .nav>.active>a {
background: rgba(0, 0, 0, 0.1);
color: #f6f6f6
}
.skin-red .navbar .sidebar-toggle {
color: #fff
}
.skin-red .navbar .sidebar-toggle:hover {
color: #f6f6f6;
background: rgba(0, 0, 0, 0.1)
}
.skin-red .navbar .sidebar-toggle {
color: #fff
}
.skin-red .navbar .sidebar-toggle:hover {
background-color: #d73925
}
@media ( max-width :767px) {
.skin-red .navbar .dropdown-menu li.divider {
background-color: rgba(255, 255, 255, 0.1)
}
.skin-red .navbar .dropdown-menu li a {
color: #fff
}
.skin-red .navbar .dropdown-menu li a:hover {
background: #d73925
}
}
.skin-red .logo {
background-color: #d73925;
color: #fff;
border-bottom: 0 solid transparent
}
.skin-red .logo:hover {
background-color: #d33724
}
.skin-red li.user-header {
background-color: #dd4b39
}
.skin-red .content-header {
background: transparent
}
.skin-red .wrapper,
.skin-red .main-sidebar,
.skin-red .left-side {
background-color: #222d32
}
.skin-red .user-panel>.info,
.skin-red .user-panel>.info>a {
color: #fff
}
.skin-red .nav>li.header {
color: #4b646f;
background: #1a2226
}
.skin-red .nav>li.active {
color: #fff;
border-left: 3px solid #dd4b39;
background: #293846;
}
.skin-red .nav>li.active:last-child {
border-left: none;
}
.skin-red .content-tabs {
border-bottom: solid 2px #e7eaec;
}
.skin-red .nav>li>.treeview-menu {
margin: 0 1px;
background: #2c3b41
}
.skin-red .sidebar a {
color: #b8c7ce
}
.skin-red .sidebar a:hover {
text-decoration: none
}
.skin-red .treeview-menu>li>a {
color: #8aa4af
}
.skin-red .treeview-menu>li.active>a,
.skin-red .treeview-menu>li>a:hover {
color: #fff
}
.skin-red .sidebar-form {
border-radius: 3px;
border: 1px solid #374850;
margin: 10px 10px
}
.skin-red .sidebar-form input[type="text"],
.skin-red .sidebar-form .btn {
box-shadow: none;
background-color: #374850;
border: 1px solid transparent;
height: 35px
}
.skin-red .sidebar-form input[type="text"] {
color: #fff;
border-top-left-radius: 2px;
border-top-right-radius: 0;
border-bottom-right-radius: 0;
border-bottom-left-radius: 2px
}
.skin-red .sidebar-form input[type="text"]:focus,
.skin-red .sidebar-form input[type="text"]:focus+.input-group-btn .btn {
background-color: #fff;
color: #666
}
.skin-red .sidebar-form input[type="text"]:focus+.input-group-btn .btn {
border-left-color: #fff
}
.skin-red .sidebar-form .btn {
color: #999;
border-top-left-radius: 0;
border-top-right-radius: 2px;
border-bottom-right-radius: 2px;
border-bottom-left-radius: 0
}
/** 黄色主题 skin-red **/
.skin-yellow .navbar {
background-color: #f39c12
}
.skin-yellow .navbar .nav>li>a {
color: #fff
}
.skin-yellow .navbar .nav>li>a:hover,
.skin-yellow .navbar .nav>li>a:active,
.skin-yellow .navbar .nav>li>a:focus,
.skin-yellow .navbar .nav .open>a,
.skin-yellow .navbar .nav .open>a:hover,
.skin-yellow .navbar .nav .open>a:focus,
.skin-yellow .navbar .nav>.active>a {
background: rgba(0, 0, 0, 0.1);
color: #f6f6f6
}
.skin-yellow .navbar .sidebar-toggle {
color: #fff
}
.skin-yellow .navbar .sidebar-toggle:hover {
color: #f6f6f6;
background: rgba(0, 0, 0, 0.1)
}
.skin-yellow .navbar .sidebar-toggle {
color: #fff
}
.skin-yellow .navbar .sidebar-toggle:hover {
background-color: #e08e0b
}
@media ( max-width :767px) {
.skin-yellow .navbar .dropdown-menu li.divider {
background-color: rgba(255, 255, 255, 0.1)
}
.skin-yellow .navbar .dropdown-menu li a {
color: #fff
}
.skin-yellow .navbar .dropdown-menu li a:hover {
background: #e08e0b
}
}
.skin-yellow .logo {
background-color: #e08e0b;
color: #fff;
border-bottom: 0 solid transparent
}
.skin-yellow .logo:hover {
background-color: #db8b0b
}
.skin-yellow li.user-header {
background-color: #f39c12
}
.skin-yellow .content-header {
background: transparent
}
.skin-yellow .wrapper,
.skin-yellow .main-sidebar,
.skin-yellow .left-side {
background-color: #222d32
}
.skin-yellow .user-panel>.info,
.skin-yellow .user-panel>.info>a {
color: #fff
}
.skin-yellow .nav>li.header {
color: #4b646f;
background: #1a2226
}
.skin-yellow .nav>li.active {
color: #fff;
background: #293846;
border-left: 3px solid #f39c12;
}
.skin-yellow .nav>li.active:last-child {
border-left: none;
}
.skin-yellow .content-tabs {
border-bottom: solid 2px #e7eaec;
}
.skin-yellow .nav>li>.treeview-menu {
margin: 0 1px;
background: #2c3b41
}
.skin-yellow .sidebar a {
color: #b8c7ce
}
.skin-yellow .sidebar a:hover {
text-decoration: none
}
.skin-yellow .treeview-menu>li>a {
color: #8aa4af
}
.skin-yellow .treeview-menu>li.active>a,
.skin-yellow .treeview-menu>li>a:hover {
color: #fff
}
.skin-yellow .sidebar-form {
border-radius: 3px;
border: 1px solid #374850;
margin: 10px 10px
}
.skin-yellow .sidebar-form input[type="text"],
.skin-yellow .sidebar-form .btn {
box-shadow: none;
background-color: #374850;
border: 1px solid transparent;
height: 35px
}
.skin-yellow .sidebar-form input[type="text"] {
color: #666;
border-top-left-radius: 2px;
border-top-right-radius: 0;
border-bottom-right-radius: 0;
border-bottom-left-radius: 2px
}
.skin-yellow .sidebar-form input[type="text"]:focus,
.skin-yellow .sidebar-form input[type="text"]:focus+.input-group-btn .btn {
background-color: #fff;
color: #666
}
.skin-yellow .sidebar-form input[type="text"]:focus+.input-group-btn .btn {
border-left-color: #fff
}
.skin-yellow .sidebar-form .btn {
color: #999;
border-top-left-radius: 0;
border-top-right-radius: 2px;
border-bottom-right-radius: 2px;
border-bottom-left-radius: 0
}
/** 紫色主题 skin-purple **/
.skin-purple .navbar {
background-color: #605ca8
}
.skin-purple .navbar .nav>li>a {
color: #fff
}
.skin-purple .navbar .nav>li>a:hover,
.skin-purple .navbar .nav>li>a:active,
.skin-purple .navbar .nav>li>a:focus,
.skin-purple .navbar .nav .open>a,
.skin-purple .navbar .nav .open>a:hover,
.skin-purple .navbar .nav .open>a:focus,
.skin-purple .navbar .nav>.active>a {
background: rgba(0, 0, 0, 0.1);
color: #f6f6f6
}
.skin-purple .navbar .sidebar-toggle {
color: #fff
}
.skin-purple .navbar .sidebar-toggle:hover {
color: #f6f6f6;
background: rgba(0, 0, 0, 0.1)
}
.skin-purple .navbar .sidebar-toggle {
color: #fff
}
.skin-purple .navbar .sidebar-toggle:hover {
background-color: #555299
}
@media ( max-width :767px) {
.skin-purple .navbar .dropdown-menu li.divider {
background-color: rgba(255, 255, 255, 0.1)
}
.skin-purple .navbar .dropdown-menu li a {
color: #fff
}
.skin-purple .navbar .dropdown-menu li a:hover {
background: #555299
}
}
.skin-purple .logo {
background-color: #555299;
color: #fff;
border-bottom: 0 solid transparent
}
.skin-purple .logo:hover {
background-color: #545096
}
.skin-purple li.user-header {
background-color: #605ca8
}
.skin-purple .content-header {
background: transparent
}
.skin-purple .wrapper,
.skin-purple .main-sidebar,
.skin-purple .left-side {
background-color: #222d32
}
.skin-purple .user-panel>.info,
.skin-purple .user-panel>.info>a {
color: #fff
}
.skin-purple .nav>li.header {
color: #4b646f;
background: #1a2226
}
.skin-purple .nav>li.active {
color: #fff;
background: #293846;
border-left: 3px solid #605ca8;
}
.skin-purple .nav>li.active:last-child {
border-left: none;
}
.skin-purple .content-tabs {
border-bottom: solid 2px #e7eaec;
}
.skin-purple .nav>li>.treeview-menu {
margin: 0 1px;
background: #2c3b41
}
.skin-purple .sidebar a {
color: #b8c7ce
}
.skin-purple .sidebar a:hover {
text-decoration: none
}
.skin-purple .treeview-menu>li>a {
color: #8aa4af
}
.skin-purple .treeview-menu>li.active>a,
.skin-purple .treeview-menu>li>a:hover {
color: #fff
}
.skin-purple .sidebar-form {
border-radius: 3px;
border: 1px solid #374850;
margin: 10px 10px
}
.skin-purple .sidebar-form input[type="text"],
.skin-purple .sidebar-form .btn {
box-shadow: none;
background-color: #374850;
border: 1px solid transparent;
height: 35px
}
.skin-purple .sidebar-form input[type="text"] {
color: #666;
border-top-left-radius: 2px;
border-top-right-radius: 0;
border-bottom-right-radius: 0;
border-bottom-left-radius: 2px
}
.skin-purple .sidebar-form input[type="text"]:focus,
.skin-purple .sidebar-form input[type="text"]:focus+.input-group-btn .btn {
background-color: #fff;
color: #666
}
.skin-purple .sidebar-form input[type="text"]:focus+.input-group-btn .btn {
border-left-color: #fff
}
.skin-purple .sidebar-form .btn {
color: #999;
border-top-left-radius: 0;
border-top-right-radius: 2px;
border-bottom-right-radius: 2px;
border-bottom-left-radius: 0
}
@@ -47,28 +47,44 @@ a:focus {
}
.nav.navbar-right>li>a {
color: #999c9e;
color: #fff;
font-size: 14px;
height: 50px;
padding: 18px 15px;
}
.nav>li.active>a {
color: #ffffff;
}
.navbar-default .nav>li>a:hover, .navbar-default .nav>li>a:focus {
background-color: #293846;
color: white;
.nav.navbar-right>li>a>.label {
position: absolute;
top: 9px;
right: 5px;
text-align: center;
font-size: 9px;
padding: 2px 4px;
line-height: .9;
}
.nav.navbar-right>li>a:hover {
background-color: #367fa9;
color: #fff;
}
.nav .open>a, .nav .open>a:hover, .nav .open>a:focus {
background: #fff;
.navbar-default .nav>li>a:hover,
.navbar-default .nav>li>a:focus {
background-color: #293846;
color: white;
}
.nav>li>a i {
margin-right: 6px;
.nav .open>a,
.nav .open>a:hover,
.nav .open>a:focus {
background: #fff;
}
.navbar {
border: 0;
border: 0;
}
.navbar-default {
@@ -77,12 +93,12 @@ a:focus {
position: relative;
}
.navbar-top-links li {
display: inline-block;
.nav.navbar-top-links li {
display: inline-block;
}
.navbar-top-links li:last-child {
margin-right: 30px;
margin-right: 16px;
}
body.body-small .navbar-top-links li:last-child {
@@ -179,7 +195,7 @@ body.body-small .navbar-top-links li:last-child {
}
.nav-header {
padding: 33px 25px;
padding: 34px 25px 20px 25px;
background: url("patterns/header-profile.png") no-repeat;
}
@@ -211,7 +227,7 @@ body.body-small .navbar-top-links li:last-child {
.minimalize-styl-2 {
padding: 4px 12px;
margin: 14px 5px 5px 20px;
margin: 12px 5px 5px 15px;
font-size: 14px;
float: left;
}
@@ -368,10 +384,6 @@ body.mini-navbar .navbar-default .nav>li>.nav-second-level li a {
z-index: 2030;
}
.navbar-fixed-top, .navbar-static-top {
background: #f3f3f4;
}
.fixed-nav #wrapper {
padding-top: 60px;
box-sizing: border-box;
@@ -460,18 +472,6 @@ body.body-small.fixed-sidebar.mini-navbar .navbar-static-side {
.fixed-sidebar.mini-navbar .nav li.active {
border-left-width: 0;
}
/*.fixed-sidebar.mini-navbar .nav li:hover>.nav-second-level, .canvas-menu.mini-navbar .nav li:hover>.nav-second-level*/
/*{*/
/*position: absolute;*/
/*left: 70px;*/
/*top: 40px;*/
/*background-color: #2f4050;*/
/*padding: 10px 10px 0 10px;*/
/*font-size: 12px;*/
/*display: block;*/
/*min-width: 140px;*/
/*border-radius: 2px;*/
/*}*/
/*伸缩菜单*/
.fixed-sidebar.mini-navbar .nav li:hover>a> span.nav-label {
@@ -485,7 +485,6 @@ body.body-small.fixed-sidebar.mini-navbar .navbar-static-side {
.fixed-sidebar.mini-navbar .nav li:hover>.nav-second-level {
top: 40px;
font-size: 12px;
/*padding: 10px 10px 0 10px;*/
background-color: #2f4050;
}
@@ -5507,8 +5506,8 @@ del {
}
20% {
-webkit-transform: scaleY (1);
transform: scaleY (1);
-webkit-transform: scaleY(1);
transform: scaleY(1);
}
}
@@ -5567,20 +5566,20 @@ del {
transform: translateX(42px) translateY(42px) rotate(-179deg);
}
50 .1 % {
-webkit-transform: translateX(42px) translateY(42px) rotate(-180deg);
transform: translateX(42px) translateY(42px) rotate(-180deg);
}
50.1% {
-webkit-transform: translateX(42px) translateY(42px) rotate(-180deg);
transform: translateX(42px) translateY(42px) rotate(-180deg);
}
75% {
-webkit-transform: translateX(0px) translateY(42px) rotate(-270deg) scale(0 .5 );
transform: translateX(0px) translateY(42px) rotate(-270deg) scale(0 .5 );
}
75% {
-webkit-transform: translateX(0px) translateY(42px) rotate(-270deg) scale(0 .5 );
transform: translateX(0px) translateY(42px) rotate(-270deg) scale(0 .5 );
}
100% {
-webkit-transform: rotate(-360deg);
transform: rotate(-360deg);
}
100% {
-webkit-transform: rotate(-360deg);
transform: rotate(-360deg);
}
}
@keyframes sk-wanderingCubeMove {
@@ -6567,391 +6566,24 @@ body.rtls .top-navigation .footer.fixed, body.rtls.top-navigation .footer.fixed
.rtls .ltr-support {
direction: ltr;
}
/*
*
* This is style for skin config
* Use only in demo theme
*
*/
.skin-setttings .title {
background: #efefef;
text-align: center;
text-transform: uppercase;
font-weight: 600;
display: block;
padding: 10px 15px;
font-size: 12px;
}
.setings-item {
padding: 10px 30px;
}
.setings-item.nb {
border: none;
}
.setings-item.skin {
text-align: center;
}
.setings-item .switch {
float: right;
}
.skin-name a {
text-transform: uppercase;
}
.setings-item a {
color: #fff;
}
.default-skin, .blue-skin, .ultra-skin, .yellow-skin {
text-align: center;
}
.default-skin {
font-weight: 600;
background: #1ab394;
}
.default-skin:hover {
background: #199d82;
}
.blue-skin {
font-weight: 600;
background: url("patterns/header-profile-skin-blue.png") repeat scroll 0 0;
}
.blue-skin:hover {
background: #0d8ddb;
}
.yellow-skin {
font-weight: 600;
background: url("patterns/header-profile-skin-yellow.png") repeat scroll 0 100%;
}
.yellow-skin:hover {
background: #ce8735;
}
.content-tabs {
border-bottom: solid 2px #2f4050;
}
.page-tabs a {
color: #999;
}
.page-tabs a i {
color: #ccc;
margin-left: 2px;
font-size: 13px;
}
.page-tabs a.active {
background: #2f4050;
color: #a7b1c2;
background: #eaedf1;
color: #23508e;
}
.page-tabs a.active:hover, .page-tabs a.active i:hover {
background: #293846;
color: #fff;
}
/*
*
* SKIN blue 若依管理系统
* NAME - blue/purple
*
*/
.skin-blue .minimalize-styl-2 {
margin: 14px 5px 5px 30px;
}
.skin-blue .navbar-top-links li:last-child {
margin-right: 30px;
}
.skin-blue.fixed-nav .minimalize-styl-2 {
margin: 14px 5px 5px 15px;
}
.skin-blue .spin-icon {
background: #0e9aef !important;
}
.skin-blue .nav-header {
background: #0e9aef;
background: url('patterns/header-profile-skin-blue.png');
}
.skin-blue.mini-navbar .nav-second-level {
background: #3e495f;
}
.skin-blue .breadcrumb {
background: transparent;
}
.skin-blue .page-heading {
border: none;
}
.skin-blue .nav>li.active {
background: #3a4459;
}
.skin-blue .nav>li>a {
color: #9ea6b9;
}
.skin-blue .nav>li.active>a {
color: #fff;
}
.skin-blue .navbar-minimalize {
background: #0e9aef;
border-color: #0e9aef;
}
body.skin-blue {
background: #3e495f;
}
.skin-blue .navbar-static-top {
background: #ffffff;
}
.skin-blue .dashboard-header {
background: transparent;
border-bottom: none !important;
border-top: none;
padding: 20px 30px 10px 30px;
}
.fixed-nav.skin-blue .navbar-fixed-top {
background: #fff;
}
.skin-blue .wrapper-content {
padding: 30px 15px;
}
.skin-blue #page-wrapper {
background: #f4f6fa;
}
.skin-blue .ibox-title, .skin-blue .ibox-content {
border-width: 1px;
}
.skin-blue .ibox-content:last-child {
border-style: solid solid solid solid;
}
.skin-blue .nav>li.active {
border: none;
}
.skin-blue .nav-header {
padding: 35px 25px 25px 25px;
}
.skin-blue .nav-header a.dropdown-toggle {
color: #fff;
margin-top: 10px;
}
.skin-blue .nav-header a.dropdown-toggle .text-muted {
color: #fff;
opacity: 0.8;
}
.skin-blue .profile-element {
text-align: center;
}
.skin-blue .img-circle {
border-radius: 5px;
}
.skin-blue .navbar-default .nav>li>a:hover, .skin-blue .navbar-default .nav>li>a:focus {
background: #39aef5;
color: #fff;
}
.skin-blue .nav.nav-tabs>li.active>a {
color: #555;
}
.skin-blue .content-tabs {
border-bottom: solid 2px #39aef5;
}
.skin-blue .nav.nav-tabs>li.active {
background: transparent;
}
.skin-blue .page-tabs a.active {
background: #39aef5;
color: #fff;
}
.skin-blue .page-tabs a.active:hover, .skin-blue .page-tabs a.active i:hover {
background: #0e9aef;
color: #fff;
}
/*
*
* SKIN Yellow 若依管理系统
* NAME - Yellow/purple
*
*/
.skin-yellow .minimalize-styl-2 {
margin: 14px 5px 5px 30px;
}
.skin-yellow .navbar-top-links li:last-child {
margin-right: 30px;
}
.skin-yellow.fixed-nav .minimalize-styl-2 {
margin: 14px 5px 5px 15px;
}
.skin-yellow .spin-icon {
background: #ecba52 !important;
}
body.boxed-layout.skin-yellow #wrapper {
background: #3e2c42;
}
.skin-yellow .nav-header {
background: #ecba52;
background: url('patterns/header-profile-skin-yellow.png');
}
.skin-yellow.mini-navbar .nav-second-level {
background: #3e2c42;
}
.skin-yellow .breadcrumb {
background: transparent;
}
.skin-yellow .page-heading {
border: none;
}
.skin-yellow .nav>li.active {
background: #38283c;
}
.fixed-nav.skin-yellow .navbar-fixed-top {
background: #fff;
}
.skin-yellow .nav>li>a {
color: #948b96;
}
.skin-yellow .nav>li.active>a {
color: #fff;
}
.skin-yellow .navbar-minimalize {
background: #ecba52;
border-color: #ecba52;
}
body.skin-yellow {
background: #3e2c42;
}
.skin-yellow .navbar-static-top {
background: #ffffff;
}
.skin-yellow .dashboard-header {
background: transparent;
border-bottom: none !important;
border-top: none;
padding: 20px 30px 10px 30px;
}
.skin-yellow .wrapper-content {
padding: 30px 15px;
}
.skin-yellow #page-wrapper {
background: #f4f6fa;
}
.skin-yellow .ibox-title, .skin-yellow .ibox-content {
border-width: 1px;
}
.skin-yellow .ibox-content:last-child {
border-style: solid solid solid solid;
}
.skin-yellow .nav>li.active {
border: none;
}
.skin-yellow .nav-header {
padding: 35px 25px 25px 25px;
}
.skin-yellow .nav-header a.dropdown-toggle {
color: #fff;
margin-top: 10px;
}
.skin-yellow .nav-header a.dropdown-toggle .text-muted {
color: #fff;
opacity: 0.8;
}
.skin-yellow .profile-element {
text-align: center;
}
.skin-yellow .img-circle {
border-radius: 5px;
}
.skin-yellow .navbar-default .nav>li>a:hover, .skin-yellow .navbar-default .nav>li>a:focus {
background: #38283c;
color: #fff;
}
.skin-yellow .nav.nav-tabs>li.active>a {
color: #555;
}
.skin-yellow .nav.nav-tabs>li.active {
background: transparent;
}
.skin-yellow .content-tabs {
border-bottom: solid 2px #3e2c42;
}
.skin-yellow .nav.nav-tabs>li.active {
background: transparent;
}
.skin-yellow .page-tabs a.active {
background: #3e2c42;
color: #fff;
}
.skin-yellow .page-tabs a.active:hover, .skin-yellow .page-tabs a.active i:hover {
background: #38283c;
color: #fff;
.page-tabs a.active:hover,
.page-tabs a.active i:hover {
background: #eaedf1;
color: #23508e;
}
@media ( min-width : 768px) {
@@ -7279,7 +6911,8 @@ body.skin-yellow {
}
.navbar-header {
width: 60%;
width: 10%;
height: 50px;
}
.bs-glyphicons {
@@ -7347,3 +6980,99 @@ body.skin-yellow {
border-color: #cccccc!important;
}
.folder-list li.active a {
color: #2791df;
background: #f5f5f5;
}
.nav .logo {
background-color: #367fa9;
color: #fff;
border-bottom: 0 solid transparent;
-webkit-transition: width .3s ease-in-out;
-o-transition: width .3s ease-in-out;
transition: width .3s ease-in-out;
display: block;
height: 50px;
font-size: 20px;
line-height: 50px;
text-align: center;
width: 220px;
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
padding: 0 15px;
font-weight: 300;
overflow: hidden
}
.logo-mini {
display: none;
}
.logo-lg {
display: block;
}
.roleList {
color: #d5d5d5;
margin-right: 10px;
padding-top: 10px;
line-height: 1;
white-space: nowrap;
overflow: hidden;
width: 110px;
}
.sidebar-collapse .user-panel {
white-space: nowrap;
position: relative;
width: 100%;
padding: 15px;
overflow: hidden;
}
.sidebar-collapse .user-panel .image>img {
width: 100%;
max-width: 45px;
height: auto;
}
.sidebar-collapse .user-panel>.info {
padding: 5px 5px 5px 15px;
line-height: 1;
position: absolute;
left: 55px;
}
.sidebar-collapse .user-panel>.info a {
color: #fff;
font-size: 12px;
}
.sidebar-collapse .user-panel>.info>p {
font-weight: 600;
margin-bottom: 9px;
color: #fff;
font-size: 12px;
}
.user-panel>.info>a>.fa,
.user-panel>.info>a>.ion,
.user-panel>.info>a>.glyphicon {
margin-right: 3px;
}
.nav>li:hover .dropdown-menu {
display: block;
}
#content-main.max {
height: calc(100% - 110px);
overflow: hidden;
width: 100%;
height: 100%;
left: 0px;
position: absolute;
top: 0px;
z-index: 9998;
margin: 0;
}
@@ -1,9 +1,64 @@
/**
* 通用css样式布局处理
* Copyright (c) 2018 ruoyi
* Copyright (c) 2019 ruoyi
*/
/** 用户管理 样式布局 */
/** 基础通用 **/
.pt5 {
padding-top: 5px;
}
.pr5 {
padding-right: 5px;
}
.pb5 {
padding-bottom: 5px;
}
.mt5 {
margin-top: 5px;
}
.mr5 {
margin-right: 5px;
}
.mb5 {
margin-bottom: 5px;
}
.ml5 {
margin-left: 5px;
}
.mt10 {
margin-top: 10px;
}
.mr10 {
margin-right: 10px;
}
.mb10 {
margin-bottom: 10px;
}
.ml0 {
margin-left: 10px;
}
.mt20 {
margin-top: 20px;
}
.mr20 {
margin-right: 20px;
}
.mb20 {
margin-bottom: 20px;
}
.ml20 {
margin-left: 20px;
}
/** 弹层组件 禁用样式 **/
.layer-disabled {
border: 1px #dedede solid !important;
background-color: #f1f1f1 !important;
color: #333 !important;
pointer-events: none;
}
/** 用户管理 样式布局 **/
.box {
position: relative;
border-radius: 3px;
@@ -91,7 +146,7 @@
margin: 5px 0 5px -25px
}
/** select2 样式修改 */
/** select2 样式修改 **/
.select2-container--default .select2-selection--multiple .select2-selection__choice {
background-color: #1AB394;
border-color: #1AB394;
@@ -112,7 +167,7 @@
padding-right: 10px
}
/** 表单验证 样式布局 */
/** 表单验证 样式布局 **/
label.error {
position: absolute;
right: 18px;
@@ -143,7 +198,7 @@ label.error {
max-width: none;
}
/** 复选框&单选框 */
/** 复选框&单选框 **/
.check-box,.radio-box {
display: inline-block;
box-sizing: border-box;
@@ -160,14 +215,14 @@ label.error {
left: 0
}
/* iCheck */
/** iCheck **/
.icheckbox-blue,.iradio-blue {
display: block;
margin: 0;
padding: 0;
width: 18px;
height: 18px;
background: url(/img/blue.png) no-repeat;
background: url(../../img/blue.png) no-repeat;
border: none;
cursor: pointer
}
@@ -214,7 +269,7 @@ label.error {
background-position: -180px 0
}
/** 遮罩层 */
/** 遮罩层 **/
.loaderbox {
display: inline-block;
min-width: 125px;
@@ -281,7 +336,7 @@ label.error {
}
}
/** 表单查询条件 */
/** 表单查询条件 **/
ul {
margin: 0;
padding: 0;
@@ -409,7 +464,7 @@ label {
cursor: pointer;
}
/** 表格查询数据 */
/** 表格查询数据 **/
.table-striped {
min-height: 75%;
}
@@ -436,3 +491,45 @@ label {
.table-bordered td,.table-bordered th {
border: 1px solid #ddd!important
}
/** 首页样式 **/
.ax_close_max {
position: fixed;
top: 5px;
left: 5px;
z-index: 9999;
display: none;
color: #ccc;
}
.navbar-right > .user-menu > .dropdown-menu {
border-top-right-radius:0;
border-top-left-radius:0;
padding:1px 0 0 0;
border-top-width:0;
width:138px;
}
.navbar-right > .user-menu .user-image {
float:left;
width:27px;
height:27px;
border-radius:50%;
margin-right:8px;
margin-top:-3px;
}
@media (max-width:767px) {
.navbar-right > .user-menu .user-image {
float:none;
margin-right:0;
margin-top:-8px;
line-height:10px;
}
}.dropdown-menu > li > a > .glyphicon,.dropdown-menu > li > a > .fa,.dropdown-menu > li > a > .ion {
margin-right:10px;
}
.dropdown-menu > li > a:hover {
background-color:#e1e3e9;
color:#333;
}
.dropdown-menu > .divider {
background-color:#eee;
}
@@ -1,6 +1,12 @@
/**
* 菜单处理
* 首页方法封装处理
* Copyright (c) 2019 ruoyi
*/
layer.config({
extend: 'moon/style.css',
skin: 'layer-ext-moon'
});
$(function() {
// MetsiMenu
$('#side-menu').metisMenu();
@@ -45,6 +51,7 @@ function() {
if ($(this).width() < 769) {
$('body').addClass('mini-navbar');
$('.navbar-static-side').fadeIn();
$(".sidebar-collapse .logo").addClass("hide");
}
});
@@ -55,12 +62,14 @@ function NavToggle() {
function SmoothlyMenu() {
if (!$('body').hasClass('mini-navbar')) {
$('#side-menu').hide();
$(".sidebar-collapse .logo").removeClass("hide");
setTimeout(function() {
$('#side-menu').fadeIn(500);
},
100);
} else if ($('body').hasClass('fixed-sidebar')) {
$('#side-menu').hide();
$(".sidebar-collapse .logo").addClass("hide");
setTimeout(function() {
$('#side-menu').fadeIn(500);
},
@@ -370,7 +379,8 @@ $(function() {
// 刷新按钮
$('.tabReload').on('click', refreshTab);
$('.menuTabs').on('dblclick', '.menuTab', refreshTab);
// 双击选项卡全屏显示
$('.menuTabs').on('dblclick', '.menuTab', activeTabMax);
// 左移按扭
$('.tabLeft').on('click', scrollTabLeft);
@@ -396,4 +406,27 @@ $(function() {
$('.page-tabs-content').css("margin-left", "0");
});
// tab全屏显示
$('.tabMaxCurrent').on('click', function () {
$('.page-tabs-content').find('.active').trigger("dblclick");
});
// 关闭全屏
$('#ax_close_max').click(function(){
$('#content-main').toggleClass('max');
$('#ax_close_max').hide();
})
// 双击选项卡全屏显示
function activeTabMax() {
$('#content-main').toggleClass('max');
$('#ax_close_max').show();
}
$(window).keydown(function(event) {
if (event.keyCode == 27) {
$('#content-main').removeClass('max');
$('#ax_close_max').hide();
}
});
});
@@ -1,8 +1,7 @@
/**
* 通用方法封装处理
* Copyright (c) 2018 ruoyi
* Copyright (c) 2019 ruoyi
*/
$(function() {
// select2复选框事件绑定
if ($.fn.select2 !== undefined) {
@@ -68,6 +67,22 @@ $(function() {
});
});
}
// laydate time-input 时间控件绑定
if ($(".time-input").length > 0) {
layui.use('laydate', function() {
var laydate = layui.laydate;
var times = $(".time-input");
for (var i = 0; i < times.length; i++) {
var time = times[i];
laydate.render({
elem: time,
theme: 'molv',
trigger: 'click',
done: function(value, date) {}
});
}
});
}
// tree 关键字搜索绑定
if ($("#keyword").length > 0) {
$("#keyword").bind("focus", function focusKey(e) {
@@ -85,20 +100,29 @@ $(function() {
$("#bootstrap-table").on("check.bs.table uncheck.bs.table check-all.bs.table uncheck-all.bs.table", function () {
var ids = $("#bootstrap-table").bootstrapTable("getSelections");
$('#toolbar .btn-del').toggleClass('disabled', !ids.length);
$('#toolbar .btn-edit').toggleClass('disabled', ids.length!=1);;
$('#toolbar .btn-edit').toggleClass('disabled', ids.length!=1);
});
// tree表格树 展开/折叠
var expandFlag = false;
$("#expandAllBtn").click(function() {
if (expandFlag) {
$('#bootstrap-table').bootstrapTreeTable('expandAll');
$('#bootstrap-tree-table').bootstrapTreeTable('expandAll');
} else {
$('#bootstrap-table').bootstrapTreeTable('collapseAll');
$('#bootstrap-tree-table').bootstrapTreeTable('collapseAll');
}
expandFlag = expandFlag ? false: true;
})
});
/** 刷新选项卡 */
var refreshItem = function(){
var topWindow = $(window.parent.document);
var currentId = $('.page-tabs-content', topWindow).find('.active').attr('data-id');
var target = $('.RuoYi_iframe[data-id="' + currentId + '"]', topWindow);
var url = target.attr('src');
target.attr('src', url).ready();
}
/** 创建选项卡 */
function createMenuItem(dataUrl, menuName) {
dataIndex = $.common.random(1,100),
@@ -138,13 +162,35 @@ function createMenuItem(dataUrl, menuName) {
return false;
}
/** 设置全局ajax超时处理 */
//日志打印封装处理
var log = {
log: function (msg) {
console.log(msg);
},
info: function(msg) {
console.info(msg);
},
warn: function(msg) {
console.warn(msg);
},
error: function(msg) {
console.error(msg);
}
};
/** 设置全局ajax处理 */
$.ajaxSetup({
complete: function(XMLHttpRequest, textStatus) {
if (textStatus == "parsererror") {
$.modal.confirm("登陆超时!请重新登陆!", function() {
window.location.href = ctx + "login";
})
if (textStatus == 'timeout') {
$.modal.alertWarning("服务器超时,请稍后再试!");
$.modal.closeLoading();
} else if (textStatus == "parsererror") {
$.modal.alertWarning("服务器错误,请联系管理员!");
$.modal.closeLoading();
}
}
});
});
layer.config({
extend: 'moon/style.css',
skin: 'layer-ext-moon'
});
@@ -1,6 +1,6 @@
/**
* 通用js方法封装处理
* Copyright (c) 2018 ruoyi
* Copyright (c) 2019 ruoyi
*/
(function ($) {
$.extend({
@@ -10,17 +10,21 @@
table: {
_option: {},
_params: {},
// 初始化表格
// 初始化表格参数
init: function(options) {
$.table._option = options;
$.table._params = $.common.isEmpty(options.queryParams) ? $.table.queryParams : options.queryParams;
_sortOrder = $.common.isEmpty(options.sortOrder) ? "asc" : options.sortOrder;
_sortName = $.common.isEmpty(options.sortName) ? "" : options.sortName;
_striped = $.common.isEmpty(options.striped) ? false : options.striped;
_escape = $.common.isEmpty(options.escape) ? false : options.escape;
_showFooter = $.common.isEmpty(options.showFooter) ? false : options.showFooter;
$('#bootstrap-table').bootstrapTable({
url: options.url, // 请求后台的URL*
contentType: "application/x-www-form-urlencoded", // 编码类型
method: 'post', // 请求方式(*
cache: false, // 是否使用缓存
striped: _striped, // 是否显示行间隔色
sortable: true, // 是否启用排序
sortStable: true, // 设置为 true 将获得稳定的排序
sortName: _sortName, // 排序列名称
@@ -29,9 +33,11 @@
pageNumber: 1, // 初始化加载第一页,默认第一页
pageSize: 10, // 每页的记录行数(*
pageList: [10, 25, 50], // 可供选择的每页的行数(*
escape: _escape, // 转义HTML字符串
showFooter: _showFooter, // 是否显示表尾
iconSize: 'outline', // 图标大小:undefined默认的按钮尺寸 xs超小按钮sm小按钮lg大按钮
toolbar: '#toolbar', // 指定工作栏
sidePagination: "server", // 启用服务端分页
sidePagination: "server", // 启用服务端分页
search: $.common.visible(options.search), // 是否显示搜索框功能
showSearch: $.common.visible(options.showSearch), // 是否显示检索信息
showRefresh: $.common.visible(options.showRefresh), // 是否显示刷新按钮
@@ -63,7 +69,14 @@
return { rows: [], total: 0 };
}
},
// 搜索
// 序列号生成
serialNumber: function (index) {
var table = $('#bootstrap-table').bootstrapTable('getOptions');
var pageSize = table.pageSize;
var pageNumber = table.pageNumber;
return pageSize * (pageNumber - 1) + index + 1;
},
// 搜索-默认第一个form
search: function(formId) {
var currentId = $.common.isEmpty(formId) ? $('form').attr('id') : formId;
var params = $("#bootstrap-table").bootstrapTable('getOptions');
@@ -81,7 +94,7 @@
}
$("#bootstrap-table").bootstrapTable('refresh', params);
},
// 下载
// 导出数据
exportExcel: function(formId) {
var currentId = $.common.isEmpty(formId) ? $('form').attr('id') : formId;
$.modal.loading("正在导出数据,请稍后...");
@@ -94,20 +107,76 @@
$.modal.closeLoading();
});
},
// 刷新
// 下载模板
importTemplate: function() {
$.get($.table._option.importTemplateUrl, function(result) {
if (result.code == web_status.SUCCESS) {
window.location.href = ctx + "common/download?fileName=" + result.msg + "&delete=" + true;
} else {
$.modal.alertError(result.msg);
}
});
},
// 导入数据
importExcel: function(formId) {
var currentId = $.common.isEmpty(formId) ? 'importForm' : formId;
$.form.reset(currentId);
layer.open({
type: 1,
area: ['400px', '230px'],
fix: false,
//不固定
maxmin: true,
shade: 0.3,
title: '导入' + $.table._option.modalName + '数据',
content: $('#' + currentId),
btn: ['<i class="fa fa-check"></i> 导入', '<i class="fa fa-remove"></i> 取消'],
// 弹层外区域关闭
shadeClose: true,
btn1: function(index, layero){
var file = layero.find('#file').val();
if (file == '' || (!$.common.endWith(file, '.xls') && !$.common.endWith(file, '.xlsx'))){
$.modal.msgWarning("请选择后缀为 “xls”或“xlsx”的文件。");
return false;
}
var index = layer.load(2, {shade: false});
var formData = new FormData();
formData.append("file", $('#file')[0].files[0]);
formData.append("updateSupport", $("input[name='updateSupport']").is(':checked'));
$.ajax({
url: $.table._option.importUrl,
data: formData,
cache: false,
contentType: false,
processData: false,
type: 'POST',
success: function (result) {
if (result.code == web_status.SUCCESS) {
$.modal.closeAll();
$.modal.alertSuccess(result.msg);
$.table.refresh();
} else {
layer.close(index);
$.modal.alertError(result.msg);
}
}
});
}
});
},
// 刷新表格
refresh: function() {
$("#bootstrap-table").bootstrapTable('refresh', {
url: $.table._option.url,
silent: true
});
},
// 查询选中列值
// 查询表格指定列值
selectColumns: function(column) {
return $.map($('#bootstrap-table').bootstrapTable('getSelections'), function (row) {
return row[column];
});
},
// 查询选中首列值
// 查询表格首列值
selectFirstColumns: function() {
return $.map($('#bootstrap-table').bootstrapTable('getSelections'), function (row) {
return row[$.table._option.columns[1].field];
@@ -123,6 +192,14 @@
}
});
return actions.join('');
},
// 显示表格指定列
showColumn: function(column) {
$("#bootstrap-table").bootstrapTable('showColumn', column);
},
// 隐藏表格指定列
hideColumn: function(column) {
$("#bootstrap-table").bootstrapTable('hideColumn', column);
}
},
// 表格树封装处理
@@ -131,17 +208,22 @@
// 初始化表格
init: function(options) {
$.table._option = options;
var treeTable = $('#bootstrap-table').bootstrapTreeTable({
id : options.id, // 用于设置父子关系
parentId : options.parentId, // 用于设置父子关系
type: 'get', // 请求方式(*
url: options.url, // 请求后台的URL*
ajaxParams : {}, // 请求数据的ajax的data属性
expandColumn : '1', // 在哪一列上面显示展开按钮
striped : false, // 是否各行渐变色
bordered : true, // 是否显示边框
toolbar: '#toolbar', // 指定工作栏
expandAll : $.common.visible(options.expandAll), // 是否全部展开
_striped = $.common.isEmpty(options.striped) ? false : options.striped;
_expandColumn = $.common.isEmpty(options.expandColumn) ? '1' : options.expandColumn;
var treeTable = $('#bootstrap-tree-table').bootstrapTreeTable({
code: options.code, // 用于设置父子关系
parentCode: options.parentCode, // 用于设置父子关系
type: 'get', // 请求方式(*
url: options.url, // 请求后台的URL*
ajaxParams: {}, // 请求数据的ajax的data属性
expandColumn: _expandColumn, // 在哪一列上面显示展开按钮
striped: _striped, // 是否显示行间隔色
bordered: true, // 是否显示边框
toolbar: '#toolbar', // 指定工作栏
showRefresh: $.common.visible(options.showRefresh), // 是否显示刷新按钮
showColumns: $.common.visible(options.showColumns), // 是否显示隐藏某列下拉框
expandAll: $.common.visible(options.expandAll), // 是否全部展开
expandFirst: $.common.visible(options.expandFirst), // 是否默认第一级展开--expandAll为false时生效
columns: options.columns
});
$._treeTable = treeTable;
@@ -265,6 +347,10 @@
var index = parent.layer.getFrameIndex(window.name);
parent.layer.close(index);
},
// 关闭全部窗体
closeAll: function () {
layer.closeAll();
},
// 确认窗体
confirm: function (content, callBack) {
layer.confirm(content, {
@@ -368,11 +454,27 @@
shade: 0.3,
title: title,
content: url,
btn: ['确定', '关闭'],
// 弹层外区域关闭
shadeClose: true
shadeClose: true,
yes: function(index, layero) {
var iframeWin = layero.find('iframe')[0];
iframeWin.contentWindow.submitHandler();
},
cancel: function(index) {
return true;
}
});
layer.full(index);
},
// 禁用按钮
disable: function() {
$("a[class*=layui-layer-btn]", window.parent.document).addClass("layer-disabled");
},
// 启用按钮
enable: function() {
$("a[class*=layui-layer-btn]", window.parent.document).removeClass("layer-disabled");
},
// 打开遮罩层
loading: function (message) {
$.blockUI({ message: '<div class="loaderbox"><div class="loading-activity"></div> ' + message + '</div>' });
@@ -392,12 +494,14 @@
operate: {
// 提交数据
submit: function(url, type, dataType, data) {
$.modal.loading("正在处理中,请稍后...");
var config = {
url: url,
type: type,
dataType: dataType,
data: data,
beforeSend: function () {
$.modal.loading("正在处理中,请稍后...");
},
success: function(result) {
$.operate.ajaxSuccess(result);
}
@@ -408,24 +512,35 @@
post: function(url, data) {
$.operate.submit(url, "post", "json", data);
},
// get请求传输
get: function(url) {
$.operate.submit(url, "get", "json", "");
},
// 详细信息
detail: function(id) {
detail: function(id, width, height) {
var _url = $.common.isEmpty(id) ? $.table._option.detailUrl : $.table._option.detailUrl.replace("{id}", id);
layer.open({
var _width = $.common.isEmpty(width) ? "800" : width;
var _height = $.common.isEmpty(height) ? ($(window).height() - 50) : height;
//如果是移动端,就使用自适应大小弹窗
if (navigator.userAgent.match(/(iPhone|iPod|Android|ios)/i)) {
_width = 'auto';
_height = 'auto';
}
top.layer.open({
type: 2,
area: ['800px', ($(window).height() - 50) + 'px'],
area: [_width + 'px', _height + 'px'],
fix: false,
//不固定
maxmin: true,
shade: 0.3,
title: $.table._option.modalName + "详细",
content: _url,
btn: ['<i class="fa fa-close"></i> 关闭'],
btn: ['关闭'],
// 弹层外区域关闭
shadeClose: true,
cancel: function(index) {
return true;
}
cancel: function(index){
return true;
}
});
},
// 删除信息
@@ -438,7 +553,7 @@
},
// 批量删除信息
removeAll: function() {
var rows = $.common.isEmpty($.table._option.id) ? $.table.selectFirstColumns() : $.table.selectColumns($.table._option.id);
var rows = $.common.isEmpty($.table._option.uniqueId) ? $.table.selectFirstColumns() : $.table.selectColumns($.table._option.uniqueId);
if (rows.length == 0) {
$.modal.alertWarning("请至少选择一条记录");
return;
@@ -467,19 +582,23 @@
if ($.common.isNotEmpty(id)) {
url = $.table._option.updateUrl.replace("{id}", id);
} else {
var id = $.common.isEmpty($.table._option.id) ? $.table.selectFirstColumns() : $.table.selectColumns($.table._option.id);
var id = $.common.isEmpty($.table._option.uniqueId) ? $.table.selectFirstColumns() : $.table.selectColumns($.table._option.uniqueId);
if (id.length == 0) {
$.modal.alertWarning("请至少选择一条记录");
return;
}
url = $.table._option.updateUrl.replace("{id}", id);
}
$.modal.open("修改" + $.table._option.modalName, url);
},
// 工具栏表格树修改
editTree: function() {
var row = $('#bootstrap-table').bootstrapTreeTable('getSelections')[0];
if ($.common.isEmpty(row)) {
var row = $('#bootstrap-tree-table').bootstrapTreeTable('getSelections')[0];
if ($.common.isEmpty(row)) {
$.modal.alertWarning("请至少选择一条记录");
return;
}
var url = $.table._option.updateUrl.replace("{id}", row[$.table._option.id]);
var url = $.table._option.updateUrl.replace("{id}", row[$.table._option.uniqueId]);
$.modal.open("修改" + $.table._option.modalName, url);
},
// 添加信息 全屏
@@ -493,21 +612,24 @@
if ($.common.isNotEmpty(id)) {
url = $.table._option.updateUrl.replace("{id}", id);
} else {
var row = $.common.isEmpty($.table._option.id) ? $.table.selectFirstColumns() : $.table.selectColumns($.table._option.id);
var row = $.common.isEmpty($.table._option.uniqueId) ? $.table.selectFirstColumns() : $.table.selectColumns($.table._option.uniqueId);
url = $.table._option.updateUrl.replace("{id}", row);
}
$.modal.openFull("修改" + $.table._option.modalName, url);
},
// 保存信息
save: function(url, data) {
$.modal.loading("正在处理中,请稍后...");
var config = {
url: url,
type: "post",
dataType: "json",
data: data,
beforeSend: function () {
$.modal.loading("正在处理中,请稍后...");
$.modal.disable();
},
success: function(result) {
$.operate.saveSuccess(result);
$.operate.successCallback(result);
}
};
$.ajax(config)
@@ -522,7 +644,7 @@
}
$.modal.closeLoading();
},
// 保存结果提示msg
// 成功结果提示msg(父窗体全局更新)
saveSuccess: function (result) {
if (result.code == web_status.SUCCESS) {
$.modal.msgReload("保存成功,正在刷新数据请稍后……", modal_status.SUCCESS);
@@ -530,6 +652,26 @@
$.modal.alertError(result.msg);
}
$.modal.closeLoading();
},
// 成功回调执行事件(父窗体静默更新)
successCallback: function(result) {
if (result.code == web_status.SUCCESS) {
if (window.parent.$("#bootstrap-table").length > 0) {
$.modal.close();
window.parent.$.modal.msgSuccess(result.msg);
window.parent.$.table.refresh();
} else if (window.parent.$("#bootstrap-tree-table").length > 0) {
$.modal.close();
window.parent.$.modal.msgSuccess(result.msg);
window.parent.$.treeTable.refresh();
} else {
$.modal.msgReload("保存成功,正在刷新数据请稍后……", modal_status.SUCCESS);
}
} else {
$.modal.alertError(result.msg);
}
$.modal.closeLoading();
$.modal.enable();
}
},
// 校验封装处理
@@ -695,6 +837,17 @@
}
return true;
},
// 不允许最后层级节点选择
notAllowLastLevel: function(_tree) {
var nodes = _tree.getSelectedNodes();
for (var i = 0; i < nodes.length; i++) {
if (nodes[i].level == nodes.length + 1) {
$.modal.msgError("不能选择最后层级节点(" + nodes[i].name + "");
return false;
}
}
return true;
},
// 隐藏/显示搜索栏
toggleSearch: function() {
$('#search').slideToggle(200);
@@ -741,6 +894,14 @@
// 指定随机数返回
random: function (min, max) {
return Math.floor((Math.random() * max) + min);
},
startWith: function(value, start) {
var reg = new RegExp("^" + start);
return reg.test(value)
},
endWith: function(value, end) {
var reg = new RegExp(end + "$");
return reg.test(value)
}
}
});
@@ -1,7 +1,6 @@
$(function() {
validateRule();
$(".i-checks").iCheck({checkboxClass:"icheckbox_square-green-login"});
$('.imgcode').click(function() {
var url = ctx + "captcha/captchaImage?type=" + captchaType + "&s=" + Math.random();
$(".imgcode").attr("src", url);
@@ -35,6 +34,7 @@ function login() {
} else {
$.modal.closeLoading();
$('.imgcode').click();
$(".code").val("");
$.modal.msg(r.msg);
}
}
@@ -22,7 +22,7 @@
<!-- bootstrap-table 表格插件 -->
<script th:src="@{/ajax/libs/bootstrap-table/bootstrap-table.min.js}"></script>
<script th:src="@{/ajax/libs/bootstrap-table/locale/bootstrap-table-zh-CN.min.js}"></script>
<script th:src="@{/ajax/libs/bootstrap-table/extensions/mobile/bootstrap-table-mobile.min.js}"></script>
<script th:src="@{/ajax/libs/bootstrap-table/extensions/mobile/bootstrap-table-mobile.js}"></script>
<script th:src="@{/ajax/libs/bootstrap-table/extensions/toolbar/bootstrap-table-toolbar.min.js}"></script>
<!-- jquery-validate 表单验证插件 -->
<script th:src="@{/ajax/libs/validate/jquery.validate.min.js}"></script>
@@ -38,8 +38,8 @@
<script th:src="@{/ajax/libs/iCheck/icheck.min.js}"></script>
<script th:src="@{/ajax/libs/layer/layer.min.js}"></script>
<script th:src="@{/ajax/libs/layui/layui.js}"></script>
<script th:src="@{/ruoyi/js/common.js?v=3.0.0}"></script>
<script th:src="@{/ruoyi/js/ry-ui.js?v=3.0.0}"></script>
<script th:src="@{/ruoyi/js/common.js?v=3.2.0}"></script>
<script th:src="@{/ruoyi/js/ry-ui.js?v=3.2.0}"></script>
<script src="http://tajs.qq.com/stats?sId=62048022"></script>
<script th:inline="javascript"> var ctx = [[@{/}]]; </script>
</div>
@@ -15,9 +15,11 @@
<link th:href="@{/css/font-awesome.min.css}" rel="stylesheet"/>
<link th:href="@{/css/animate.css}" rel="stylesheet"/>
<link th:href="@{/css/style.css}" rel="stylesheet"/>
<link th:href="@{/ruoyi/css/ry-ui.css?v=3.0.0}" rel="stylesheet"/>
<link th:href="@{/css/skins.css}" rel="stylesheet"/>
<link th:href="@{/ruoyi/css/ry-ui.css?v=3.2.0}" rel="stylesheet"/>
<style type="text/css">
.nav > li:hover .dropdown-menu {display: block;}
#content-main.max { height: calc(100% - 110px); overflow: hidden; width: 100%; height: 100%; left: 0px; position: absolute; top: 0px; z-index: 9998; margin: 0; }
</style>
</head>
<body class="fixed-sidebar full-height-layout gray-bg" style="overflow: hidden" th:classappend="${@config.getKey('sys.index.skinName')}">
@@ -30,19 +32,24 @@
</div>
<div class="sidebar-collapse">
<ul class="nav" id="side-menu">
<li class="nav-header">
<div class="dropdown profile-element"> <span>
<img th:src="(${user.avatar} == '') ? @{/img/profile.jpg} : @{/profile/avatar/} + ${user.avatar}" alt="image" class="img-circle" height="60" width="60"/></span>
<a data-toggle="dropdown" class="dropdown-toggle" href="#">
<span class="clear"><span class="block m-t-xs"><strong class="font-bold" th:text="${user.userName}">用户</strong></span>
<span class="text-muted text-xs block"><span th:text="${user.dept?.deptName}">部门</span> <b class="caret"></b></span> </span> </a>
<ul class="dropdown-menu animated fadeInRight m-t-xs">
<li><a class="menuItem" th:href="@{/system/user/profile}">个人信息</a></li>
<li class="divider"></li>
<li><a th:href="@{logout}">退出</a></li>
</ul>
</div>
</li>
<li class="logo">
<span class="logo-lg">RuoYi</span>
</li>
<li>
<div class="user-panel">
<a class="menuItem" title="个人中心" th:href="@{/system/user/profile}">
<div class="hide" th:text="个人中心"></div>
<div class="pull-left image">
<img th:src="(${user.avatar} == '') ? @{/img/profile.jpg} : @{/profile/avatar/} + ${user.avatar}" class="img-circle" alt="User Image">
</div>
</a>
<div class="pull-left info">
<p>[[${user.loginName}]]</p>
<a href="#"><i class="fa fa-circle text-success"></i> 在线</a>
<a th:href="@{logout}" style="padding-left:5px;"><i class="fa fa-sign-out text-danger"></i> 注销</a>
</div>
</div>
</li>
<li class="active">
<a href="index.html"><i class="fa fa-home"></i> <span class="nav-label">主页</span> <span class="fa arrow"></span></a>
<ul class="nav nav-second-level">
@@ -73,25 +80,35 @@
<!--右侧部分开始-->
<div id="page-wrapper" class="gray-bg dashbard-1">
<div class="row border-bottom">
<nav class="navbar navbar-static-top" role="navigation"
style="margin-bottom: 0">
<nav class="navbar navbar-static-top" role="navigation" style="margin-bottom: 0">
<div class="navbar-header">
<a class="navbar-minimalize minimalize-styl-2 btn btn-default " href="#" title="收起菜单">
<a class="navbar-minimalize minimalize-styl-2" style="color:#FFF;" href="#" title="收起菜单">
<i class="fa fa-bars"></i>
</a>
<form role="search" class="navbar-form-custom" method="post" action="">
<div class="form-group">
<input type="text" placeholder="请输入您需要查找的内容 …" class="form-control" name="top-search" id="top-search">
</div>
</form>
</div>
<ul class="nav navbar-top-links navbar-right welcome-message">
<li>
<span class="m-r-sm text-muted">欢迎来到若依管理后台.</span>
</li>
<li><a id="fullScreen"><i class="fa fa-arrows-alt"></i>全屏</a></li>
<li><a th:href="@{logout}"><i class="fa fa-sign-out"></i>退出</a></li>
<li><a title="全屏显示" id="fullScreen"><i class="fa fa-arrows-alt"></i> 全屏显示</a></li>
<li class="dropdown user-menu">
<a href="javascript:" class="dropdown-toggle" data-toggle="dropdown" data-hover="dropdown">
<img th:src="(${user.avatar} == '') ? @{/img/profile.jpg} : @{/profile/avatar/} + ${user.avatar}" class="user-image">
<span class="hidden-xs">[[${user.userName}]]</span>
</a>
<ul class="dropdown-menu">
<li class="mt5">
<a th:href="@{/system/user/profile}" class="menuItem">
<i class="fa fa-user"></i> 个人中心</a>
</li>
<li>
<a onclick="resetPwd()" class="menuItem">
<i class="fa fa-key"></i> 修改密码</a>
</li>
<li class="divider"></li>
<li>
<a th:href="@{logout}">
<i class="fa fa-sign-out"></i> 退出登录</a>
</li>
</ul>
</li>
</ul>
</nav>
</div>
@@ -115,10 +132,14 @@
<li><a class="tabCloseCurrent" href="javascript:void();">关闭当前</a></li>
<li><a class="tabCloseOther" href="javascript:void();">关闭其他</a></li>
<li><a class="tabCloseAll" href="javascript:void();">全部关闭</a></li>
<li><a class="tabMaxCurrent" href="javascript:void();">全屏显示</a></li>
</ul>
</div>
<a href="#" class="roll-nav roll-right tabReload"><i class="fa fa-refresh"></i> 刷新</a>
</div>
<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">
<iframe class="RuoYi_iframe" name="iframe0" width="100%" height="100%" data-id="/system/main"
th:src="@{/system/main}" frameborder="0" seamless></iframe>
@@ -135,9 +156,18 @@
<script th:src="@{/js/plugins/metisMenu/jquery.metisMenu.js}"></script>
<script th:src="@{/js/plugins/slimscroll/jquery.slimscroll.min.js}"></script>
<script th:src="@{/ajax/libs/blockUI/jquery.blockUI.js}"></script>
<script th:src="@{/ajax/libs/layer/layer.min.js}"></script>
<script src="http://tajs.qq.com/stats?sId=62048022"></script>
<script th:src="@{/ruoyi/js/ry-ui.js?v=3.0.0}"></script>
<script th:src="@{/ruoyi/js/ry-ui.js?v=3.2.0}"></script>
<script th:src="@{/ruoyi/index.js}"></script>
<script th:src="@{/ajax/libs/fullscreen/jquery.fullscreen.js}"></script>
<script th:inline="javascript">
var ctx = [[@{/}]];
/*用户管理-重置密码*/
function resetPwd() {
var url = ctx + 'system/user/profile/resetPwd';
$.modal.open("重置密码", url, '800', '500');
}
</script>
</body>
</html>
@@ -11,8 +11,7 @@
<link href="../static/css/font-awesome.min.css" th:href="@{css/font-awesome.min.css}" rel="stylesheet"/>
<link href="../static/css/style.css" th:href="@{css/style.css}" rel="stylesheet"/>
<link href="../static/css/login.min.css" th:href="@{css/login.min.css}" rel="stylesheet"/>
<link href="../static/ajax/libs/iCheck/custom.css" th:href="@{/ajax/libs/iCheck/custom.css}" rel="stylesheet"/>
<link href="../static/ruoyi/css/ry-ui.css" th:href="@{/ruoyi/css/ry-ui.css?v=3.0.0}" rel="stylesheet"/>
<link href="../static/ruoyi/css/ry-ui.css" th:href="@{/ruoyi/css/ry-ui.css?v=3.2.0}" rel="stylesheet"/>
<!--[if lt IE 9]>
<meta http-equiv="refresh" content="0;ie.html" />
<![endif]-->
@@ -49,8 +48,8 @@
<h4 class="no-margins">登录:</h4>
<p class="m-t-md">你若不离不弃,我必生死相依</p>
<input type="text" name="username" class="form-control uname" placeholder="用户名" value="admin" />
<input type="password" name="password" class="form-control pword m-b" placeholder="密码" value="admin123" />
<div class="row" th:if="${captchaEnabled==true}">
<input type="password" name="password" class="form-control pword" placeholder="密码" value="admin123" />
<div class="row m-t" th:if="${captchaEnabled==true}">
<div class="col-xs-6">
<input type="text" name="validateCode" class="form-control code" placeholder="验证码" maxlength="5">
</div>
@@ -60,7 +59,9 @@
</a>
</div>
</div>
<input class="i-checks" type="checkbox" name="rememberme" />&nbsp;&nbsp;记住我
<div class="checkbox-custom">
<input type="checkbox" id="rememberme" name="rememberme"> <label for="rememberme">记住我</label>
</div>
<button class="btn btn-success btn-block" id="btnSubmit" data-loading="正在验证登录,请稍后...">登录</button>
</form>
</div>
@@ -80,10 +81,9 @@
<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/validate/messages_zh.min.js" th:src="@{/ajax/libs/validate/messages_zh.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/iCheck/icheck.min.js" th:src="@{/ajax/libs/iCheck/icheck.min.js}"></script>
<script src="../static/ajax/libs/blockUI/jquery.blockUI.js" th:src="@{/ajax/libs/blockUI/jquery.blockUI.js}"></script>
<script src="http://tajs.qq.com/stats?sId=62048022"></script>
<script src="../static/ruoyi/js/ry-ui.js" th:src="@{/ruoyi/js/ry-ui.js?v=3.0.0}"></script>
<script src="../static/ruoyi/js/ry-ui.js" th:src="@{/ruoyi/js/ry-ui.js?v=3.2.0}"></script>
<script src="../static/ruoyi/login.js" th:src="@{/ruoyi/login.js}"></script>
</body>
</html>
@@ -16,11 +16,9 @@
<div class="row border-bottom white-bg dashboard-header">
<div class="col-sm-12">
<blockquote class="text-warning" style="font-size:14px">
高性能云服务器2折起
<br><a target="_blank" href="https://promotion.aliyun.com/ntms/act/qwbk.html?userCode=brki8iof">https://promotion.aliyun.com/ntms/act/qwbk.html?userCode=brki8iof</a>
<br>云产品通用代金券,可叠加官网常规优惠使用
<br><a target="_blank" href="https://promotion.aliyun.com/ntms/yunparter/invite.html?userCode=brki8iof">https://promotion.aliyun.com/ntms/yunparter/invite.html?userCode=brki8iof</a>
<h4 class="text-danger">限时活动推广。</h4>
领取阿里云1888通用代金券(新老客户均可用)
<br><a target="_blank" href="https://promotion.aliyun.com/ntms/yunparter/invite.html?userCode=brki8iof">https://promotion.aliyun.com/ntms/yunparter/invite.html?userCode=brki8iof</a>
<h4 class="text-danger">云产品通用红包,可叠加官网常规优惠使用</h4>
</blockquote>
<hr>
@@ -79,7 +77,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> <a href="https://jq.qq.com/?_wv=1027&k=5cHeRVW" target="_blank">1679294</a>
<p><i class="fa fa-qq"></i> QQ群:<s>满1389287</s> <s>满1679294</s> <a href="https://jq.qq.com/?_wv=1027&k=5YW0wjE" target="_blank">1529866</a>
</p>
<p><i class="fa fa-weixin"></i> 微信:<a href="javascript:;">/ *若依</a>
</p>
@@ -96,13 +94,83 @@
<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="#v32">v3.2.0</a><code class="pull-right">2019.01.18</code>
</h5>
</div>
<div id="v32" class="panel-collapse collapse in">
<div class="panel-body">
<ol>
<li>部门修改时不允许选择最后节点</li>
<li>修复部门菜单排序字段无效</li>
<li>修复光驱磁盘导致服务监控异常</li>
<li>登录界面去除check插件</li>
<li>验证码文本字符间距修正</li>
<li>升级SpringBoot到最新版本2.1.1</li>
<li>升级MYSQL驱动</li>
<li>修正登录必填项位置偏移</li>
<li>Session会话检查优化</li>
<li>Excel注解支持多级获取</li>
<li>新增序列号生成方法</li>
<li>修复WAR部署tomcat退出线程异常</li>
<li>全屏操作增加默认确认/关闭</li>
<li>修复个人信息可能导致漏洞</li>
<li>字典数据根据下拉选择新增类型</li>
<li>升级Summernote到最新版本v0.8.11</li>
<li>新增用户数据导入</li>
<li>首页主题样式更换</li>
<li>layer扩展主题更换</li>
<li>用户管理移动端默认隐藏左侧布局</li>
<li>详细信息弹出层显示在顶层</li>
<li>表格支持切换状态(用户/角色/定时任务)</li>
<li>Druid数据源支持配置继承</li>
<li>修正部分iPhone手机端表格适配问题</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="#v31">v3.1.0</a><code class="pull-right">2018.12.03</code>
</h5>
</div>
<div id="v31" class="panel-collapse collapse">
<div class="panel-body">
<ol>
<li>新增内网不获取IP地址</li>
<li>新增cron表达式有效校验</li>
<li>定时任务新增详细信息</li>
<li>定时任务默认策略修改(不触发立即执行)</li>
<li>定时任务显示下一个执行周期</li>
<li>支持前端任意日期格式处理</li>
<li>上传头像删除多余提交按钮</li>
<li>表格增加行间隔色配置项</li>
<li>表格增加转义HTML字符串配置项</li>
<li>表格增加显示/隐藏指定列</li>
<li>代码生成优化</li>
<li>操作日志参数格式化显示</li>
<li>页签新增新增全屏显示</li>
<li>新增一键打包部署</li>
<li>Excel注解新增多个参数</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="#v30">v3.0.0</a><code class="pull-right">2018.10.08</code>
</h5>
</div>
<div id="v30" class="panel-collapse collapse in">
<div id="v30" class="panel-collapse collapse">
<div class="panel-body">
<ol>
<li>升级poi到最新版3.17</li>
@@ -38,8 +38,8 @@
<div class="form-group">
<label class="col-sm-3 control-label">执行策略:</label>
<div class="col-sm-8">
<label class="radio-box"> <input type="radio" name="misfirePolicy" value="1" /> 继续执行 </label>
<label class="radio-box"> <input type="radio" name="misfirePolicy" value="2" /> 一次执行 </label>
<label class="radio-box"> <input type="radio" name="misfirePolicy" value="1" th:checked="true"/> 立即执行 </label>
<label class="radio-box"> <input type="radio" name="misfirePolicy" value="2" /> 执行一次 </label>
<label class="radio-box"> <input type="radio" name="misfirePolicy" value="3" /> 放弃执行 </label>
</div>
</div>
@@ -74,11 +74,26 @@
},
cronExpression:{
required:true,
remote: {
url: prefix + "/checkCronExpressionIsValid",
type: "post",
dataType: "json",
data: {
"cronExpression": function() {
return $.common.trim($("#cronExpression").val());
}
},
dataFilter: function(data, type) {
return data;
}
}
},
},
submitHandler:function(form){
$.operate.save(prefix + "/add", $('#form-job-add').serialize());
}
messages: {
"cronExpression": {
remote: "表达式不正确"
}
}
});
function submitHandler() {
@@ -0,0 +1,94 @@
<!DOCTYPE html>
<html lang="zh" xmlns:th="http://www.thymeleaf.org"
xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
<meta charset="utf-8">
<head th:include="include :: header"></head>
<body class="white-bg">
<div class="wrapper wrapper-content animated fadeInRight ibox-content">
<form class="form-horizontal m-t" id="jobLogForm" th:if="${name == 'jobLog'}">
<div class="form-group">
<label class="col-sm-3 control-label">日志序号:</label>
<div class="form-control-static" th:text="${jobLog.jobLogId}">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">任务名称:</label>
<div class="form-control-static" th:text="${jobLog.jobName}">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">任务组名:</label>
<div class="form-control-static" th:text="${jobLog.jobGroup}">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">任务方法:</label>
<div class="form-control-static" th:text="${jobLog.methodName} + '(' + ${#strings.defaultString(jobLog.methodParams,'')} + ')'">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">日志信息:</label>
<div class="form-control-static" th:text="${jobLog.jobMessage}">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">执行状态:</label>
<div class="form-control-static" th:class="${jobLog.status == '0' ? 'label label-primary' : 'label label-danger'}" th:text="${jobLog.status == '0' ? '正常' : '失败'}">
</div>
</div>
<div class="form-group" th:style="'display:' + ${jobLog.status == '0' ? 'none' : 'block'}">
<label class="col-sm-3 control-label">异常信息:</label>
<div class="form-control-static" th:text="${jobLog.exceptionInfo}">
</div>
</div>
</form>
<form class="form-horizontal m-t" id="jobForm" th:if="${name == 'job'}">
<div class="form-group">
<label class="col-sm-3 control-label">任务序号:</label>
<div class="form-control-static" th:text="${job.jobId}">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">任务名称:</label>
<div class="form-control-static" th:text="${job.jobName}">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">任务组名:</label>
<div class="form-control-static" th:text="${job.jobGroup}">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">任务方法:</label>
<div class="form-control-static" th:text="${job.methodName} + '(' + ${#strings.defaultString(job.methodParams,'')} + ')'">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">执行表达式:</label>
<div class="form-control-static" th:text="${job.cronExpression}">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">下次执行时间:</label>
<div class="form-control-static" th:text="${#dates.format(job.nextValidTime, 'yyyy-MM-dd HH:mm:ss')}">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">执行策略:</label>
<div class="form-control-static" th:if="${job.misfirePolicy == '0'}">默认策略</div>
<div class="form-control-static" th:if="${job.misfirePolicy == '1'}">立即执行</div>
<div class="form-control-static" th:if="${job.misfirePolicy == '2'}">执行一次</div>
<div class="form-control-static" th:if="${job.misfirePolicy == '3'}">放弃执行</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">执行状态:</label>
<div class="form-control-static" th:class="${job.status == '0' ? 'label label-primary' : 'label label-danger'}" th:text="${job.status == '0' ? '正常' : '暂停'}">
</div>
</div>
</form>
</div>
</body>
</html>
@@ -39,8 +39,8 @@
<div class="form-group">
<label class="col-sm-3 control-label">执行策略:</label>
<div class="col-sm-8">
<label class="radio-box"> <input type="radio" th:field="*{misfirePolicy}" name="misfirePolicy" value="1" /> 继续执行 </label>
<label class="radio-box"> <input type="radio" th:field="*{misfirePolicy}" name="misfirePolicy" value="2" /> 一次执行 </label>
<label class="radio-box"> <input type="radio" th:field="*{misfirePolicy}" name="misfirePolicy" value="1" /> 立即执行 </label>
<label class="radio-box"> <input type="radio" th:field="*{misfirePolicy}" name="misfirePolicy" value="2" /> 执行一次 </label>
<label class="radio-box"> <input type="radio" th:field="*{misfirePolicy}" name="misfirePolicy" value="3" /> 放弃执行 </label>
</div>
</div>
@@ -75,8 +75,26 @@
},
cronExpression:{
required:true,
remote: {
url: prefix + "/checkCronExpressionIsValid",
type: "post",
dataType: "json",
data: {
"cronExpression": function() {
return $.common.trim($("#cronExpression").val());
}
},
dataFilter: function(data, type) {
return data;
}
}
},
}
},
messages: {
"cronExpression": {
remote: "表达式不正确"
}
}
});
function submitHandler() {
@@ -41,13 +41,13 @@
</a>
<a class="btn btn-danger btn-del disabled" onclick="$.operate.removeAll()" shiro:hasPermission="monitor:job:remove">
<i class="fa fa-remove"></i> 删除
</a>
<a class="btn btn-success" onclick="javascript:jobLog()" shiro:hasPermission="monitor:job:list">
<i class="fa fa-list"></i> 日志
</a>
<a class="btn btn-warning" onclick="$.table.exportExcel()" shiro:hasPermission="monitor:job:export">
<i class="fa fa-download"></i> 导出
</a>
<a class="btn btn-info" onclick="javascript:jobLog()" shiro:hasPermission="monitor:job:list">
<i class="fa fa-list"></i> 日志
</a>
</div>
<div class="col-sm-12 select-table table-striped">
@@ -57,6 +57,7 @@
</div>
<div th:include="include :: footer"></div>
<script th:inline="javascript">
var detailFlag = [[${@permission.hasPermi('monitor:job:detail')}]];
var editFlag = [[${@permission.hasPermi('monitor:job:edit')}]];
var removeFlag = [[${@permission.hasPermi('monitor:job:remove')}]];
var statusFlag = [[${@permission.hasPermi('monitor:job:changeStatus')}]];
@@ -66,6 +67,7 @@
$(function() {
var options = {
url: prefix + "/list",
detailUrl: prefix + "/detail/{id}",
createUrl: prefix + "/add",
updateUrl: prefix + "/edit/{id}",
removeUrl: prefix + "/remove",
@@ -105,12 +107,12 @@
title: '执行表达式'
},
{
field: 'status',
title: '任务状态',
align: 'center',
formatter: function(value, row, index) {
return $.table.selectDictLabel(datas, value);
}
visible: statusFlag == 'hidden' ? false : true,
title: '任务状态',
align: 'center',
formatter: function (value, row, index) {
return statusTools(row);
}
},
{
field: 'createTime',
@@ -122,47 +124,46 @@
align: 'center',
formatter: function(value, row, index) {
var actions = [];
actions.push(statusTools(row));
actions.push('<a class="btn btn-primary btn-xs ' + statusFlag + '" href="#" onclick="run(\'' + row.jobId + '\')"><i class="fa fa-play-circle-o"></i> 执行</a> ');
actions.push('<a class="btn btn-success btn-xs ' + editFlag + '" href="#" onclick="$.operate.edit(\'' + row.jobId + '\')"><i class="fa fa-edit"></i>编辑</a> ');
actions.push('<a class="btn btn-danger btn-xs ' + removeFlag + '" href="#" onclick="$.operate.remove(\'' + row.jobId + '\')"><i class="fa fa-remove"></i>删除</a>');
actions.push('<a class="btn btn-warning btn-xs ' + detailFlag + '" href="#" onclick="$.operate.detail(\'' + row.jobId + '\')"><i class="fa fa-search"></i>详细</a> ');
return actions.join('');
}
}]
};
$.table.init(options);
});
/* 调度任务状态显示 */
function statusTools(row) {
if (row.status == 1) {
return '<a class="btn btn-info btn-xs ' + statusFlag + '" href="#" onclick="start(\'' + row.jobId + '\')"><i class="fa fa-play"></i>启用</a> ';
} else {
return '<a class="btn btn-warning btn-xs ' + statusFlag + '" href="#" onclick="stop(\'' + row.jobId + '\')"><i class="fa fa-pause"></i>暂停</a> ';
}
return '<i class=\"fa fa-toggle-off text-info fa-2x\" onclick="start(\'' + row.jobId + '\')"></i> ';
} else {
return '<i class=\"fa fa-toggle-on text-info fa-2x\" onclick="stop(\'' + row.jobId + '\')"></i> ';
}
}
/*立即执行一次*/
/* 立即执行一次 */
function run(jobId) {
$.modal.confirm("确认要立即执行任务吗?", function() {
$.operate.post(prefix + "/run", { "jobId": jobId});
})
}
/*调度任务-停用*/
/* 调度任务-停用 */
function stop(jobId) {
$.modal.confirm("确认要停用任务吗?", function() {
$.operate.post(prefix + "/changeStatus", { "jobId": jobId, "status": 1 });
})
}
/*调度任务-启用*/
/* 调度任务-启用 */
function start(jobId) {
$.modal.confirm("确认要启用任务吗?", function() {
$.operate.post(prefix + "/changeStatus", { "jobId": jobId, "status": 0 });
})
}
//调度日志查询
/* 调度日志查询 */
function jobLog(id) {
var url = ctx + 'monitor/jobLog';
createMenuItem(url, "调度日志");
@@ -31,7 +31,7 @@
</li>
<li>
<a class="btn btn-primary btn-rounded btn-sm" onclick="$.table.search()"><i class="fa fa-search"></i>&nbsp;搜索</a>
<a class="btn btn-success btn-rounded btn-sm" onclick="$.table.exportExcel()" shiro:hasPermission="monitor:job:export"><i class="fa fa-download"></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>
@@ -45,6 +45,9 @@
<a class="btn btn-danger" onclick="$.operate.clean()" shiro:hasPermission="monitor:job:remove">
<i class="fa fa-trash"></i> 清空
</a>
<a class="btn btn-warning" onclick="$.table.exportExcel()" shiro:hasPermission="monitor:job:export">
<i class="fa fa-download"></i> 导出
</a>
</div>
<div class="col-sm-12 select-table table-striped">
@@ -54,14 +57,15 @@
</div>
<div th:include="include :: footer"></div>
<script th:inline="javascript">
var removeFlag = [[${@permission.hasPermi('monitor:job:remove')}]];
var datas = [[${@dict.getType('sys_job_status')}]];
var detailFlag = [[${@permission.hasPermi('monitor:job:detail')}]];
var datas = [[${@dict.getType('sys_common_status')}]];
var prefix = ctx + "monitor/jobLog";
$(function() {
var options = {
url: prefix + "/list",
cleanUrl: prefix + "/clean",
detailUrl: prefix + "/detail/{id}",
removeUrl: prefix + "/remove",
exportUrl: prefix + "/export",
sortName: "createTime",
@@ -116,7 +120,7 @@
align: 'center',
formatter: function(value, row, index) {
var actions = [];
actions.push('<a class="btn btn-danger btn-xs ' + removeFlag + '" href="#" onclick="$.operate.remove(\'' + row.jobLogId + '\')"><i class="fa fa-remove"></i>删除</a>');
actions.push('<a class="btn btn-warning btn-xs ' + detailFlag + '" href="#" onclick="$.operate.detail(\'' + row.jobLogId + '\')"><i class="fa fa-search"></i>详细</a>');
return actions.join('');
}
}]
@@ -31,7 +31,7 @@
</li>
<li>
<a class="btn btn-primary btn-rounded btn-sm" onclick="$.table.search()"><i class="fa fa-search"></i>&nbsp;搜索</a>
<a class="btn btn-success btn-rounded btn-sm" onclick="$.table.exportExcel()" shiro:hasPermission="monitor:logininfor:export"><i class="fa fa-download"></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>
@@ -45,6 +45,9 @@
<a class="btn btn-danger" onclick="$.operate.clean()" shiro:hasPermission="monitor:logininfor:remove">
<i class="fa fa-trash"></i> 清空
</a>
<a class="btn btn-warning" onclick="$.table.exportExcel()" shiro:hasPermission="monitor:logininfor:export">
<i class="fa fa-download"></i> 导出
</a>
</div>
<div class="col-sm-12 select-table table-striped">
@@ -69,6 +72,7 @@
modalName: "登录日志",
search: false,
showExport: false,
escape: true,
columns: [{
checkbox: true
},
@@ -49,9 +49,16 @@
sortName: "lastAccessTime",
sortOrder: "desc",
search: false,
escape: true,
columns: [{
checkbox: true
},
{
title: "序号",
formatter: function (value, row, index) {
return $.table.serialNumber(index);
}
},
{
field: 'sessionId',
title: '会话编号'
@@ -28,8 +28,7 @@
</div>
<div class="form-group">
<label class="col-sm-2 control-label">请求参数:</label>
<div class="form-control-static" th:text="${operLog.operParam}">
</div>
<div class="form-control-static"><pre id="operParam"></pre></div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">状态:</label>
@@ -44,5 +43,13 @@
</form>
</div>
<div th:include="include :: footer"></div>
<script th:inline="javascript">
$(function() {
var text = [[${operLog.operParam}]];
var result = JSON.stringify(JSON.parse(text), null, 2);
$("#operParam").html(result);
});
</script>
</body>
</html>
@@ -31,7 +31,7 @@
</li>
<li>
<a class="btn btn-primary btn-rounded btn-sm" onclick="$.table.search()"><i class="fa fa-search"></i>&nbsp;搜索</a>
<a class="btn btn-success btn-rounded btn-sm" onclick="$.table.exportExcel()" shiro:hasPermission="monitor:logininfor:export"><i class="fa fa-download"></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>
@@ -45,6 +45,9 @@
<a class="btn btn-danger" onclick="$.operate.clean()" shiro:hasPermission="monitor:logininfor:remove">
<i class="fa fa-trash"></i> 清空
</a>
<a class="btn btn-warning" onclick="$.table.exportExcel()" shiro:hasPermission="monitor:logininfor:export">
<i class="fa fa-download"></i> 导出
</a>
</div>
<div class="col-sm-12 select-table table-striped">
@@ -71,6 +74,7 @@
modalName: "操作日志",
search: false,
showExport: false,
escape: true,
columns: [{
checkbox: true
},
@@ -0,0 +1,254 @@
<!DOCTYPE html>
<html lang="zh" xmlns:th="http://www.thymeleaf.org"
xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
<meta charset="utf-8">
<head th:include="include :: header"></head>
<body class="gray-bg" id="test">
<div class="wrapper wrapper-content">
<div class="col-sm-12">
<div class="row">
<div class="col-sm-6">
<div class="ibox float-e-margins">
<div class="ibox-title">
<h5>CPU</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>
</div>
</div>
<div class="ibox-content">
<table class="table table-hover no-margins">
<thead>
<tr>
<th>属性</th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td>核心数</td>
<td th:text="${server.cpu.cpuNum}">0个</td>
</tr>
<tr>
<td>用户使用率</td>
<td th:text="${server.cpu.used + '%'}">0%</td>
</tr>
<tr>
<td>系统使用率</td>
<td th:text="${server.cpu.sys + '%'}">0%</td>
</tr>
<tr>
<td>当前空闲率</td>
<td th:text="${server.cpu.free + '%'}">0%</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<div class="col-sm-6">
<div class="ibox float-e-margins">
<div class="ibox-title">
<h5>内存</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>
</div>
</div>
<div class="ibox-content">
<table class="table table-hover no-margins">
<thead>
<tr>
<th>属性</th>
<th>内存</th>
<th>JVM</th>
</tr>
</thead>
<tbody>
<tr>
<td>总内存</td>
<td th:text="${server.mem.total + 'G'}">0GB</td>
<td th:text="${server.jvm.total + 'M'}">0MB</td>
</tr>
<tr>
<td>已用内存</td>
<td th:text="${server.mem.used + 'G'}">0GB</td>
<td th:text="${server.jvm.used + 'M'}">0MB</td>
</tr>
<tr>
<td>剩余内存</td>
<td th:text="${server.mem.free + 'G'}">0GB</td>
<td th:text="${server.jvm.free + 'M'}">0MB</td>
</tr>
<tr>
<td>使用率</td>
<td th:class="${server.mem.usage gt 80} ? 'text-danger'">[[${server.mem.usage}]]%</td>
<td th:class="${server.jvm.usage gt 80} ? 'text-danger'">[[${server.jvm.usage}]]%</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-sm-12">
<div class="ibox float-e-margins">
<div class="ibox-title">
<h5>服务器信息</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>
</div>
</div>
<div class="ibox-content">
<div class="row">
<div class="col-sm-12">
<table class="table table-hover margin bottom">
<tbody>
<tr>
<td>服务器名称</td>
<td th:text="${server.sys.computerName}">RuoYi</td>
<td>操作系统</td>
<td th:text="${server.sys.osName}">Linux</td>
</tr>
<tr>
<td>服务器IP</td>
<td th:text="${server.sys.computerIp}">127.0.0.1</td>
<td>系统架构</td>
<td th:text="${server.sys.osArch}">amd64</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-sm-12">
<div class="ibox float-e-margins">
<div class="ibox-title">
<h5>Java虚拟机信息</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>
</div>
</div>
<div class="ibox-content">
<div class="row">
<div class="col-sm-12">
<table class="table table-hover margin bottom">
<tbody>
<tr>
<td>Java名称</td>
<td th:text="${server.jvm.name}">Java</td>
<td>Java版本</td>
<td th:text="${server.jvm.version}">1.8.0</td>
</tr>
<tr>
<td>启动时间</td>
<td th:text="${server.jvm.startTime}">2018-12-31 00:00:00</td>
<td>运行时长</td>
<td th:text="${server.jvm.runTime}">0天0时0分0秒</td>
</tr>
<tr>
<td colspan="1">安装路径</td>
<td colspan="3" th:text="${server.jvm.home}"></td>
</tr>
<tr>
<td colspan="1">项目路径</td>
<td colspan="3" th:text="${server.sys.userDir}"></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-sm-12">
<div class="ibox float-e-margins">
<div class="ibox-title">
<h5>磁盘状态</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>
</div>
</div>
<div class="ibox-content">
<div class="row">
<div class="col-sm-12">
<table class="table table-hover margin bottom">
<thead>
<tr>
<th>盘符路径</th>
<th>文件系统</th>
<th>盘符类型</th>
<th>总大小</th>
<th>可用大小</th>
<th>已用大小</th>
<th>已用百分比</th>
</tr>
</thead>
<tbody>
<tr th:each="sysFile : ${server.sysFiles}">
<td th:text="${sysFile.dirName}">C:\</td>
<td th:text="${sysFile.sysTypeName}">NTFS</td>
<td th:text="${sysFile.typeName}">local</td>
<td th:text="${sysFile.total}">0GB</td>
<td th:text="${sysFile.free}">0GB</td>
<td th:text="${sysFile.used}">0GB</td>
<td th:class="${sysFile.usage gt 80} ? 'text-danger'">[[${sysFile.usage}]]%</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</body>
<div th:include="include :: footer"></div>
<script>
$(".modal").appendTo("body"), $("[data-toggle=popover]").popover(), $(".collapse-link").click(function() {
var div_ibox = $(this).closest("div.ibox"),
e = $(this).find("i"),
i = div_ibox.find("div.ibox-content");
i.slideToggle(200),
e.toggleClass("fa-chevron-up").toggleClass("fa-chevron-down"),
div_ibox.toggleClass("").toggleClass("border-bottom"),
setTimeout(function() {
div_ibox.resize();
}, 50);
}), $(".close-link").click(function () {
var div_ibox = $(this).closest("div.ibox");
div_ibox.remove()
});
</script>
</html>
@@ -107,7 +107,6 @@
var options = {
title: '部门选择',
width: "380",
height: "380",
url: prefix + "/selectDeptTree/" + $("#treeId").val(),
callBack: doSubmit
};
@@ -40,7 +40,7 @@
</a>
</div>
<div class="col-sm-12 select-table table-striped">
<table id="bootstrap-table" data-mobile-responsive="true"></table>
<table id="bootstrap-tree-table" data-mobile-responsive="true"></table>
</div>
</div>
</div>
@@ -54,8 +54,9 @@
$(function() {
var options = {
id: "deptId",
parentId: "parentId",
code: "deptId",
parentCode: "parentId",
uniqueId: "deptId",
url: prefix + "/list",
createUrl: prefix + "/add/{id}",
updateUrl: prefix + "/edit/{id}",
@@ -108,21 +108,28 @@
/*部门管理-修改-选择部门树*/
function selectDeptTree() {
var options = {
title: '部门选择',
width: "380",
height: "380",
url: prefix + "/selectDeptTree/" + $("#treeId").val(),
callBack: doSubmit
};
$.modal.openOptions(options);
var deptId = $("#treeId").val();
if(deptId > 0) {
var options = {
title: '部门选择',
width: "380",
url: prefix + "/selectDeptTree/" + $("#treeId").val(),
callBack: doSubmit
};
$.modal.openOptions(options);
} else {
$.modal.alertError("父部门不能选择");
}
}
function doSubmit(index, layero){
var body = layer.getChildFrame('body', index);
$("#treeId").val(body.find('#treeId').val());
$("#treeName").val(body.find('#treeName').val());
layer.close(index);
var tree = layero.find("iframe")[0].contentWindow.$._tree;
if ($.tree.notAllowLastLevel(tree)) {
var body = layer.getChildFrame('body', index);
$("#treeId").val(body.find('#treeId').val());
$("#treeName").val(body.find('#treeName').val());
layer.close(index);
}
}
</script>
</body>
@@ -35,7 +35,7 @@
</div>
<div class="btn-group-sm hidden-xs" id="toolbar" role="group">
<a class="btn btn-primary" th:onclick="'javascript:$.operate.add(\''+${dict.dictType}+'\')'" shiro:hasPermission="system:dict:add">
<a class="btn btn-success" onclick="add()" shiro:hasPermission="system:dict:add">
<i class="fa fa-plus"></i> 新增
</a>
<a class="btn btn-primary btn-edit disabled" onclick="$.operate.edit()" shiro:hasPermission="system:dict:edit">
@@ -135,6 +135,12 @@
isAsc: params.order
};
}
/*字典数据-新增字典*/
function add() {
var dictType = $("#dictType option:selected").val();
$.operate.add(dictType);
}
</script>
</body>
</html>
@@ -151,7 +151,6 @@
var options = {
title: '菜单选择',
width: "380",
height: "380",
url: url,
callBack: doSubmit
};
@@ -164,8 +164,7 @@
if(menuId > 0) {
var url = prefix + "/selectMenuTree/" + menuId;
$.modal.open("选择菜单", url, '380', '380');
}
else {
} else {
$.modal.alertError("主菜单不能选择");
}
}
@@ -177,13 +176,11 @@
var options = {
title: '菜单选择',
width: "380",
height: "380",
url: url,
callBack: doSubmit
};
$.modal.openOptions(options);
}
else {
} else {
$.modal.alertError("主菜单不能选择");
}
}
@@ -40,7 +40,7 @@
</a>
</div>
<div class="col-sm-12 select-table table-striped">
<table id="bootstrap-table" data-mobile-responsive="true"></table>
<table id="bootstrap-tree-table" data-mobile-responsive="true"></table>
</div>
</div>
</div>
@@ -55,9 +55,11 @@
$(function() {
var options = {
id: "menuId",
parentId: "parentId",
code: "menuId",
parentCode: "parentId",
uniqueId: "menuId",
expandAll: false,
expandFirst: true,
url: prefix + "/list",
createUrl: prefix + "/add/{id}",
updateUrl: prefix + "/edit/{id}",
@@ -37,12 +37,6 @@
</div>
</div>
</div>
<div class="form-group">
<div class="form-control-static col-sm-offset-9">
<button type="submit" class="btn btn-primary">提交</button>
<button onclick="$.modal.close()" class="btn btn-danger" type="button">关闭</button>
</div>
</div>
</form>
</div>
<div th:include="include::footer"></div>
@@ -50,24 +44,57 @@
<script th:src="@{/ajax/libs/summernote/summernote-zh-CN.js}"></script>
<script type="text/javascript">
var prefix = ctx + "system/notice";
$('.summernote').summernote({
height : '220px',
lang : 'zh-CN'
lang : 'zh-CN',
callbacks: {
onImageUpload: function (files) {
sendFile(files[0], this);
}
}
});
// 上传文件
function sendFile(file, obj) {
var data = new FormData();
data.append("file", file);
$.ajax({
type: "POST",
url: ctx + "common/upload",
data: data,
cache: false,
contentType: false,
processData: false,
dataType: 'json',
success: function(result) {
if (result.code == web_status.SUCCESS) {
$(obj).summernote('editor.insertImage', result.url, result.fileName);
} else {
$.modal.alertError(result.msg);
}
},
error: function(error) {
$.modal.alertWarning("图片上传失败。");
}
});
}
$("#form-notice-add").validate({
rules:{
noticeTitle:{
required:true,
}
},
submitHandler: function(form) {
var sHTML = $('.summernote').code();
$("#noticeContent").val(sHTML);
$.operate.save(prefix + "/add", $('#form-notice-add').serialize());
}
});
function submitHandler() {
if ($.validate.form()) {
var sHTML = $('.summernote').summernote('code');
$("#noticeContent").val(sHTML);
$.operate.save(prefix + "/add", $('#form-notice-add').serialize());
}
}
</script>
</body>
</html>
@@ -38,12 +38,6 @@
</div>
</div>
</div>
<div class="form-group">
<div class="form-control-static col-sm-offset-9">
<button type="submit" class="btn btn-primary">提交</button>
<button onclick="$.modal.close()" class="btn btn-danger" type="button">关闭</button>
</div>
</div>
</form>
</div>
<div th:include="include::footer"></div>
@@ -54,25 +48,58 @@
$(function() {
$('.summernote').summernote({
height : '220px',
lang : 'zh-CN'
height : '220px',
lang : 'zh-CN',
callbacks: {
onImageUpload: function (files) {
sendFile(files[0], this);
}
}
});
var content = $("#noticeContent").val();
$('#editor').code(content);
$('#editor').summernote('code', content);
});
// 上传文件
function sendFile(file, obj) {
var data = new FormData();
data.append("file", file);
$.ajax({
type: "POST",
url: ctx + "common/upload",
data: data,
cache: false,
contentType: false,
processData: false,
dataType: 'json',
success: function(result) {
if (result.code == web_status.SUCCESS) {
$(obj).summernote('editor.insertImage', result.url, result.fileName);
} else {
$.modal.alertError(result.msg);
}
},
error: function(error) {
$.modal.alertWarning("图片上传失败。");
}
});
}
$("#form-notice-edit").validate({
rules:{
xxxx:{
noticeTitle:{
required:true,
},
},
submitHandler: function(form) {
var sHTML = $('.summernote').code();
$("#noticeContent").val(sHTML);
$.operate.save(prefix + "/edit", $('#form-notice-edit').serialize());
}
}
});
function submitHandler() {
if ($.validate.form()) {
var sHTML = $('.summernote').summernote('code');
$("#noticeContent").val(sHTML);
$.operate.save(prefix + "/edit", $('#form-notice-edit').serialize());
}
}
</script>
</body>
</html>
@@ -143,7 +143,7 @@
$.modal.alertError("系统错误");
},
success : function(data) {
$.operate.saveSuccess(data);
$.operate.successCallback(data);
}
});
}
@@ -146,7 +146,7 @@
$.modal.alertError("系统错误");
},
success : function(data) {
$.operate.saveSuccess(data);
$.operate.successCallback(data);
}
});
}
@@ -100,12 +100,12 @@
sortable: true
},
{
field: 'status',
title: '状态',
align: 'center',
formatter: function(value, row, index) {
return $.table.selectDictLabel(datas, value);
}
visible: editFlag == 'hidden' ? false : true,
title: '角色状态',
align: 'center',
formatter: function (value, row, index) {
return statusTools(row);
}
},
{
field: 'createTime',
@@ -127,11 +127,34 @@
$.table.init(options);
});
/*角色管理-分配数据权限*/
/* 角色管理-分配数据权限 */
function rule(roleId) {
var url = prefix + '/rule/' + roleId;
$.modal.open("分配数据权限", url);
}
/* 角色状态显示 */
function statusTools(row) {
if (row.status == 1) {
return '<i class=\"fa fa-toggle-off text-info fa-2x\" onclick="enable(\'' + row.roleId + '\')"></i> ';
} else {
return '<i class=\"fa fa-toggle-on text-info fa-2x\" onclick="disable(\'' + row.roleId + '\')"></i> ';
}
}
/* 角色管理-停用 */
function disable(roleId) {
$.modal.confirm("确认要停用角色吗?", function() {
$.operate.post(prefix + "/changeStatus", { "roleId": roleId, "status": 1 });
})
}
/* 角色管理启用 */
function enable(roleId) {
$.modal.confirm("确认要启用角色吗?", function() {
$.operate.post(prefix + "/changeStatus", { "roleId": roleId, "status": 0 });
})
}
</script>
</body>
</html>
@@ -29,7 +29,7 @@
<span class="help-block m-b-none"><i class="fa fa-info-circle"></i> 特殊情况下,设置为“自定数据权限”</span>
</div>
</div>
<div class="form-group" id="roleRule" style="display: none">
<div class="form-group" id="roleRule" th:style="'display:' + @{(*{dataScope=='1'} ? 'none' : 'block')} + ''">
<label class="col-sm-3 control-label">数据权限</label>
<div class="col-sm-8">
<div id="deptTrees" class="ztree"></div>
@@ -50,7 +50,6 @@
expandLevel: 2
};
$.tree.init(options);
$("#dataScope").change();
});
function submitHandler() {
@@ -81,7 +80,7 @@
$.modal.alertError("系统错误");
},
success : function(data) {
$.operate.saveSuccess(data);
$.operate.successCallback(data);
}
});
}
@@ -203,7 +203,7 @@
$.modal.alertError("系统错误");
},
success : function(data) {
$.operate.saveSuccess(data);
$.operate.successCallback(data);
}
});
}
@@ -216,7 +216,6 @@
var options = {
title: '选择部门',
width: "380",
height: "380",
url: ctx + "system/dept/selectDeptTree/" + deptId,
callBack: doSubmit
};
@@ -177,19 +177,18 @@
$.modal.alertError("系统错误");
},
success : function(data) {
$.operate.saveSuccess(data);
$.operate.successCallback(data);
}
});
}
/*用户管理-修改-选择部门树*/
function selectDeptTree() {
var deptId = $("#treeId").val();
var deptId = $.common.isEmpty($("#treeId").val()) ? "100" : $("#treeId").val();
var url = ctx + "system/dept/selectDeptTree/" + deptId;
var options = {
title: '选择部门',
width: "380",
height: "380",
url: url,
callBack: doSubmit
};
@@ -4,7 +4,6 @@
<title>用户头像修改</title>
<link th:href="@{/ajax/libs/cropbox/cropbox.css}" rel="stylesheet"/>
<body class="white-bg">
<input name="userId" id="userId" type="hidden" th:value="${user.userId}" />
<div class="container">
<div class="imageBox">
<div class="thumbBox"></div>
@@ -18,13 +17,13 @@
<input type="button" id="btnCrop" class="Btnsty_peyton" value="裁切" />
<input type="button" id="btnZoomIn" class="Btnsty_peyton" value="+" />
<input type="button" id="btnZoomOut" class="Btnsty_peyton" value="-" />
<input type="button" id="blobSubmit" class="Btnsty_peyton" value="提交" />
</div>
<div class="cropped"></div>
</div>
<div th:include="include::footer"></div>
<script th:src="@{/ajax/libs/cropbox/cropbox.js}"></script>
<script type="text/javascript">
var cropper;
$(window).load(function() {
var avatar = '[[${user.avatar}]]';
var options = {
@@ -32,37 +31,21 @@ $(window).load(function() {
spinner: '.spinner',
imgSrc: $.common.isEmpty(avatar) ? ctx + 'img/profile.jpg' : ctx + 'profile/avatar/' + avatar
}
var cropper = $('.imageBox').cropbox(options);
$('#avatar').on('change',
function() {
cropper = $('.imageBox').cropbox(options);
$('#avatar').on('change', function() {
var reader = new FileReader();
reader.onload = function(e) {
options.imgSrc = e.target.result;
//根据MIME判断上传的文件是不是图片类型
if((options.imgSrc).indexOf("image/")==-1){
parent.layer.alert("文件格式错误,请上传图片类型,如:JPG,JEPG,PNG后缀的文件。", {icon: 2,title:"系统提示"});
$.modal.alertWarning("文件格式错误,请上传图片类型,如:JPG,JEPG,PNG后缀的文件。");
} else {
cropper = $('.imageBox').cropbox(options);
}
}
reader.readAsDataURL(this.files[0]);
})
$('#blobSubmit').on('click', function(){
var img = cropper.getBlob();
var formdata = new FormData();
formdata.append("avatarfile", img);
formdata.append("userId", $("#userId").val());
$.ajax({
url: ctx + "system/user/profile/updateAvatar",
data: formdata,
type: "post",
processData: false,
contentType: false,
success: function(result) {
$.operate.saveSuccess(result);
}
})
})
$('#btnCrop').on('click', function(){
var img = cropper.getDataURL();
$('.cropped').html('');
@@ -70,13 +53,31 @@ $(window).load(function() {
$('.cropped').append('<img src="'+img+'" align="absmiddle" style="width:128px;margin-top:4px;border-radius:128px;box-shadow:0px 0px 12px #7E7E7E;"><p>128px*128px</p>');
$('.cropped').append('<img src="'+img+'" align="absmiddle" style="width:180px;margin-top:4px;border-radius:180px;box-shadow:0px 0px 12px #7E7E7E;"><p>180px*180px</p>');
})
$('#btnZoomIn').on('click', function(){
cropper.zoomIn();
})
$('#btnZoomOut').on('click', function(){
cropper.zoomOut();
})
});
function submitHandler() {
var img = cropper.getBlob();
var formdata = new FormData();
formdata.append("avatarfile", img);
$.ajax({
url: ctx + "system/user/profile/updateAvatar",
data: formdata,
type: "post",
processData: false,
contentType: false,
success: function(result) {
$.operate.saveSuccess(result);
}
})
}
</script>
</body>
</html>
@@ -58,20 +58,19 @@
<div th:include="include::footer"></div>
<script>
var userId = [[${user.userId}]];
/*用户信息-修改*/
function edit() {
var url = ctx + "system/user/profile/edit/" + userId;
var url = ctx + 'system/user/profile/edit';
$.modal.open("修改用户", url);
}
/*用户管理-重置密码*/
function resetPwd() {
var url = ctx + 'system/user/profile/resetPwd/' + userId;
var url = ctx + 'system/user/profile/resetPwd';
$.modal.open("重置密码", url, '800', '500');
}
/*用户管理-头像*/
function avatar() {
var url = ctx + 'system/user/profile/avatar/' + userId;
var url = ctx + 'system/user/profile/avatar';
$.modal.open("修改头像", url);
}
</script>
@@ -21,7 +21,7 @@
<div class="form-group">
<label class="col-sm-3 control-label">新密码:</label>
<div class="col-sm-8">
<input class="form-control" type="password" name="password" id="password">
<input class="form-control" type="password" name="newPassword" id="newPassword">
</div>
</div>
<div class="form-group">
@@ -51,14 +51,14 @@
}
}
},
password: {
newPassword: {
required: true,
minlength: 5,
maxlength: 20
},
confirm: {
required: true,
equalTo: "#password"
equalTo: "#newPassword"
}
},
messages: {
@@ -66,7 +66,7 @@
required: "请输入原密码",
remote: "原密码错误"
},
password: {
newPassword: {
required: "请输入新密码",
minlength: "密码不能小于6个字符",
maxlength: "密码不能大于20个字符"
@@ -73,6 +73,9 @@
<a class="btn btn-danger btn-del disabled" onclick="$.operate.removeAll()" shiro:hasPermission="system:user:remove">
<i class="fa fa-remove"></i> 删除
</a>
<a class="btn btn-info" onclick="$.table.importExcel()" shiro:hasPermission="system:user:import">
<i class="fa fa-download"></i> 导入
</a>
<a class="btn btn-warning" onclick="$.table.exportExcel()" shiro:hasPermission="system:user:export">
<i class="fa fa-download"></i> 导出
</a>
@@ -83,6 +86,7 @@
</div>
</div>
</div>
<div th:include="include :: footer"></div>
<script th:src="@{/ajax/libs/jquery-layout/jquery.layout-latest.js}"></script>
<script th:src="@{/ajax/libs/jquery-ztree/3.5/js/jquery.ztree.all-3.5.js}"></script>
@@ -94,9 +98,13 @@
var prefix = ctx + "system/user";
$(function() {
$('body').layout({ west__size: 185 });
queryUserList();
queryDeptTree();
var panehHidden = false;
if ($(this).width() < 769) {
panehHidden = true;
}
$('body').layout({ initClosed: panehHidden, west__size: 185 });
queryUserList();
queryDeptTree();
});
function queryUserList() {
@@ -106,6 +114,8 @@
updateUrl: prefix + "/edit/{id}",
removeUrl: prefix + "/remove",
exportUrl: prefix + "/export",
importUrl: prefix + "/importData",
importTemplateUrl: prefix + "/importTemplate",
sortName: "createTime",
sortOrder: "desc",
modalName: "用户",
@@ -141,12 +151,12 @@
title: '手机'
},
{
field: 'status',
title: '状态',
align: 'center',
formatter: function(value, row, index) {
return $.table.selectDictLabel(datas, value);
}
visible: editFlag == 'hidden' ? false : true,
title: '用户状态',
align: 'center',
formatter: function (value, row, index) {
return statusTools(row);
}
},
{
field: 'createTime',
@@ -201,17 +211,52 @@
queryDeptTree();
});
/*用户管理-部门*/
/* 用户管理-部门 */
function dept() {
var url = ctx + "system/dept";
createMenuItem(url, "部门管理");
}
/*用户管理-重置密码*/
/* 用户管理-重置密码 */
function resetPwd(userId) {
var url = prefix + '/resetPwd/' + userId;
$.modal.open("重置密码", url, '800', '300');
}
/* 用户状态显示 */
function statusTools(row) {
if (row.status == 1) {
return '<i class=\"fa fa-toggle-off text-info fa-2x\" onclick="enable(\'' + row.userId + '\')"></i> ';
} else {
return '<i class=\"fa fa-toggle-on text-info fa-2x\" onclick="disable(\'' + row.userId + '\')"></i> ';
}
}
/* 用户管理-停用 */
function disable(userId) {
$.modal.confirm("确认要停用用户吗?", function() {
$.operate.post(prefix + "/changeStatus", { "userId": userId, "status": 1 });
})
}
/* 用户管理启用 */
function enable(userId) {
$.modal.confirm("确认要启用用户吗?", function() {
$.operate.post(prefix + "/changeStatus", { "userId": userId, "status": 0 });
})
}
</script>
</body>
<form id="importForm" enctype="multipart/form-data" class="mt20 mb10" style="display: none;">
<div class="col-xs-offset-1">
<input type="file" id="file" name="file"/>
<div class="mt10 pt5">
<input type="checkbox" id="updateSupport" name="updateSupport" title="如果登录账户已经存在,更新这条数据。"> 是否更新已经存在的用户数据
&nbsp; <a onclick="$.table.importTemplate()" class="btn btn-default btn-xs"><i class="fa fa-file-excel-o"></i> 下载模板</a>
</div>
<font color="red" class="pull-left mt10">
提示:仅允许导入“xls”或“xlsx”格式文件!
</font>
</div>
</form>
</html>
@@ -55,6 +55,12 @@
columns: [{
checkbox: true
},
{
title: "序号",
formatter: function (value, row, index) {
return $.table.serialNumber(index);
}
},
{
field: 'tableName',
title: '表名称',
@@ -1,39 +0,0 @@
<!DOCTYPE HTML>
<html lang="zh" xmlns:th="http://www.thymeleaf.org">
<meta charset="utf-8">
<head th:include="include :: header"></head>
<body class="white-bg">
<div class="wrapper wrapper-content animated fadeInRight ibox-content">
<form class="form-horizontal m" id="form-${classname}-edit" th:object="${${classname}}">
<input id="${primaryKey.attrname}" name="${primaryKey.attrname}" th:field="*{${primaryKey.attrname}}" type="hidden">
#foreach($column in $columns)
#if($column.columnName != $primaryKey.columnName)
<div class="form-group">
<label class="col-sm-3 control-label">${column.columnComment}</label>
<div class="col-sm-8">
<input id="${column.attrname}" name="${column.attrname}" th:field="*{${column.attrname}}" class="form-control" type="text">
</div>
</div>
#end
#end
</form>
</div>
<div th:include="include::footer"></div>
<script type="text/javascript">
var prefix = ctx + "${moduleName}/${classname}"
$("#form-${classname}-edit").validate({
rules:{
xxxx:{
required:true,
},
}
});
function submitHandler() {
if ($.validate.form()) {
$.operate.save(prefix + "/edit", $('#form-${classname}-edit').serialize());
}
}
</script>
</body>
</html>
@@ -1,60 +0,0 @@
<!DOCTYPE HTML>
<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
<meta charset="utf-8">
<head th:include="include :: header"></head>
<body class="gray-bg">
<div class="container-div">
<div class="btn-group-sm hidden-xs" id="toolbar" role="group">
<a class="btn btn-success" onclick="$.operate.add()" shiro:hasPermission="${moduleName}:${classname}:add">
<i class="fa fa-plus"></i> 添加
</a>
<a class="btn btn-primary btn-edit disabled" onclick="$.operate.edit()" shiro:hasPermission="${moduleName}:${classname}:edit">
<i class="fa fa-edit"></i> 修改
</a>
<a class="btn btn-danger btn-del btn-del disabled" onclick="$.operate.removeAll()" shiro:hasPermission="${moduleName}:${classname}:remove">
<i class="fa fa-remove"></i> 删除
</a>
</div>
<div class="col-sm-12 select-table table-striped">
<table id="bootstrap-table" data-mobile-responsive="true"></table>
</div>
</div>
<div th:include="include :: footer"></div>
<script th:inline="javascript">
var editFlag = [[${@permission.hasPermi('${moduleName}:${classname}:edit')}]];
var removeFlag = [[${@permission.hasPermi('${moduleName}:${classname}:remove')}]];
var prefix = ctx + "${moduleName}/${classname}";
$(function() {
var options = {
url: prefix + "/list",
createUrl: prefix + "/add",
updateUrl: prefix + "/edit/{id}",
removeUrl: prefix + "/remove",
modalName: "${tableComment}",
columns: [{
checkbox: true
},
#foreach($column in $columns)
{
field : '${column.attrname}',
title : '${column.columnComment}'
},
#end
{
title: '操作',
align: 'center',
formatter: function(value, row, index) {
var actions = [];
actions.push('<a class="btn btn-success btn-xs ' + editFlag + '" href="#" onclick="$.operate.edit(\'' + row.${primaryKey.attrname} + '\')"><i class="fa fa-edit"></i>编辑</a> ');
actions.push('<a class="btn btn-danger btn-xs ' + removeFlag + '" href="#" onclick="$.operate.remove(\'' + row.${primaryKey.attrname} + '\')"><i class="fa fa-remove"></i>删除</a>');
return actions.join('');
}
}]
};
$.table.init(options);
});
</script>
</body>
</html>
+1 -1
View File
@@ -5,7 +5,7 @@
<parent>
<artifactId>ruoyi</artifactId>
<groupId>com.ruoyi</groupId>
<version>3.0</version>
<version>3.2</version>
</parent>
<modelVersion>4.0.0</modelVersion>

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